Compare commits
241 commits
master
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
|
558a231a13 | ||
|
3dc65ba614 | ||
|
0a9a1e25b8 | ||
|
482db6b458 | ||
|
0b1d486568 | ||
|
99c118136b | ||
|
d2459bb368 | ||
|
385916fd13 | ||
|
62756e27c7 | ||
|
0d40fac125 | ||
|
c44a317291 | ||
|
be91b51038 | ||
|
5adb9f2f7e | ||
|
adddf96af5 | ||
|
d069678465 | ||
|
2fe61699aa | ||
|
53dae52ecb | ||
|
33dff0e240 | ||
|
3b3b5c0429 | ||
|
0468ab7f14 | ||
|
1012f68044 | ||
|
585eb48cad | ||
|
73b9604f5d | ||
|
f162e3a203 | ||
|
cdd5782864 | ||
|
e95642a890 | ||
|
9445a05944 | ||
|
739cd03b1d | ||
|
5aafadda16 | ||
|
03537c7353 | ||
|
0419508892 | ||
|
60af778a01 | ||
|
b38871d185 | ||
|
98c3187047 | ||
|
49f5340ada | ||
|
dfcf33773e | ||
|
2bad9cfdd2 | ||
|
c746a535e3 | ||
|
34fbbeed53 | ||
|
f7f530f9e0 | ||
|
5f3ed9032b | ||
|
fcba672095 | ||
|
0e32fcbe1d | ||
|
ef9a779720 | ||
|
ec47c8fd5f | ||
|
7cfdd8efb6 | ||
|
3530814620 | ||
|
3183821d09 | ||
|
a37ebaa8e6 | ||
|
bfef646388 | ||
|
5d9a9d6e7f | ||
|
c64b5ebfd9 | ||
|
9a699f8d15 | ||
|
9c48629d64 | ||
|
8b10fbc3a1 | ||
|
e9910211c8 | ||
|
86d88abf59 | ||
|
65c53ab18b | ||
|
7ec71685d6 | ||
|
4011f1ea6f | ||
|
d14434c607 | ||
|
4b89904edb | ||
|
31d16a0542 | ||
|
40849ebe5f | ||
|
619068cfc9 | ||
|
ee60355872 | ||
|
bd653f8150 | ||
|
d3ad0e277e | ||
|
89fa633402 | ||
|
c0116871a6 | ||
|
6a51107ae1 | ||
|
f6d3643ebb | ||
|
2a5d0ac5c9 | ||
|
f5f620d183 | ||
|
69a0d935d9 | ||
|
1ed61fec32 | ||
|
e2d89e3012 | ||
|
cf458d63c9 | ||
|
79ce9cd629 | ||
|
4722d6e917 | ||
|
432dd128e4 | ||
|
12157bf17d | ||
|
c27d0b332d | ||
|
7834147dc6 | ||
|
2e69a8f550 | ||
|
268bdb1cc1 | ||
|
2a9137296f | ||
|
2ada4fdd9b | ||
|
f4a253ef63 | ||
|
6450125a74 | ||
|
13be73d999 | ||
|
84063eb26e | ||
|
75823323ed | ||
|
17349bcd15 | ||
|
6a44c15be5 | ||
|
30606315b4 | ||
|
2ec93d3f0f | ||
|
a304f049b3 | ||
|
b8cfbcff8f | ||
|
f6513ee758 | ||
|
9a001803a5 | ||
|
2fd06952d1 | ||
|
cc3fe2e639 | ||
|
aa3a251d43 | ||
|
8915c4f95b | ||
|
d95716b5de | ||
|
6848868c27 | ||
|
9797c48fd7 | ||
|
9289f20b49 | ||
|
daddb89773 | ||
|
0f38978e54 | ||
|
9d68aabeb7 | ||
|
10ab421d01 | ||
|
6fb707a2a2 | ||
|
be8f728aaa | ||
|
24ea7c9a31 | ||
|
1358a199de | ||
|
f9e2e9d635 | ||
|
bacb61113e | ||
|
52001505d8 | ||
|
92435d924a | ||
|
65296278a3 | ||
|
1e4e388318 | ||
|
4c8d994db9 | ||
|
43816f4915 | ||
|
51bddc2dc9 | ||
|
2a55f0a351 | ||
|
22b2aca10e | ||
|
2af6c8e18c | ||
|
3c92462fd1 | ||
|
7bcb619015 | ||
|
935338957d | ||
|
32a4452933 | ||
|
ebf84b70dd | ||
|
2d2ab89a1d | ||
|
6b5b916b0d | ||
|
88ccf13d13 | ||
|
f1107d9179 | ||
|
a0395a876c | ||
|
10b93c9102 | ||
|
24f42ead23 | ||
|
e883b665af | ||
|
27d3e5f271 | ||
|
576d64cb8d | ||
|
d3b8d75c1b | ||
|
536d584388 | ||
|
3e7810109a | ||
|
4fbac0bf45 | ||
|
a144a3d025 | ||
|
d070d0ddfd | ||
|
b17574196b | ||
|
0ea790c9ae | ||
|
b120a012d2 | ||
|
2dc670fd22 | ||
|
a198a2d80f | ||
|
3ce0d260d0 | ||
|
3a156ea6be | ||
|
31327331d9 | ||
|
749c11c06b | ||
|
c6a106ad29 | ||
|
98838b4428 | ||
|
357970bfe2 | ||
|
db2fe20ace | ||
|
87f0994d7a | ||
|
9e136b5ec7 | ||
|
214b58fbad | ||
|
27002e9323 | ||
|
b3c3a9ad47 | ||
|
372defa7ba | ||
|
d969c7e221 | ||
|
8b407756dc | ||
|
cb20c837f4 | ||
|
0855a63e16 | ||
|
b360c13391 | ||
|
64941faf12 | ||
|
ebb3fc7478 | ||
|
9a1cd1510c | ||
|
275142c73d | ||
|
8bc3ad08b2 | ||
|
a258df05a0 | ||
|
320270a127 | ||
|
ac32d0c5f9 | ||
|
776d4072e8 | ||
|
574cd41a99 | ||
|
4f0435f4d2 | ||
|
55d74eb418 | ||
|
cafb1ab206 | ||
|
880be03a0d | ||
|
7a80023487 | ||
|
8ab5a93d38 | ||
|
ae2275c2b4 | ||
|
8061a35dcf | ||
|
6bde134187 | ||
|
72c5d1e8ab | ||
|
c3143b8b9c | ||
|
92643bac52 | ||
|
23fc5d0035 | ||
|
eb72e866d7 | ||
|
74852e1d64 | ||
|
79b94d85d1 | ||
|
ca282f044b | ||
|
876d68b4c9 | ||
|
239244f867 | ||
|
fce9244441 | ||
|
0a1cd99daf | ||
|
b894bd1a3c | ||
|
4ab10dce94 | ||
|
64fd559c0d | ||
|
654f1950a3 | ||
|
29285b1030 | ||
|
fd8b91f982 | ||
|
e37cb653ba | ||
|
045a682ec0 | ||
|
2f28b8c5d0 | ||
|
dd8038b0e4 | ||
|
8460b069f6 | ||
|
6a16eb68dc | ||
|
0b9d71091e | ||
|
66bd610f04 | ||
|
a71237840f | ||
|
9cc61d56c8 | ||
|
f31a930c98 | ||
|
336e30592d | ||
|
75df00ebdf | ||
|
c588ef3271 | ||
|
bd51c73283 | ||
|
ca12676b88 | ||
|
fc46c0ae5d | ||
|
e5b239feec | ||
|
faf3d7ce00 | ||
|
8eba29d834 | ||
|
7cfc406eb8 | ||
|
d49f3ac1d0 | ||
|
8d211fac77 | ||
|
473f24de3d | ||
|
b601827c97 | ||
|
212dbcb764 | ||
|
d5e84bbf7c | ||
|
ce0491587b | ||
|
96afe9541c | ||
|
c156efb73d |
237 changed files with 16871 additions and 9260 deletions
202
BUGS
202
BUGS
|
@ -1,204 +1,18 @@
|
||||||
|
|
||||||
All:
|
Bugs are now managed in the SDL bug tracker, here:
|
||||||
Audio rate conversion is only implemented by multiplying or dividing
|
|
||||||
by a power of two. This is a side-effect of the requirement that the
|
|
||||||
raw audio buffer size be a power of two, and can hopefully be fixed.
|
|
||||||
This means 8 KHz audio converted to 22 KHz ends up being 16 KHz. :-/
|
|
||||||
|
|
||||||
When the implementation is writing directly to video memory the mouse
|
http://bugzilla.libsdl.org/
|
||||||
cursor doesn't work properly. Applications which do this should use
|
|
||||||
their own mouse cursor and call SDL_ShowCursor(0) to hide the system
|
|
||||||
cursor.
|
|
||||||
|
|
||||||
Linux:
|
You may report bugs there, and search to see if a given issue has already
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
been reported, discussed, and maybe even fixed.
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
The AAlib, GGI, and SVGAlib video drivers are not heavily tested.
|
|
||||||
|
|
||||||
Win32:
|
You may also find help at the SDL mailing list. Subscription information:
|
||||||
The MCI driver can't tell if the CD-ROM drive is paused or stopped.
|
|
||||||
|
|
||||||
The SDL_INIT_EVENTTHREAD flag is not supported on Win32
|
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
|
||||||
(Idea: create a separate DirectInput polling thread)
|
|
||||||
The main purpose of this flag is for smooth cursor motion in
|
|
||||||
fullscreen environments.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
Bug reports are welcome here, but we really appreciate if you use Bugzilla, as
|
||||||
This requires the ToUnicode() API which is only implemented on
|
bugs discussed on the mailing list may be forgotten or missed.
|
||||||
Windows NT/2000, not on Windows 95/98.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
|
|
||||||
Joysticks are only supported under the Win32 MultiMedia API,
|
|
||||||
DirectInput support is not yet implemented.
|
|
||||||
|
|
||||||
BeOS:
|
|
||||||
BePPC is not supported, apparently not even by Be Inc.
|
|
||||||
|
|
||||||
SDL_WM_GrabInput() is not implemented.
|
|
||||||
Does anyone know how to do this? SDL_WM_GrabInput() is designed
|
|
||||||
to prevent the user from switching input and mouse focus away from
|
|
||||||
the SDL application.
|
|
||||||
|
|
||||||
Continuous relative mouse motion is not implemented.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) has not been tested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
|
|
||||||
MacOS:
|
|
||||||
Palette handling isn't implemented in windowed mode yet.
|
|
||||||
|
|
||||||
Audio hasn't been extensively tested, in particular the locking
|
|
||||||
isn't implemented and mixer routines may not call malloc() or free()
|
|
||||||
because they are called at interrupt time.
|
|
||||||
|
|
||||||
SDL_WM_GrabInput() is not implemented.
|
|
||||||
Does anyone know how to do this? SDL_WM_GrabInput() is designed
|
|
||||||
to prevent the user from switching input and mouse focus away from
|
|
||||||
the SDL application.
|
|
||||||
|
|
||||||
Continuous relative mouse motion is not implemented.
|
|
||||||
|
|
||||||
SDL_AddTimer() and SDL_RemoveTimer() haven't been implemented yet.
|
|
||||||
|
|
||||||
Not all of the keys are properly recognized on the keyboard.
|
|
||||||
|
|
||||||
Mac OS X:
|
|
||||||
Depth switching for windowed mode isn't implemented yet.
|
|
||||||
|
|
||||||
Palette handling isn't implemented in windowed mode yet.
|
|
||||||
|
|
||||||
Command-line arguments dialog is not implemented yet.
|
|
||||||
|
|
||||||
Fullscreen drawing has some artifacts.
|
|
||||||
|
|
||||||
Fullscreen OpenGL for the software renderer is broken.
|
|
||||||
|
|
||||||
Some OpenGL parameters are not accounted for, for example color bits customization.
|
|
||||||
|
|
||||||
Continuous mouse motion perhaps is not as smooth as it should be.
|
|
||||||
|
|
||||||
SDL_WM_GrabInput() is implemented, but it "freezes" the hardware
|
|
||||||
cursor in the center of the window/screen. Also, mouse moved events
|
|
||||||
are not generated, and the keyboard cannot be grabbed.
|
|
||||||
|
|
||||||
Mac OS X seems to have a broken pthread_cancel() implementation.
|
|
||||||
Actually, it just only has one cancellation point defined.
|
|
||||||
http://lists.apple.com/archives/darwin-development/2004/Jun/24/killingapthread.001.txt
|
|
||||||
|
|
||||||
FreeBSD:
|
|
||||||
pthread_cancel() isn't supported by FreeBSD 3.X, so threads don't
|
|
||||||
work on versions of FreeBSD earlier than 4.0.
|
|
||||||
|
|
||||||
The CD-ROM handling doesn't work completely.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed but needs testing)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
Solaris:
|
|
||||||
The joystick functions are not implemented yet.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed but needs testing)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
IRIX:
|
|
||||||
The CD-ROM handling doesn't work completely.
|
|
||||||
|
|
||||||
The joystick functions are not implemented yet.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed but needs testing)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
EPOC:
|
|
||||||
Only Crystal version of Epoc/SymbianOS is currently supported.
|
|
||||||
|
|
||||||
SDL is implemented in static library only. SDL uses static/global
|
|
||||||
variables and that is not allowed in EPOC dll libraries.
|
|
||||||
|
|
||||||
Sound is not yet supported.
|
|
||||||
|
|
||||||
Joystick, OpenGL and cdrom is not supported (think about cdrom in a cell phone:-).
|
|
||||||
|
|
||||||
No console output screen. Printing to stdout do not have any effect.
|
|
||||||
|
|
||||||
QNX:
|
|
||||||
Fullscreen switch doesn't work (disabled for now).
|
|
||||||
|
|
||||||
|
|
||||||
OpenBSD: -= NOT YET SUPPORTED =-
|
|
||||||
This is reported to work, but I haven't verified this.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed but needs testing)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
OSF/Tru64: -= NOT YET SUPPORTED =-
|
|
||||||
The audio functions are not implemented yet.
|
|
||||||
|
|
||||||
Joysticks and CD-ROM functions are not implemented yet.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed but needs testing)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
AIX: -= NOT YET SUPPORTED =-
|
|
||||||
This port has only been tested with AIX 4.3.3
|
|
||||||
|
|
||||||
The OpenGL support doesn't work yet.
|
|
||||||
|
|
||||||
The joystick subsystem isn't implemented yet.
|
|
||||||
|
|
||||||
Endian detection doesn't work yet - needs a unique CPP symbol.
|
|
||||||
|
|
||||||
Wide UNICODE character input (Kanji, etc.) is not yet supported.
|
|
||||||
It requires handling of keyboard mapping events and using the XIM
|
|
||||||
input translation extension. I will implement it as requested.
|
|
||||||
Latin-1 keyboard input works fine.
|
|
||||||
(UPDATE 04/06/2004: this bug is now fixed but needs testing)
|
|
||||||
|
|
||||||
The keyboard modifiers are not set to the correct state on startup.
|
|
||||||
|
|
||||||
The AIX port was done by Carsten.Griwodz@KOM.tu-darmstadt.de
|
|
||||||
More information on this port is available at:
|
|
||||||
http://www.kom.e-technik.tu-darmstadt.de/~griff/SDL/
|
|
||||||
|
|
||||||
AmigaOS: -= NOT YET SUPPORTED =-
|
|
||||||
The OpenGL support isn't implemented yet.
|
|
||||||
|
|
||||||
SDL_WM_GrabInput() is not implemented.
|
|
||||||
Does anyone know how to do this? SDL_WM_GrabInput() is designed
|
|
||||||
to prevent the user from switching input and mouse focus away from
|
|
||||||
the SDL application.
|
|
||||||
|
|
||||||
Continuous relative mouse motion is not implemented.
|
|
||||||
|
|
||||||
The AmigaOS port was done by Gabriele.Greco@galactica.it
|
|
||||||
|
|
||||||
|
|
2
CREDITS
2
CREDITS
|
@ -40,6 +40,8 @@ Thanks to everyone who made this possible, including:
|
||||||
|
|
||||||
* Hannu Viitala for the EPOC port
|
* Hannu Viitala for the EPOC port
|
||||||
|
|
||||||
|
* Marcus Mertama for the S60 port.
|
||||||
|
|
||||||
* Peter Valchev for nagging me about the OpenBSD port until I got it right. :)
|
* Peter Valchev for nagging me about the OpenBSD port until I got it right. :)
|
||||||
|
|
||||||
* Kent B Mein, for a place to do the IRIX port
|
* Kent B Mein, for a place to do the IRIX port
|
||||||
|
|
Binary file not shown.
63
Makefile.ds
Normal file
63
Makefile.ds
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
#LibSDL 1.2.12
|
||||||
|
#DS porting by Troy Davis(GPF)
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(DEVKITARM)),)
|
||||||
|
DEVKITARM := $(DEVKITPRO)/devkitARM
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
SRCS = $(shell echo ./src/*.c ./src/audio/*.c ./src/cdrom/*.c ./src/cpuinfo/*.c ./src/events/*.c ./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c ./src/joystick/*.c ./src/joystick/nds/*.c ./src/cdrom/dummy/*.c ./src/thread/generic/*.c ./src/timer/nds/*.c ./src/loadso/dummy/*.c ./src/audio/dummy/*.c ./src/audio/nds/*.c ./src/video/dummy/*.c ./src/video/nds/*.c)
|
||||||
|
|
||||||
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
|
|
||||||
|
SUBDIRS=
|
||||||
|
|
||||||
|
CC=arm-eabi-gcc
|
||||||
|
CXX=arm-eabi-g++
|
||||||
|
LDSHARED=$(CXX)
|
||||||
|
AR=arm-eabi-ar rc
|
||||||
|
RANLIB=arm-eabi-ranlib
|
||||||
|
|
||||||
|
CFLAGS = -mthumb -mthumb-interwork \
|
||||||
|
-march=armv5te -mtune=arm946e-s \
|
||||||
|
-O2 -Wall -Wwrite-strings -Wpointer-arith \
|
||||||
|
-DARM9 -D__NDS__ -I$(DEVKITPRO)/libnds/include -Iinclude
|
||||||
|
|
||||||
|
CXXFLAGS += $(CFLAGS)
|
||||||
|
|
||||||
|
all: $(DEVKITPRO)/libnds/lib/libSDL.a
|
||||||
|
|
||||||
|
|
||||||
|
$(DEVKITPRO)/libnds/lib/libSDL.a: $(OBJS)
|
||||||
|
$(AR) $@ $(OBJS)
|
||||||
|
-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
|
||||||
|
|
||||||
|
clean:
|
||||||
|
find . -name "*.o" |xargs rm -f
|
||||||
|
find . -name "*.d" |xargs rm -f
|
||||||
|
-rm -f *.elf
|
||||||
|
-rm -f *.nds
|
||||||
|
-rm -f *.gba
|
||||||
|
-rm -f *.arm9
|
||||||
|
-rm -f *.map
|
||||||
|
-rm -f *.img
|
||||||
|
-rm -Rf *.d
|
||||||
|
|
||||||
|
|
||||||
|
subdirs: $(patsubst %, _dir_%, $(SUBDIRS))
|
||||||
|
|
||||||
|
$(patsubst %, _dir_%, $(SUBDIRS)):
|
||||||
|
$(MAKE) -C $(patsubst _dir_%, %, $@)
|
||||||
|
|
||||||
|
clean_subdirs: $(patsubst %, _clean_dir_%, $(SUBDIRS))
|
||||||
|
|
||||||
|
$(patsubst %, _clean_dir_%, $(SUBDIRS)):
|
||||||
|
$(MAKE) -C $(patsubst _clean_dir_%, %, $@) clean
|
||||||
|
|
||||||
|
#include $(DEVKITARM)/ds_rules
|
||||||
|
|
79
Makefile.in
79
Makefile.in
|
@ -6,11 +6,12 @@ objects = build
|
||||||
depend = build-deps
|
depend = build-deps
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
bindir = $(DESTDIR)@bindir@
|
bindir = @bindir@
|
||||||
libdir = $(DESTDIR)@libdir@
|
libdir = @libdir@
|
||||||
includedir = $(DESTDIR)@includedir@
|
includedir = @includedir@
|
||||||
datadir = $(DESTDIR)@datadir@
|
datarootdir = @datarootdir@
|
||||||
mandir = $(DESTDIR)@mandir@
|
datadir = @datadir@
|
||||||
|
mandir = @mandir@
|
||||||
auxdir = @ac_aux_dir@
|
auxdir = @ac_aux_dir@
|
||||||
distpath = $(srcdir)/..
|
distpath = $(srcdir)/..
|
||||||
distdir = SDL-@SDL_VERSION@
|
distdir = SDL-@SDL_VERSION@
|
||||||
|
@ -29,6 +30,7 @@ INSTALL = @INSTALL@
|
||||||
NASM = @NASM@ @NASMFLAGS@
|
NASM = @NASM@ @NASMFLAGS@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
|
WINDRES = @WINDRES@
|
||||||
|
|
||||||
TARGET = libSDL.la
|
TARGET = libSDL.la
|
||||||
SOURCES = @SOURCES@
|
SOURCES = @SOURCES@
|
||||||
|
@ -38,13 +40,15 @@ SDLMAIN_TARGET = libSDLmain.a
|
||||||
SDLMAIN_SOURCES = @SDLMAIN_SOURCES@
|
SDLMAIN_SOURCES = @SDLMAIN_SOURCES@
|
||||||
SDLMAIN_OBJECTS = @SDLMAIN_OBJECTS@
|
SDLMAIN_OBJECTS = @SDLMAIN_OBJECTS@
|
||||||
|
|
||||||
DIST = acinclude.m4 autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS CWprojects.sea.bin docs docs.html EpocBuildFiles.zip include INSTALL Makefile.dc Makefile.minimal Makefile.in MPWmake.sea.bin README* sdl-config.in sdl.m4 sdl.pc.in SDL.qpg.in SDL.spec SDL.spec.in src test TODO VisualCE.zip VisualC.html VisualC.zip Watcom-OS2.zip Watcom-Win32.zip WhatsNew Xcode.tar.gz
|
DIST = acinclude.m4 autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS CWprojects.sea.bin docs docs.html include INSTALL Makefile.dc Makefile.minimal Makefile.in MPWmake.sea.bin README* sdl-config.in sdl.m4 sdl.pc.in SDL.qpg.in SDL.spec SDL.spec.in src test TODO VisualCE.zip VisualC.html VisualC.zip Watcom-OS2.zip Watcom-Win32.zip WhatsNew Xcode.tar.gz
|
||||||
|
|
||||||
|
HDRS = SDL.h SDL_active.h SDL_audio.h SDL_byteorder.h SDL_cdrom.h SDL_cpuinfo.h SDL_endian.h SDL_error.h SDL_events.h SDL_getenv.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_platform.h SDL_quit.h SDL_rwops.h SDL_stdinc.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h
|
||||||
|
|
||||||
LT_AGE = @LT_AGE@
|
LT_AGE = @LT_AGE@
|
||||||
LT_CURRENT = @LT_CURRENT@
|
LT_CURRENT = @LT_CURRENT@
|
||||||
LT_RELEASE = @LT_RELEASE@
|
LT_RELEASE = @LT_RELEASE@
|
||||||
LT_REVISION = @LT_REVISION@
|
LT_REVISION = @LT_REVISION@
|
||||||
LT_LDFLAGS = -no-undefined -rpath $(libdir) -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
LT_LDFLAGS = -no-undefined -rpath $(DESTDIR)$(libdir) -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||||
|
|
||||||
all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
|
all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
|
||||||
|
|
||||||
|
@ -80,51 +84,49 @@ $(objects)/$(SDLMAIN_TARGET): $(SDLMAIN_OBJECTS)
|
||||||
|
|
||||||
install: all install-bin install-hdrs install-lib install-data install-man
|
install: all install-bin install-hdrs install-lib install-data install-man
|
||||||
install-bin:
|
install-bin:
|
||||||
$(SHELL) $(auxdir)/mkinstalldirs $(bindir)
|
$(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(bindir)
|
||||||
$(INSTALL) -m 755 sdl-config $(bindir)/sdl-config
|
$(INSTALL) -m 755 sdl-config $(DESTDIR)$(bindir)/sdl-config
|
||||||
install-hdrs:
|
install-hdrs:
|
||||||
$(SHELL) $(auxdir)/mkinstalldirs $(includedir)/SDL
|
$(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(includedir)/SDL
|
||||||
for src in $(srcdir)/include/*.h; do \
|
for file in $(HDRS); do \
|
||||||
file=`echo $$src | sed -e 's|^.*/||'`; \
|
$(INSTALL) -m 644 $(srcdir)/include/$$file $(DESTDIR)$(includedir)/SDL/$$file; \
|
||||||
$(INSTALL) -m 644 $$src $(includedir)/SDL/$$file; \
|
|
||||||
done
|
done
|
||||||
$(INSTALL) -m 644 include/SDL_config.h $(includedir)/SDL/SDL_config.h
|
$(INSTALL) -m 644 include/SDL_config.h $(DESTDIR)$(includedir)/SDL/SDL_config.h
|
||||||
install-lib:
|
install-lib: $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
|
||||||
$(SHELL) $(auxdir)/mkinstalldirs $(libdir)
|
$(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(libdir)
|
||||||
$(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(TARGET) $(libdir)/$(TARGET)
|
$(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(TARGET) $(DESTDIR)$(libdir)/$(TARGET)
|
||||||
$(INSTALL) -m 644 $(objects)/$(SDLMAIN_TARGET) $(libdir)/$(SDLMAIN_TARGET)
|
$(INSTALL) -m 644 $(objects)/$(SDLMAIN_TARGET) $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET)
|
||||||
$(RANLIB) $(libdir)/$(SDLMAIN_TARGET)
|
$(RANLIB) $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET)
|
||||||
install-data:
|
install-data:
|
||||||
$(SHELL) $(auxdir)/mkinstalldirs $(datadir)/aclocal
|
$(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(datadir)/aclocal
|
||||||
$(INSTALL) -m 644 $(srcdir)/sdl.m4 $(datadir)/aclocal/sdl.m4
|
$(INSTALL) -m 644 $(srcdir)/sdl.m4 $(DESTDIR)$(datadir)/aclocal/sdl.m4
|
||||||
$(SHELL) $(auxdir)/mkinstalldirs $(libdir)/pkgconfig
|
$(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(libdir)/pkgconfig
|
||||||
$(INSTALL) -m 644 sdl.pc $(libdir)/pkgconfig
|
$(INSTALL) -m 644 sdl.pc $(DESTDIR)$(libdir)/pkgconfig
|
||||||
install-man:
|
install-man:
|
||||||
$(SHELL) $(auxdir)/mkinstalldirs $(mandir)/man3
|
$(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(mandir)/man3
|
||||||
for src in $(srcdir)/docs/man3/*.3; do \
|
for src in $(srcdir)/docs/man3/*.3; do \
|
||||||
file=`echo $$src | sed -e 's|^.*/||'`; \
|
file=`echo $$src | sed -e 's|^.*/||'`; \
|
||||||
$(INSTALL) -m 644 $$src $(mandir)/man3/$$file; \
|
$(INSTALL) -m 644 $$src $(DESTDIR)$(mandir)/man3/$$file; \
|
||||||
done
|
done
|
||||||
|
|
||||||
uninstall: uninstall-bin uninstall-hdrs uninstall-lib uninstall-data uninstall-man
|
uninstall: uninstall-bin uninstall-hdrs uninstall-lib uninstall-data uninstall-man
|
||||||
uninstall-bin:
|
uninstall-bin:
|
||||||
rm -f $(bindir)/sdl-config
|
rm -f $(DESTDIR)$(bindir)/sdl-config
|
||||||
uninstall-hdrs:
|
uninstall-hdrs:
|
||||||
for src in $(srcdir)/include/*.h; do \
|
for file in $(HDRS); do \
|
||||||
file=`echo $$src | sed -e 's|^.*/||'`; \
|
rm -f $(DESTDIR)$(includedir)/SDL/$$file; \
|
||||||
rm -f $(includedir)/SDL/$$file; \
|
|
||||||
done
|
done
|
||||||
rm -f $(includedir)/SDL/SDL_config.h
|
rm -f $(DESTDIR)$(includedir)/SDL/SDL_config.h
|
||||||
-rmdir $(includedir)/SDL
|
-rmdir $(DESTDIR)$(includedir)/SDL
|
||||||
uninstall-lib:
|
uninstall-lib:
|
||||||
$(LIBTOOL) --mode=uninstall rm -f $(libdir)/$(TARGET)
|
$(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$(TARGET)
|
||||||
rm -f $(libdir)/$(SDLMAIN_TARGET)
|
rm -f $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET)
|
||||||
uninstall-data:
|
uninstall-data:
|
||||||
rm -f $(datadir)/aclocal/sdl.m4
|
rm -f $(DESTDIR)$(datadir)/aclocal/sdl.m4
|
||||||
uninstall-man:
|
uninstall-man:
|
||||||
for src in $(srcdir)/docs/man3/*.3; do \
|
for src in $(srcdir)/docs/man3/*.3; do \
|
||||||
file=`echo $$src | sed -e 's|^.*/||'`; \
|
file=`echo $$src | sed -e 's|^.*/||'`; \
|
||||||
rm -f $(mandir)/man3/$$file; \
|
rm -f $(DESTDIR)$(mandir)/man3/$$file; \
|
||||||
done
|
done
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -169,10 +171,9 @@ rpm: $(distfile)
|
||||||
|
|
||||||
# Create a SVN snapshot that people can run update on
|
# Create a SVN snapshot that people can run update on
|
||||||
snapshot:
|
snapshot:
|
||||||
svn co svn://libsdl.org/trunk/SDL
|
svn co http://svn.libsdl.org/branches/SDL-1.2
|
||||||
(cd SDL && ./autogen.sh && rm -rf autom4te.cache)
|
(cd SDL-1.2 && ./autogen.sh && rm -rf autom4te.cache)
|
||||||
cp SDL/include/SDL_config.h.default SDL/include/SDL_config.h
|
cp SDL-1.2/include/SDL_config.h.default SDL-1.2/include/SDL_config.h
|
||||||
mv SDL SDL-1.2
|
|
||||||
tar zcf $(HOME)/SDL-1.2.tar.gz SDL-1.2
|
tar zcf $(HOME)/SDL-1.2.tar.gz SDL-1.2
|
||||||
rm -f $(HOME)/SDL-1.2.zip
|
rm -f $(HOME)/SDL-1.2.zip
|
||||||
zip -r $(HOME)/SDL-1.2.zip SDL-1.2
|
zip -r $(HOME)/SDL-1.2.zip SDL-1.2
|
||||||
|
|
9
README
9
README
|
@ -12,10 +12,11 @@ This is the Simple DirectMedia Layer, a general API that provides low
|
||||||
level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
|
level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
|
||||||
and 2D framebuffer across multiple platforms.
|
and 2D framebuffer across multiple platforms.
|
||||||
|
|
||||||
The current version supports Linux, Windows, Windows CE, BeOS, MacOS,
|
The current version supports Linux, Windows CE/95/98/ME/XP/Vista, BeOS,
|
||||||
Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX.
|
MacOS Classic, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX,
|
||||||
The code contains support for AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64,
|
and QNX. The code contains support for Dreamcast, Atari, AIX, OSF/Tru64,
|
||||||
RISC OS, SymbianOS, and OS/2, but these are not officially supported.
|
RISC OS, SymbianOS, Nintendo DS, and OS/2, but these are not officially
|
||||||
|
supported.
|
||||||
|
|
||||||
SDL is written in C, but works with C++ natively, and has bindings to
|
SDL is written in C, but works with C++ natively, and has bindings to
|
||||||
several other languages, including Ada, C#, Eiffel, Erlang, Euphoria,
|
several other languages, including Ada, C#, Eiffel, Erlang, Euphoria,
|
||||||
|
|
|
@ -1,50 +1,12 @@
|
||||||
This is the porting of 1.2.0 version of SDL (the latest stable one)
|
The AmigaOS code has been removed from SDL, since it had been broken for a
|
||||||
to AmigaOS/68k.
|
long time and had a few bits of fairly invasive code #ifdef'd into the
|
||||||
|
SDL core.
|
||||||
|
|
||||||
All the bugs known of the past version have been corrected. And I've
|
However, there is an OS4 version of SDL here:
|
||||||
added all the new SDL features.
|
http://www.rcdrummond.net/amiga/index.html
|
||||||
|
|
||||||
This version of SDL needs Cybergraphx V3 (r69+) or CyberGraphX V4
|
And a MorphOS version here:
|
||||||
and AHI v3+. Probably it works also with P96 or CGXAga, but it's
|
http://www.lehtoranta.net/powersdl/
|
||||||
untested.
|
|
||||||
|
|
||||||
This version is available as linked library for SAS/C and GCC, only 68k this
|
--ryan.
|
||||||
time, a powerup (ppcemu compatible) and a morphos version will be ready quite
|
|
||||||
soon (i hope).
|
|
||||||
|
|
||||||
Implemented:
|
|
||||||
|
|
||||||
- 8/16/24/32bit video modes, both fullscreen and windowed.
|
|
||||||
- Hardware surfaces.
|
|
||||||
- CGX blitting acceleration.
|
|
||||||
- CGX colorkey blitting acceleration.
|
|
||||||
- AHI audio (8/16 bit, with any audio format), always uses unit 0 for now.
|
|
||||||
- Thread support (maybe not 100% compatible with other implementations)
|
|
||||||
- Semaphores
|
|
||||||
- Window resizing and backdrop windows (NEW)
|
|
||||||
- Joystick/Joypad support.
|
|
||||||
|
|
||||||
To do:
|
|
||||||
|
|
||||||
- CDRom audio playing support
|
|
||||||
- OpenGL (A guy was working on it but I've lost his tracks :( )
|
|
||||||
|
|
||||||
The SAS/C library is distributed with debug info attached, to strip debug info
|
|
||||||
simply add STRIPDEBUG argument to the linker.
|
|
||||||
|
|
||||||
NOTE: SDL includes debug output using kprintf, to disable it add to your
|
|
||||||
project a function like this:
|
|
||||||
|
|
||||||
void kprintf(char *a,...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Otherwise you can redirect the debug to a console window with sushi, sashimi or
|
|
||||||
similar tools (the default output is the internal serial port).
|
|
||||||
|
|
||||||
For info, support, bugfix and other feel free to mail me:
|
|
||||||
|
|
||||||
Gabriele Greco (gabriele.greco@aruba.it)
|
|
||||||
|
|
||||||
You can find also a small SDL Amiga page at:
|
|
||||||
http://ggreco.interfree.it/sdl.html
|
|
||||||
|
|
75
README.Epoc
75
README.Epoc
|
@ -1,75 +0,0 @@
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
Using the Simple DirectMedia Layer with EPOC/SymbianOS 6.0
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
I. Building the Simple DirectMedia Layer libraries:
|
|
||||||
|
|
||||||
You can get Symbian SDK from:
|
|
||||||
http://www.symbian.com.
|
|
||||||
|
|
||||||
First create "Epoc" directory under SDL main directory and unpack
|
|
||||||
EpocBuildFiles.zip in it.
|
|
||||||
|
|
||||||
To build the librarys goto "epoc" directory and type:
|
|
||||||
bldmake bldfiles
|
|
||||||
abld makefile vc6 (for creating Microsoft Visual C++ makefiles)
|
|
||||||
abld build wins udeb (building for wins emulator)
|
|
||||||
abld build armi urel (building for real device)
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
II. Building the Simple DirectMedia Layer programs:
|
|
||||||
|
|
||||||
Building SDL test programs is easy once you have built the libraries:
|
|
||||||
abld test build wins udeb
|
|
||||||
abld test build armi urel
|
|
||||||
|
|
||||||
Supported real screen resolutions
|
|
||||||
320 x 200 x 8 bit
|
|
||||||
320 x 200 x 12 bit
|
|
||||||
640 x 200 x 8 bit
|
|
||||||
640 x 200 x 12 bit
|
|
||||||
Supported "emulated" screen resolutions
|
|
||||||
640 x 400 x 8 bit
|
|
||||||
640 x 400 x 12 bit
|
|
||||||
640 x 480 x 8 bit
|
|
||||||
640 x 480 x 12 bit
|
|
||||||
"Emulated" resolutions are implemented by by shrinking the screen vertically
|
|
||||||
i.e. only every second scanline is drawn. This is mainly ment to be used for
|
|
||||||
testing quick ports of programs. Using faked resolutions is a waste of memory
|
|
||||||
and cpu power!
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
III. Running test programs
|
|
||||||
|
|
||||||
Copy executable to the device and run it from the File manager. The Esc
|
|
||||||
key quits demo programs. In Crystal, Exe programs do not appear in task list
|
|
||||||
nor in Extras :-(. Test programs are tested in Nokia 9210 Communicator.
|
|
||||||
|
|
||||||
Special keys used in SDL:
|
|
||||||
The Caps lock key enables or disables the virtual cursor.
|
|
||||||
Function keys are mapped as follows:
|
|
||||||
F1=chr+q, F2=chr+w,..., F8=chr+i,
|
|
||||||
F9=chr+a,..., F12=chr+d.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
IV. Enjoy! :)
|
|
||||||
|
|
||||||
If you have a project you'd like me to know about, or want to ask questions,
|
|
||||||
go ahead and join the SDL developer's mailing list by sending e-mail to:
|
|
||||||
|
|
||||||
sdl-request@libsdl.org
|
|
||||||
|
|
||||||
and put "subscribe" into the subject of the message. Or alternatively you
|
|
||||||
can use the web interface:
|
|
||||||
|
|
||||||
http://www.libsdl.org/mailman/listinfo/sdl
|
|
||||||
|
|
||||||
You can find more info about Epoc version of SDL from Hannu Viitala's
|
|
||||||
homepage
|
|
||||||
http://www.mbnet.fi/~haviital
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
|
|
19
README.MiNT
19
README.MiNT
|
@ -68,14 +68,14 @@ OpenGL (using Mesa offscreen rendering driver)
|
||||||
- Dependent driver combinations:
|
- Dependent driver combinations:
|
||||||
Video Kbd Mouse Timer Joysticks
|
Video Kbd Mouse Timer Joysticks
|
||||||
xbios ikbd ikbd vbl(2) ikbd
|
xbios ikbd ikbd vbl(2) ikbd
|
||||||
xbios gemdos xbios vbl(2) xbios(3)
|
xbios gemdos xbios vbl(2) xbios
|
||||||
xbios bios xbios vbl(2) xbios(3)
|
xbios bios xbios vbl(2) xbios
|
||||||
gem gem gem(1) vbl(2) xbios(3)
|
gem gem gem(1) vbl(2) xbios
|
||||||
|
|
||||||
Audio O/S Misc
|
Audio O/S Misc
|
||||||
dma8 All Uses MFP Timer A interrupt
|
dma8 All Uses MFP Timer A interrupt
|
||||||
xbios TOS Uses MFP Timer A interrupt
|
xbios TOS Uses MFP Timer A interrupt
|
||||||
xbios MiNT Uses MiNT thread
|
xbios MiNT Uses MFP Timer A interrupt
|
||||||
xbios Magic Disabled
|
xbios Magic Disabled
|
||||||
stfa All Uses MFP interrupt
|
stfa All Uses MFP interrupt
|
||||||
mcsn TOS Uses MFP Timer A interrupt
|
mcsn TOS Uses MFP Timer A interrupt
|
||||||
|
@ -87,16 +87,13 @@ Joypad driver always uses hardware access.
|
||||||
OpenGL driver always uses OSMesa.
|
OpenGL driver always uses OSMesa.
|
||||||
|
|
||||||
(1) GEM does not report relative mouse motion, so xbios mouse driver is used
|
(1) GEM does not report relative mouse motion, so xbios mouse driver is used
|
||||||
to report this type event. Under MiNT, using XBIOS mouse driver is not possible.
|
to report this type event.
|
||||||
A preliminary driver for /dev/mouse device driver is present, but is disabled
|
A preliminary driver for /dev/mouse device driver is present, but is disabled
|
||||||
till it can be used with other applications simultaneously.
|
till it can be used with other applications simultaneously.
|
||||||
|
|
||||||
(2) If you build SDL with threads using the GNU pth library, timers are
|
(2) If you build SDL with threads using the GNU pth library, timers are
|
||||||
supported via the pth library.
|
supported via the pth library.
|
||||||
|
|
||||||
(3) Redirecting XBIOS vectors does not work under MiNT, so it is disabled in
|
|
||||||
this case.
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
V. Environment variables:
|
V. Environment variables:
|
||||||
|
|
||||||
|
@ -127,12 +124,12 @@ SDL_JOYSTICK_ATARI:
|
||||||
|
|
||||||
'ikbd-joy1-[on|off]' for IKBD joystick on port 1 (hardware access)
|
'ikbd-joy1-[on|off]' for IKBD joystick on port 1 (hardware access)
|
||||||
'xbios-joy1-[on|off]' for IKBD joystick on port 1 (xbios access)
|
'xbios-joy1-[on|off]' for IKBD joystick on port 1 (xbios access)
|
||||||
'porta-pad-[on|off]' for joypad on port A
|
'porta-pad-[on|off]' for joypad and/or teamtap on port A
|
||||||
'porta-joy0-[on|off]' for joystick 0 on port A
|
'porta-joy0-[on|off]' for joystick 0 on port A
|
||||||
'porta-joy1-[on|off]' for joystick 1 on port A
|
'porta-joy1-[on|off]' for joystick 1 on port A
|
||||||
'porta-lp-[on|off]' for lightpen on port A
|
'porta-lp-[on|off]' for lightpen on port A
|
||||||
'porta-anpad-[on|off]' for analog paddle on port A
|
'porta-anpad-[on|off]' for analog paddle on port A
|
||||||
'portb-pad-[on|off]' for joypad on port B
|
'portb-pad-[on|off]' for joypad and/or teamtap on port B
|
||||||
'portb-joy0-[on|off]' for joystick 0 on port B
|
'portb-joy0-[on|off]' for joystick 0 on port B
|
||||||
'portb-joy1-[on|off]' for joystick 1 on port B
|
'portb-joy1-[on|off]' for joystick 1 on port B
|
||||||
'portb-anpad-[on|off]' for analog paddle on port B
|
'portb-anpad-[on|off]' for analog paddle on port B
|
||||||
|
@ -213,7 +210,7 @@ Mouse and joystick xbios driver:
|
||||||
Available on all machines (I think).
|
Available on all machines (I think).
|
||||||
|
|
||||||
Joypad driver:
|
Joypad driver:
|
||||||
Available if _MCH cookie is STE or Falcon.
|
Available if _MCH cookie is STE or Falcon. Supports teamtap.
|
||||||
|
|
||||||
PTH timer driver:
|
PTH timer driver:
|
||||||
Available with multitasking OS.
|
Available with multitasking OS.
|
||||||
|
|
22
README.NDS
Normal file
22
README.NDS
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The SDL port to the Nintendo DS
|
||||||
|
|
||||||
|
This port uses the devKitPro toolchain, available from:
|
||||||
|
http://www.devkitpro.org
|
||||||
|
|
||||||
|
Precompiled tools for cross-compiling on Linux are available from:
|
||||||
|
http://www.libsdl.org/extras/nds/devkitPro-20070503-linux.tar.gz
|
||||||
|
|
||||||
|
todo:
|
||||||
|
add ds console specific features/optimizations
|
||||||
|
mouse/keyboard support
|
||||||
|
dual screen support
|
||||||
|
|
||||||
|
build with:
|
||||||
|
cp include/SDL_config_nds.h include/SDL_config.h
|
||||||
|
make -f Makefile.ds
|
||||||
|
|
||||||
|
included is an arm9/arm7 template to allow for sound streaming support.
|
||||||
|
|
||||||
|
Enjoy, fix the source and share :)
|
||||||
|
Troy Davis(GPF)
|
||||||
|
http://gpf.dcemu.co.uk/
|
|
@ -7,7 +7,7 @@ at the Subversion website ( http://subversion.tigris.org/ ) for more
|
||||||
information on using svn, where you can also download software for
|
information on using svn, where you can also download software for
|
||||||
MacOS, Windows, and Unix systems.
|
MacOS, Windows, and Unix systems.
|
||||||
|
|
||||||
svn checkout svn://libsdl.org/trunk/SDL
|
svn checkout http://svn.libsdl.org/branches/SDL-1.2
|
||||||
|
|
||||||
If you are building SDL with an IDE, you will need to copy the file
|
If you are building SDL with an IDE, you will need to copy the file
|
||||||
include/SDL_config.h.default to include/SDL_config.h before building.
|
include/SDL_config.h.default to include/SDL_config.h before building.
|
||||||
|
|
23
README.Symbian
Normal file
23
README.Symbian
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
==============================================================================
|
||||||
|
Using the Simple DirectMedia Layer with S60 3.x / Symbian 9.x
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
These instuctions are for people developing for S60 3.x. S60 3.x
|
||||||
|
uses Symbian OS so you need S60 SDK.
|
||||||
|
|
||||||
|
extract "symbian.zip" into this folder.
|
||||||
|
|
||||||
|
go to symbian folder
|
||||||
|
|
||||||
|
bldmake bldfiles
|
||||||
|
abld build
|
||||||
|
|
||||||
|
That produces WINSCW and ARMV5 versions of sdl.dll runtime library
|
||||||
|
and sdl.lib for development.
|
||||||
|
The sdlexe.dll/sdlexe.lib and sdlmain.lib are for easy SDL S60
|
||||||
|
integration, please see http://www.mbnet.fi/~mertama/sdl.html
|
||||||
|
for further info.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ make install prefix=$RPM_BUILD_ROOT%{prefix} \
|
||||||
includedir=$RPM_BUILD_ROOT%{_includedir} \
|
includedir=$RPM_BUILD_ROOT%{_includedir} \
|
||||||
datadir=$RPM_BUILD_ROOT%{_datadir} \
|
datadir=$RPM_BUILD_ROOT%{_datadir} \
|
||||||
mandir=$RPM_BUILD_ROOT%{_mandir}
|
mandir=$RPM_BUILD_ROOT%{_mandir}
|
||||||
ln -s libSDL-1.2.so.0 $RPM_BUILD_ROOT%{prefix}/lib/libSDL-1.1.so.0
|
ln -s libSDL-1.2.so.0 $RPM_BUILD_ROOT%{_libdir}/libSDL-1.1.so.0
|
||||||
%else
|
%else
|
||||||
%makeinstall
|
%makeinstall
|
||||||
%endif
|
%endif
|
||||||
|
|
|
@ -45,6 +45,10 @@
|
||||||
This is done by right clicking on each project in turn (Projects are listed in
|
This is done by right clicking on each project in turn (Projects are listed in
|
||||||
the Workspace panel in the FileView tab), and selecting "Build".
|
the Workspace panel in the FileView tab), and selecting "Build".
|
||||||
</P>
|
</P>
|
||||||
|
<P>
|
||||||
|
If you get an error about SDL_config.h being missing, you should
|
||||||
|
copy include/SDL_config.h.default to include/SDL_config.h and try again.
|
||||||
|
</P>
|
||||||
<P>
|
<P>
|
||||||
You may get a few warnings, but you should not get any errors. You do have to
|
You may get a few warnings, but you should not get any errors. You do have to
|
||||||
have at least the DirectX 5 SDK installed, however. The latest
|
have at least the DirectX 5 SDK installed, however. The latest
|
||||||
|
|
BIN
VisualC.zip
BIN
VisualC.zip
Binary file not shown.
4
WhatsNew
4
WhatsNew
|
@ -3,6 +3,10 @@ This is a list of API changes in SDL's version history.
|
||||||
|
|
||||||
Version 1.0:
|
Version 1.0:
|
||||||
|
|
||||||
|
1.2.12:
|
||||||
|
Added SDL_VIDEO_ALLOW_SCREENSAVER to override SDL's disabling
|
||||||
|
of the screensaver on Mac OS X and X11.
|
||||||
|
|
||||||
1.2.10:
|
1.2.10:
|
||||||
If SDL_OpenAudio() is passed zero for the desired format
|
If SDL_OpenAudio() is passed zero for the desired format
|
||||||
fields, the following environment variables will be used
|
fields, the following environment variables will be used
|
||||||
|
|
|
@ -48,7 +48,7 @@ CPPFLAGS_X86="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040 \
|
||||||
|
|
||||||
# Intel linker flags
|
# Intel linker flags
|
||||||
LFLAGS_X86="-arch i386 -mmacosx-version-min=10.4 \
|
LFLAGS_X86="-arch i386 -mmacosx-version-min=10.4 \
|
||||||
-L/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.0 \
|
-L/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.1 \
|
||||||
-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk"
|
-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -41,7 +41,11 @@ search_deps()
|
||||||
for src in $SOURCES
|
for src in $SOURCES
|
||||||
do echo "Generating dependencies for $src"
|
do echo "Generating dependencies for $src"
|
||||||
ext=`echo $src | sed 's|.*\.\(.*\)|\1|'`
|
ext=`echo $src | sed 's|.*\.\(.*\)|\1|'`
|
||||||
|
if test x"$ext" = x"rc"; then
|
||||||
|
obj=`echo $src | sed "s|^.*/\([^ ]*\)\..*|\1.o|g"`
|
||||||
|
else
|
||||||
obj=`echo $src | sed "s|^.*/\([^ ]*\)\..*|\1.lo|g"`
|
obj=`echo $src | sed "s|^.*/\([^ ]*\)\..*|\1.lo|g"`
|
||||||
|
fi
|
||||||
echo "\$(objects)/$obj: $src \\" >>${output}.new
|
echo "\$(objects)/$obj: $src \\" >>${output}.new
|
||||||
search_deps $src | sort | uniq >>${output}.new
|
search_deps $src | sort | uniq >>${output}.new
|
||||||
case $ext in
|
case $ext in
|
||||||
|
@ -73,6 +77,12 @@ __EOF__
|
||||||
|
|
||||||
\$(LIBTOOL) --mode=compile \$(CC) \$(CFLAGS) \$(EXTRA_CFLAGS) -c $src -o \$@
|
\$(LIBTOOL) --mode=compile \$(CC) \$(CFLAGS) \$(EXTRA_CFLAGS) -c $src -o \$@
|
||||||
|
|
||||||
|
__EOF__
|
||||||
|
;;
|
||||||
|
rc) cat >>${output}.new <<__EOF__
|
||||||
|
|
||||||
|
\$(WINDRES) $src \$@
|
||||||
|
|
||||||
__EOF__
|
__EOF__
|
||||||
;;
|
;;
|
||||||
*) echo "Unknown file extension: $ext";;
|
*) echo "Unknown file extension: $ext";;
|
||||||
|
|
190
configure.in
190
configure.in
|
@ -16,9 +16,9 @@ dnl Set various version strings - taken gratefully from the GTk sources
|
||||||
#
|
#
|
||||||
SDL_MAJOR_VERSION=1
|
SDL_MAJOR_VERSION=1
|
||||||
SDL_MINOR_VERSION=2
|
SDL_MINOR_VERSION=2
|
||||||
SDL_MICRO_VERSION=11
|
SDL_MICRO_VERSION=12
|
||||||
SDL_INTERFACE_AGE=0
|
SDL_INTERFACE_AGE=1
|
||||||
SDL_BINARY_AGE=11
|
SDL_BINARY_AGE=12
|
||||||
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
||||||
|
|
||||||
AC_SUBST(SDL_MAJOR_VERSION)
|
AC_SUBST(SDL_MAJOR_VERSION)
|
||||||
|
@ -74,8 +74,8 @@ BUILD_CFLAGS="$CFLAGS $CPPFLAGS"
|
||||||
EXTRA_CFLAGS="$INCLUDE $BASE_CFLAGS"
|
EXTRA_CFLAGS="$INCLUDE $BASE_CFLAGS"
|
||||||
BUILD_LDFLAGS="$LDFLAGS"
|
BUILD_LDFLAGS="$LDFLAGS"
|
||||||
EXTRA_LDFLAGS="$BASE_LDFLAGS"
|
EXTRA_LDFLAGS="$BASE_LDFLAGS"
|
||||||
# I can't remember why I added this. I'm sure it'll come to me...
|
## These are common directories to find software packages
|
||||||
#for path in /usr/local; do
|
#for path in /usr/freeware /usr/pkg /usr/X11R6 /usr/local; do
|
||||||
# if test -d $path/include; then
|
# if test -d $path/include; then
|
||||||
# EXTRA_CFLAGS="$EXTRA_CFLAGS -I$path/include"
|
# EXTRA_CFLAGS="$EXTRA_CFLAGS -I$path/include"
|
||||||
# fi
|
# fi
|
||||||
|
@ -96,6 +96,12 @@ AC_PROG_CC
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
|
if test -z "$host_alias"; then
|
||||||
|
hostaliaswindres=
|
||||||
|
else
|
||||||
|
hostaliaswindres="$host_alias-windres"
|
||||||
|
fi
|
||||||
|
AC_CHECK_PROGS(WINDRES, [windres $hostaliaswindres $host_os-windres])
|
||||||
|
|
||||||
dnl Check for compiler characteristics
|
dnl Check for compiler characteristics
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
|
@ -124,7 +130,14 @@ if test x$enable_libc = xyes; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
|
case "$host" in
|
||||||
|
*-*-cygwin* | *-*-mingw32*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
AC_FUNC_ALLOCA
|
AC_FUNC_ALLOCA
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AC_FUNC_MEMCMP
|
AC_FUNC_MEMCMP
|
||||||
if test x$ac_cv_func_memcmp_working = xyes; then
|
if test x$ac_cv_func_memcmp_working = xyes; then
|
||||||
AC_DEFINE(HAVE_MEMCMP)
|
AC_DEFINE(HAVE_MEMCMP)
|
||||||
|
@ -189,7 +202,6 @@ SOURCES="$SOURCES $srcdir/src/cdrom/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/cpuinfo/*.c"
|
SOURCES="$SOURCES $srcdir/src/cpuinfo/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/events/*.c"
|
SOURCES="$SOURCES $srcdir/src/events/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/file/*.c"
|
SOURCES="$SOURCES $srcdir/src/file/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/joystick/*.c"
|
|
||||||
SOURCES="$SOURCES $srcdir/src/stdlib/*.c"
|
SOURCES="$SOURCES $srcdir/src/stdlib/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/thread/*.c"
|
SOURCES="$SOURCES $srcdir/src/thread/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/timer/*.c"
|
SOURCES="$SOURCES $srcdir/src/timer/*.c"
|
||||||
|
@ -220,6 +232,8 @@ AC_HELP_STRING([--enable-joystick], [Enable the joystick subsystem [[default=yes
|
||||||
, enable_joystick=yes)
|
, enable_joystick=yes)
|
||||||
if test x$enable_joystick != xyes; then
|
if test x$enable_joystick != xyes; then
|
||||||
AC_DEFINE(SDL_JOYSTICK_DISABLED)
|
AC_DEFINE(SDL_JOYSTICK_DISABLED)
|
||||||
|
else
|
||||||
|
SOURCES="$SOURCES $srcdir/src/joystick/*.c"
|
||||||
fi
|
fi
|
||||||
AC_ARG_ENABLE(cdrom,
|
AC_ARG_ENABLE(cdrom,
|
||||||
AC_HELP_STRING([--enable-cdrom], [Enable the cdrom subsystem [[default=yes]]]),
|
AC_HELP_STRING([--enable-cdrom], [Enable the cdrom subsystem [[default=yes]]]),
|
||||||
|
@ -451,6 +465,63 @@ AC_HELP_STRING([--enable-esd-shared], [dynamically load ESD audio support [[defa
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dnl Find PulseAudio
|
||||||
|
CheckPulseAudio()
|
||||||
|
{
|
||||||
|
AC_ARG_ENABLE(pulseaudio,
|
||||||
|
AC_HELP_STRING([--enable-pulseaudio], [use PulseAudio [[default=yes]]]),
|
||||||
|
, enable_pulse=yes)
|
||||||
|
if test x$enable_audio = xyes -a x$enable_pulse = xyes; then
|
||||||
|
audio_pulse=no
|
||||||
|
|
||||||
|
PULSE_REQUIRED_VERSION=0.9
|
||||||
|
|
||||||
|
AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
|
||||||
|
AC_MSG_CHECKING(for PulseAudio $PULSE_REQUIRED_VERSION support)
|
||||||
|
if test x$PKG_CONFIG != xno; then
|
||||||
|
if $PKG_CONFIG --atleast-pkgconfig-version 0.7 && $PKG_CONFIG --atleast-version $PULSE_REQUIRED_VERSION libpulse-simple; then
|
||||||
|
PULSE_CFLAGS=`$PKG_CONFIG --cflags libpulse-simple`
|
||||||
|
PULSE_LIBS=`$PKG_CONFIG --libs libpulse-simple`
|
||||||
|
audio_pulse=yes
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT($audio_pulse)
|
||||||
|
|
||||||
|
if test x$audio_pulse = xyes; then
|
||||||
|
AC_ARG_ENABLE(pulseaudio-shared,
|
||||||
|
AC_HELP_STRING([--enable-pulseaudio-shared], [dynamically load PulseAudio support [[default=yes]]]),
|
||||||
|
, enable_pulse_shared=yes)
|
||||||
|
if test "x`echo $PULSE_LIBS | grep -- -L`" = "x"; then
|
||||||
|
if test "x`ls /lib/libpulse-simple.so.* 2> /dev/null`" != "x"; then
|
||||||
|
PULSE_LIBS="-L/lib $PULSE_LIBS"
|
||||||
|
elif test "x`ls /usr/lib/libpulse-simple.so.* 2> /dev/null`" != "x"; then
|
||||||
|
PULSE_LIBS="-L/usr/lib $PULSE_LIBS"
|
||||||
|
elif test "x`ls /usr/local/lib/libpulse-simple.so.* 2> /dev/null`" != "x"; then
|
||||||
|
PULSE_LIBS="-L/usr/local/lib $PULSE_LIBS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
pulse_lib_spec=`echo $PULSE_LIBS | sed 's/.*-L\([[^ ]]*\).*/\1\/libpulse-simple.so.*/'`
|
||||||
|
pulse_lib=`ls -- $pulse_lib_spec | sed 's/.*\/\(.*\)/\1/; q'`
|
||||||
|
echo "-- $pulse_lib_spec -> $pulse_lib"
|
||||||
|
|
||||||
|
AC_DEFINE(SDL_AUDIO_DRIVER_PULSE)
|
||||||
|
SOURCES="$SOURCES $srcdir/src/audio/pulse/*.c"
|
||||||
|
EXTRA_CFLAGS="$EXTRA_CFLAGS $PULSE_CFLAGS"
|
||||||
|
if test x$have_loadso != xyes && \
|
||||||
|
test x$enable_pulse_shared = xyes; then
|
||||||
|
AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic PulseAudio loading])
|
||||||
|
fi
|
||||||
|
if test x$have_loadso = xyes && \
|
||||||
|
test x$enable_pulse_shared = xyes && test x$pulse_lib != x; then
|
||||||
|
AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_PULSE_DYNAMIC, "$pulse_lib")
|
||||||
|
else
|
||||||
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS $PULSE_LIBS"
|
||||||
|
fi
|
||||||
|
have_audio=yes
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
CheckARTSC()
|
CheckARTSC()
|
||||||
{
|
{
|
||||||
AC_ARG_ENABLE(arts,
|
AC_ARG_ENABLE(arts,
|
||||||
|
@ -511,21 +582,25 @@ CheckNAS()
|
||||||
AC_HELP_STRING([--enable-nas], [support the NAS audio API [[default=yes]]]),
|
AC_HELP_STRING([--enable-nas], [support the NAS audio API [[default=yes]]]),
|
||||||
, enable_nas=yes)
|
, enable_nas=yes)
|
||||||
if test x$enable_audio = xyes -a x$enable_nas = xyes; then
|
if test x$enable_audio = xyes -a x$enable_nas = xyes; then
|
||||||
|
save_LDFLAGS="$LDFLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS -lXt -lm"
|
||||||
|
AC_CHECK_HEADER(audio/audiolib.h, have_audio_hdr=yes)
|
||||||
|
AC_CHECK_LIB(audio, AuOpenServer, have_audio_lib=yes)
|
||||||
|
AC_CHECK_HEADER(nas/audiolib.h, have_nas_hdr=yes)
|
||||||
|
AC_CHECK_LIB(nas, AuOpenServer, have_nas_lib=yes)
|
||||||
|
LDFLAGS="$save_LDFLAGS"
|
||||||
|
|
||||||
AC_MSG_CHECKING(for NAS audio support)
|
AC_MSG_CHECKING(for NAS audio support)
|
||||||
have_nas=no
|
have_nas=no
|
||||||
if test -r /usr/X11R6/include/audio/audiolib.h; then
|
if test x$have_audio_hdr = xyes -a x$have_audio_lib = xyes; then
|
||||||
have_nas=yes
|
have_nas=yes
|
||||||
NAS_CFLAGS="-I/usr/X11R6/include/"
|
NAS_LIBS="-laudio -lXt"
|
||||||
NAS_LIBS="-L/usr/X11R6/lib -laudio -lXt"
|
elif test x$have_nas_hdr = xyes -a x$have_nas_lib = xyes; then
|
||||||
|
|
||||||
dnl On IRIX, the NAS includes are in a different directory,
|
|
||||||
dnl and libnas must be explicitly linked in
|
|
||||||
|
|
||||||
elif test -r /usr/freeware/include/nas/audiolib.h; then
|
|
||||||
have_nas=yes
|
have_nas=yes
|
||||||
NAS_LIBS="-lnas -lXt"
|
NAS_LIBS="-lnas -lXt"
|
||||||
fi
|
fi
|
||||||
AC_MSG_RESULT($have_nas)
|
AC_MSG_RESULT($have_nas)
|
||||||
|
|
||||||
if test x$have_nas = xyes; then
|
if test x$have_nas = xyes; then
|
||||||
AC_DEFINE(SDL_AUDIO_DRIVER_NAS)
|
AC_DEFINE(SDL_AUDIO_DRIVER_NAS)
|
||||||
SOURCES="$SOURCES $srcdir/src/audio/nas/*.c"
|
SOURCES="$SOURCES $srcdir/src/audio/nas/*.c"
|
||||||
|
@ -597,13 +672,20 @@ CheckNASM()
|
||||||
AC_HELP_STRING([--enable-nasm], [use nasm assembly blitters on x86 [[default=yes]]]),
|
AC_HELP_STRING([--enable-nasm], [use nasm assembly blitters on x86 [[default=yes]]]),
|
||||||
, enable_nasm=yes)
|
, enable_nasm=yes)
|
||||||
if test x$enable_video = xyes -a x$enable_assembly = xyes -a x$enable_nasm = xyes; then
|
if test x$enable_video = xyes -a x$enable_assembly = xyes -a x$enable_nasm = xyes; then
|
||||||
AC_PATH_PROG(NASM, yasm)
|
CompileNASM()
|
||||||
if test "x$NASM" = x -o "x$NASM" = x'"$NASM"'; then
|
{
|
||||||
AC_PATH_PROG(NASM, nasm)
|
# Usage: CompileNASM <filename>
|
||||||
|
AC_MSG_CHECKING(to see if $NASM supports $1)
|
||||||
|
if $NASM $NASMFLAGS $1 -o $1.o >&AS_MESSAGE_LOG_FD 2>&1; then
|
||||||
|
CompileNASM_ret="yes"
|
||||||
|
else
|
||||||
|
CompileNASM_ret="no"
|
||||||
fi
|
fi
|
||||||
if test "x$NASM" != x -a "x$NASM" != x'"$NASM"'; then
|
rm -f $1 $1.o
|
||||||
AC_DEFINE(SDL_HERMES_BLITTERS)
|
AC_MSG_RESULT($CompileNASM_ret)
|
||||||
SOURCES="$SOURCES $srcdir/src/hermes/*.asm"
|
test "$CompileNASM_ret" = "yes"
|
||||||
|
}
|
||||||
|
|
||||||
if test x"$NASMFLAGS" = x; then
|
if test x"$NASMFLAGS" = x; then
|
||||||
case $ARCH in
|
case $ARCH in
|
||||||
win32)
|
win32)
|
||||||
|
@ -620,15 +702,26 @@ AC_HELP_STRING([--enable-nasm], [use nasm assembly blitters on x86 [[default=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
NASMFLAGS="$NASMFLAGS -i $srcdir/src/hermes/"
|
|
||||||
|
AC_PATH_PROG(NASM, yasm)
|
||||||
|
echo "%ifidn __OUTPUT_FORMAT__,elf" > unquoted-sections
|
||||||
|
echo "section .note.GNU-stack noalloc noexec nowrite progbits" >> unquoted-sections
|
||||||
|
echo "%endif" >> unquoted-sections
|
||||||
|
CompileNASM unquoted-sections || NASM=""
|
||||||
|
|
||||||
|
if test "x$NASM" = x -o "x$NASM" = x'"$NASM"'; then
|
||||||
|
$as_unset ac_cv_path_NASM
|
||||||
|
AC_PATH_PROG(NASM, nasm)
|
||||||
|
fi
|
||||||
|
if test "x$NASM" != x -a "x$NASM" != x'"$NASM"'; then
|
||||||
|
AC_DEFINE(SDL_HERMES_BLITTERS)
|
||||||
|
SOURCES="$SOURCES $srcdir/src/hermes/*.asm"
|
||||||
|
NASMFLAGS="$NASMFLAGS -I $srcdir/src/hermes/"
|
||||||
|
|
||||||
dnl See if hidden visibility is supported
|
dnl See if hidden visibility is supported
|
||||||
echo "GLOBAL _bar:function hidden" > nasm_vis.asm
|
echo "GLOBAL _bar:function hidden" > symbol-visibility
|
||||||
echo "_bar:" >>nasm_vis.asm
|
echo "_bar:" >> symbol-visibility
|
||||||
if $NASM $NASMFLAGS nasm_vis.asm -o nasm_vis.o >&AS_MESSAGE_LOG_FD 2>&1; then
|
CompileNASM symbol-visibility && NASMFLAGS="$NASMFLAGS -DHIDDEN_VISIBILITY"
|
||||||
NASMFLAGS="$NASMFLAGS -DHIDDEN_VISIBILITY"
|
|
||||||
fi
|
|
||||||
rm -f nasm_vis.asm nasm_vis.o
|
|
||||||
|
|
||||||
AC_SUBST(NASM)
|
AC_SUBST(NASM)
|
||||||
AC_SUBST(NASMFLAGS)
|
AC_SUBST(NASMFLAGS)
|
||||||
|
@ -844,7 +937,7 @@ AC_HELP_STRING([--enable-x11-shared], [dynamically load X11 support [[default=ma
|
||||||
x11ext_lib='libXext.so'
|
x11ext_lib='libXext.so'
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
x11_lib_spec=[`echo $X_LIBS | sed 's/.*-L\([^ ]*\).*/\1/'`]
|
x11_lib_path=[`echo $X_LIBS | sed 's/.*-L\([^ ]*\).*/\1/'`]
|
||||||
for path in $x11_lib_path /usr/lib /usr/X11/lib /usr/X11R6/lib; do
|
for path in $x11_lib_path /usr/lib /usr/X11/lib /usr/X11R6/lib; do
|
||||||
if test "x$x11_lib" = "x"; then
|
if test "x$x11_lib" = "x"; then
|
||||||
x11_lib=[`ls -- $path/libX11.so.[0-9] 2>/dev/null | sort -r | sed 's/.*\/\(.*\)/\1/; q'`]
|
x11_lib=[`ls -- $path/libX11.so.[0-9] 2>/dev/null | sort -r | sed 's/.*\/\(.*\)/\1/; q'`]
|
||||||
|
@ -1118,6 +1211,7 @@ AC_HELP_STRING([--enable-video-fbcon], [use framebuffer console video driver [[d
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT($video_fbcon)
|
AC_MSG_RESULT($video_fbcon)
|
||||||
if test x$video_fbcon = xyes; then
|
if test x$video_fbcon = xyes; then
|
||||||
|
AC_CHECK_FUNCS(getpagesize)
|
||||||
AC_DEFINE(SDL_VIDEO_DRIVER_FBCON)
|
AC_DEFINE(SDL_VIDEO_DRIVER_FBCON)
|
||||||
SOURCES="$SOURCES $srcdir/src/video/fbcon/*.c"
|
SOURCES="$SOURCES $srcdir/src/video/fbcon/*.c"
|
||||||
have_video=yes
|
have_video=yes
|
||||||
|
@ -1466,6 +1560,7 @@ CheckOpenGLX11()
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
],[
|
],[
|
||||||
],[
|
],[
|
||||||
video_opengl=yes
|
video_opengl=yes
|
||||||
|
@ -1676,7 +1771,7 @@ AC_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [[default=yes]]])
|
||||||
;;
|
;;
|
||||||
*-*-netbsd*)
|
*-*-netbsd*)
|
||||||
pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
|
pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
|
||||||
pthread_lib="-L/usr/lib -lpthread"
|
pthread_lib="-lpthread"
|
||||||
;;
|
;;
|
||||||
*-*-openbsd*)
|
*-*-openbsd*)
|
||||||
pthread_cflags="-D_REENTRANT"
|
pthread_cflags="-D_REENTRANT"
|
||||||
|
@ -2019,8 +2114,13 @@ CheckUSBHID()
|
||||||
#if defined(HAVE_USB_H)
|
#if defined(HAVE_USB_H)
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __DragonFly__
|
||||||
|
#include <bus/usb/usb.h>
|
||||||
|
#include <bus/usb/usbhid.h>
|
||||||
|
#else
|
||||||
#include <dev/usb/usb.h>
|
#include <dev/usb/usb.h>
|
||||||
#include <dev/usb/usbhid.h>
|
#include <dev/usb/usbhid.h>
|
||||||
|
#endif
|
||||||
#if defined(HAVE_USBHID_H)
|
#if defined(HAVE_USBHID_H)
|
||||||
#include <usbhid.h>
|
#include <usbhid.h>
|
||||||
#elif defined(HAVE_LIBUSB_H)
|
#elif defined(HAVE_LIBUSB_H)
|
||||||
|
@ -2141,6 +2241,7 @@ case "$host" in
|
||||||
CheckALSA
|
CheckALSA
|
||||||
CheckARTSC
|
CheckARTSC
|
||||||
CheckESD
|
CheckESD
|
||||||
|
CheckPulseAudio
|
||||||
CheckNAS
|
CheckNAS
|
||||||
CheckX11
|
CheckX11
|
||||||
CheckNANOX
|
CheckNANOX
|
||||||
|
@ -2278,7 +2379,7 @@ case "$host" in
|
||||||
ARCH=win32
|
ARCH=win32
|
||||||
if test "$build" != "$host"; then # cross-compiling
|
if test "$build" != "$host"; then # cross-compiling
|
||||||
# Default cross-compile location
|
# Default cross-compile location
|
||||||
ac_default_prefix=/usr/local/cross-tools/i386-mingw32msvc
|
ac_default_prefix=/usr/local/cross-tools/i386-mingw32
|
||||||
else
|
else
|
||||||
# Look for the location of the tools and install there
|
# Look for the location of the tools and install there
|
||||||
if test "$BUILD_PREFIX" != ""; then
|
if test "$BUILD_PREFIX" != ""; then
|
||||||
|
@ -2341,6 +2442,7 @@ case "$host" in
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -ldxguid"
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -ldxguid"
|
||||||
fi
|
fi
|
||||||
# The Win32 platform requires special setup
|
# The Win32 platform requires special setup
|
||||||
|
SOURCES="$SOURCES $srcdir/src/main/win32/*.rc"
|
||||||
SDLMAIN_SOURCES="$srcdir/src/main/win32/*.c"
|
SDLMAIN_SOURCES="$srcdir/src/main/win32/*.c"
|
||||||
SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
|
SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
|
||||||
SDL_LIBS="-lmingw32 -lSDLmain $SDL_LIBS -mwindows"
|
SDL_LIBS="-lmingw32 -lSDLmain $SDL_LIBS -mwindows"
|
||||||
|
@ -2417,10 +2519,7 @@ case "$host" in
|
||||||
CheckDiskAudio
|
CheckDiskAudio
|
||||||
CheckDummyAudio
|
CheckDummyAudio
|
||||||
CheckDLOPEN
|
CheckDLOPEN
|
||||||
|
CheckNASM
|
||||||
# Temporarily disabled:
|
|
||||||
# ld: mmxp2_32.o has external relocation entries in non-writable section (__TEXT,__text) for symbols: _mmxreturn
|
|
||||||
#CheckNASM
|
|
||||||
|
|
||||||
# Set up files for the shared object loading library
|
# Set up files for the shared object loading library
|
||||||
# (this needs to be done before the dynamic X11 check)
|
# (this needs to be done before the dynamic X11 check)
|
||||||
|
@ -2453,8 +2552,8 @@ case "$host" in
|
||||||
if test x$enable_joystick = xyes; then
|
if test x$enable_joystick = xyes; then
|
||||||
AC_DEFINE(SDL_JOYSTICK_IOKIT)
|
AC_DEFINE(SDL_JOYSTICK_IOKIT)
|
||||||
SOURCES="$SOURCES $srcdir/src/joystick/darwin/*.c"
|
SOURCES="$SOURCES $srcdir/src/joystick/darwin/*.c"
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,IOKit"
|
|
||||||
have_joystick=yes
|
have_joystick=yes
|
||||||
|
need_iokit_framework=yes
|
||||||
fi
|
fi
|
||||||
# Set up files for the cdrom library
|
# Set up files for the cdrom library
|
||||||
if test x$enable_cdrom = xyes; then
|
if test x$enable_cdrom = xyes; then
|
||||||
|
@ -2474,6 +2573,7 @@ case "$host" in
|
||||||
SDL_LIBS="-lSDLmain $SDL_LIBS"
|
SDL_LIBS="-lSDLmain $SDL_LIBS"
|
||||||
if test x$enable_video_cocoa = xyes; then
|
if test x$enable_video_cocoa = xyes; then
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Cocoa"
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Cocoa"
|
||||||
|
need_iokit_framework=yes
|
||||||
fi
|
fi
|
||||||
if test x$enable_video_carbon = xyes -o x$enable_video_cocoa = xyes; then
|
if test x$enable_video_carbon = xyes -o x$enable_video_cocoa = xyes; then
|
||||||
# The Cocoa backend still needs Carbon, and the YUV code QuickTime
|
# The Cocoa backend still needs Carbon, and the YUV code QuickTime
|
||||||
|
@ -2484,6 +2584,10 @@ case "$host" in
|
||||||
if test x$enable_audio = xyes -o x$enable_cdrom = xyes; then
|
if test x$enable_audio = xyes -o x$enable_cdrom = xyes; then
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,AudioToolbox -Wl,-framework,AudioUnit"
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,AudioToolbox -Wl,-framework,AudioUnit"
|
||||||
fi
|
fi
|
||||||
|
# Some subsystems reference IOKit...
|
||||||
|
if test x$need_iokit_framework = xyes; then
|
||||||
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,IOKit"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*-*-mint*)
|
*-*-mint*)
|
||||||
ARCH=mint
|
ARCH=mint
|
||||||
|
@ -2564,12 +2668,14 @@ case "$host" in
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Verify that we have all the platform specific files we need
|
# Verify that we have all the platform specific files we need
|
||||||
if test x$have_joystick != xyes; then
|
|
||||||
if test x$enable_joystick = xyes; then
|
if test x$enable_joystick = xyes; then
|
||||||
AC_DEFINE(SDL_JOYSTICK_DISABLED)
|
if test x$have_joystick != xyes; then
|
||||||
fi
|
# Wants joystick subsystem, but doesn't have a platform-specific backend...
|
||||||
|
AC_DEFINE(SDL_JOYSTICK_DUMMY)
|
||||||
SOURCES="$SOURCES $srcdir/src/joystick/dummy/*.c"
|
SOURCES="$SOURCES $srcdir/src/joystick/dummy/*.c"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
if test x$have_cdrom != xyes; then
|
if test x$have_cdrom != xyes; then
|
||||||
if test x$enable_cdrom = xyes; then
|
if test x$enable_cdrom = xyes; then
|
||||||
AC_DEFINE(SDL_CDROM_DISABLED)
|
AC_DEFINE(SDL_CDROM_DISABLED)
|
||||||
|
@ -2603,6 +2709,7 @@ OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.cc,$(objects)/\1.lo,g'`
|
||||||
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.m,$(objects)/\1.lo,g'`
|
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.m,$(objects)/\1.lo,g'`
|
||||||
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`
|
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`
|
||||||
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.S,$(objects)/\1.lo,g'`
|
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.S,$(objects)/\1.lo,g'`
|
||||||
|
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.rc,$(objects)/\1.o,g'`
|
||||||
|
|
||||||
SDLMAIN_OBJECTS=`echo $SDLMAIN_SOURCES | sed 's,[[^ ]]*/\([[^ ]]*\)\.cc,$(objects)/\1.o,g'`
|
SDLMAIN_OBJECTS=`echo $SDLMAIN_SOURCES | sed 's,[[^ ]]*/\([[^ ]]*\)\.cc,$(objects)/\1.o,g'`
|
||||||
SDLMAIN_OBJECTS=`echo $SDLMAIN_OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.m,$(objects)/\1.o,g'`
|
SDLMAIN_OBJECTS=`echo $SDLMAIN_OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.m,$(objects)/\1.o,g'`
|
||||||
|
@ -2612,10 +2719,10 @@ SDLMAIN_OBJECTS=`echo $SDLMAIN_OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects
|
||||||
|
|
||||||
if test "x$enable_rpath" = "xyes"; then
|
if test "x$enable_rpath" = "xyes"; then
|
||||||
if test $ARCH = bsdi -o $ARCH = freebsd -o $ARCH = irix -o $ARCH = linux -o $ARCH = netbsd; then
|
if test $ARCH = bsdi -o $ARCH = freebsd -o $ARCH = irix -o $ARCH = linux -o $ARCH = netbsd; then
|
||||||
SDL_RLD_FLAGS="-Wl,-rpath,\${exec_prefix}/lib"
|
SDL_RLD_FLAGS="-Wl,-rpath,\${libdir}"
|
||||||
fi
|
fi
|
||||||
if test $ARCH = solaris; then
|
if test $ARCH = solaris; then
|
||||||
SDL_RLD_FLAGS="-R\${exec_prefix}/lib"
|
SDL_RLD_FLAGS="-R\${libdir}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
SDL_RLD_FLAGS=""
|
SDL_RLD_FLAGS=""
|
||||||
|
@ -2630,7 +2737,7 @@ case "$ARCH" in
|
||||||
SDL_LIBS="$SDL_LIBS -Wl,-framework,Carbon"
|
SDL_LIBS="$SDL_LIBS -Wl,-framework,Carbon"
|
||||||
fi
|
fi
|
||||||
# Evil hack to allow static linking on Mac OS X
|
# Evil hack to allow static linking on Mac OS X
|
||||||
SDL_STATIC_LIBS="\${exec_prefix}/lib/libSDLmain.a \${exec_prefix}/lib/libSDL.a $EXTRA_LDFLAGS"
|
SDL_STATIC_LIBS="\${libdir}/libSDLmain.a \${libdir}/libSDL.a $EXTRA_LDFLAGS"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
SDL_STATIC_LIBS="$SDL_LIBS"
|
SDL_STATIC_LIBS="$SDL_LIBS"
|
||||||
|
@ -2672,6 +2779,7 @@ AC_SUBST(BUILD_CFLAGS)
|
||||||
AC_SUBST(EXTRA_CFLAGS)
|
AC_SUBST(EXTRA_CFLAGS)
|
||||||
AC_SUBST(BUILD_LDFLAGS)
|
AC_SUBST(BUILD_LDFLAGS)
|
||||||
AC_SUBST(EXTRA_LDFLAGS)
|
AC_SUBST(EXTRA_LDFLAGS)
|
||||||
|
AC_SUBST(WINDRES)
|
||||||
|
|
||||||
AC_OUTPUT([
|
AC_OUTPUT([
|
||||||
Makefile sdl-config SDL.spec SDL.qpg sdl.pc
|
Makefile sdl-config SDL.spec SDL.qpg sdl.pc
|
||||||
|
|
145
docs.html
145
docs.html
|
@ -14,6 +14,151 @@ The latest stable release may be found on the
|
||||||
|
|
||||||
<H2> <A HREF="docs/index.html">API Documentation</A> </H2>
|
<H2> <A HREF="docs/index.html">API Documentation</A> </H2>
|
||||||
|
|
||||||
|
<H2> SDL 1.2.12 Release Notes </H2>
|
||||||
|
<P>
|
||||||
|
SDL 1.2.12 is a minor bug fix release.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<H3> General Notes </H3>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
Added support for the PulseAudio sound server: http://www.pulseaudio.org/
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Added SDL_VIDEO_ALLOW_SCREENSAVER to override SDL's disabling of the screensaver on Mac OS X, Windows, and X11.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed buffer overrun crash when resampling audio rates.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed audio bug where converting to mono was doubling the volume.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed off-by-one error in the C implementation of SDL_revcpy()
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed compiling with Sun Studio.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Support for AmigaOS has been removed from the main SDL code.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Support for Nokia 9210 "EPOC" driver has been removed from the main SDL code.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Unofficial support for the S60/SymbianOS platform has been added.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Unofficial support for the Nintendo DS platform has been added.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Reenabled MMX assembly for YUV overlay processing (GNU C Compiler only).
|
||||||
|
</P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H3> Unix Notes </H3>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
Fixed detection of X11 DGA mouse support.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Improved XIM support for asian character sets.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
The GFX_Display has been added to the X11 window information in SDL_syswm.h.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed PAGE_SIZE compile error in the fbcon video driver on newer Linux kernels.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed hang or crash at startup if aRts can't access the hardware.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed relative mouse mode when the cursor starts outside the X11 window.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed accidental free of stack memory in X11 mouse acceleration code.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Closed minor memory leak in XME code.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed TEXTRELs in the library to resolve some PIC issues.
|
||||||
|
</P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H3> Windows Notes </H3>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
The GDI video driver makes better use of the palette in 8-bit modes.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
The windib driver now supports more mouse buttons with WM_XBUTTON events.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
On Windows, SDL_SetVideoMode() will re-create the window instead of failing if the multisample settings are changed.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Added support for UTF-8 window titles on Windows.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed joystick detection on Windows.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Improved performance with Win32 file I/O.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed HBITMAP leak in GAPI driver.
|
||||||
|
</P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H3> Mac OS X Notes </H3>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
Added support for multi-axis controllers like 3Dconnxion's SpaceNavigator on Mac OS X.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed YUV overlay crash inside Quicktime on Intel Mac OS X.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed blitting alignment in Altivec alpha blit functions.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Keys F13, F14, and F15 are now usable on Apple keyboards under Mac OS X.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed joystick calibration code on Mac OS X.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed mouse jitter when multiple motion events are queued up in Mac OS X.
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
Fixed changing the cursor in fullscreen mode on Mac OS X.
|
||||||
|
</P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H3> Mac OS Classic Notes </H3>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
Added support for gamma ramps to both toolbox and DrawSprocket video drivers.
|
||||||
|
</P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H3> BeOS Notes </H3>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
Implemented mouse grabbing and mouse relative mode on BeOS.
|
||||||
|
</P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<IMG SRC="docs/images/rainbow.gif" ALT="[separator]" WIDTH="100%">
|
||||||
|
|
||||||
<H2> SDL 1.2.11 Release Notes </H2>
|
<H2> SDL 1.2.11 Release Notes </H2>
|
||||||
<P>
|
<P>
|
||||||
SDL 1.2.11 is a minor bug fix release.
|
SDL 1.2.11 is a minor bug fix release.
|
||||||
|
|
|
@ -436,21 +436,6 @@ ALIGN="LEFT"
|
||||||
VALIGN="TOP"
|
VALIGN="TOP"
|
||||||
><TT
|
><TT
|
||||||
CLASS="LITERAL"
|
CLASS="LITERAL"
|
||||||
>epoc</TT
|
|
||||||
></TD
|
|
||||||
><TD
|
|
||||||
ALIGN="LEFT"
|
|
||||||
VALIGN="TOP"
|
|
||||||
><P
|
|
||||||
>(Epoc)</P
|
|
||||||
></TD
|
|
||||||
></TR
|
|
||||||
><TR
|
|
||||||
><TD
|
|
||||||
ALIGN="LEFT"
|
|
||||||
VALIGN="TOP"
|
|
||||||
><TT
|
|
||||||
CLASS="LITERAL"
|
|
||||||
>dummy</TT
|
>dummy</TT
|
||||||
></TD
|
></TD
|
||||||
><TD
|
><TD
|
||||||
|
|
|
@ -102,7 +102,7 @@ CLASS="FUNCSYNOPSISINFO"
|
||||||
><CODE
|
><CODE
|
||||||
><CODE
|
><CODE
|
||||||
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
||||||
>void *<B
|
>void <B
|
||||||
CLASS="FSFUNC"
|
CLASS="FSFUNC"
|
||||||
>SDL_SetCursor</B
|
>SDL_SetCursor</B
|
||||||
></CODE
|
></CODE
|
||||||
|
|
|
@ -5,7 +5,7 @@ SDL_SetCursor\- Set the currently active mouse cursor\&.
|
||||||
.PP
|
.PP
|
||||||
\fB#include "SDL\&.h"
|
\fB#include "SDL\&.h"
|
||||||
.sp
|
.sp
|
||||||
\fBvoid *\fBSDL_SetCursor\fP\fR(\fBSDL_Cursor *cursor\fR);
|
\fBvoid \fBSDL_SetCursor\fP\fR(\fBSDL_Cursor *cursor\fR);
|
||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
.PP
|
.PP
|
||||||
Sets the currently active cursor to the specified one\&. If the cursor is currently visible, the change will be immediately represented on the display\&.
|
Sets the currently active cursor to the specified one\&. If the cursor is currently visible, the change will be immediately represented on the display\&.
|
||||||
|
|
|
@ -26,14 +26,14 @@
|
||||||
#include "SDL_platform.h"
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
/* Add any platform that doesn't build using the configure system */
|
/* Add any platform that doesn't build using the configure system */
|
||||||
#if defined(__AMIGA__)
|
#if defined(__DREAMCAST__)
|
||||||
#include "SDL_config_amiga.h"
|
|
||||||
#elif defined(__DREAMCAST__)
|
|
||||||
#include "SDL_config_dreamcast.h"
|
#include "SDL_config_dreamcast.h"
|
||||||
#elif defined(__MACOS__)
|
#elif defined(__MACOS__)
|
||||||
#include "SDL_config_macos.h"
|
#include "SDL_config_macos.h"
|
||||||
#elif defined(__MACOSX__)
|
#elif defined(__MACOSX__)
|
||||||
#include "SDL_config_macosx.h"
|
#include "SDL_config_macosx.h"
|
||||||
|
#elif defined(__SYMBIAN32__)
|
||||||
|
#include "SDL_config_symbian.h" /* must be before win32! */
|
||||||
#elif defined(__WIN32__)
|
#elif defined(__WIN32__)
|
||||||
#include "SDL_config_win32.h"
|
#include "SDL_config_win32.h"
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
|
|
|
@ -28,6 +28,11 @@
|
||||||
/* General platform specific identifiers */
|
/* General platform specific identifiers */
|
||||||
#include "SDL_platform.h"
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* Make sure that this isn't included by Visual C++ */
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#error You should copy include/SDL_config.h.default to include/SDL_config.h
|
||||||
|
#endif
|
||||||
|
|
||||||
/* C language features */
|
/* C language features */
|
||||||
#undef const
|
#undef const
|
||||||
#undef inline
|
#undef inline
|
||||||
|
@ -130,6 +135,7 @@
|
||||||
#undef HAVE_NANOSLEEP
|
#undef HAVE_NANOSLEEP
|
||||||
#undef HAVE_CLOCK_GETTIME
|
#undef HAVE_CLOCK_GETTIME
|
||||||
#undef HAVE_DLVSYM
|
#undef HAVE_DLVSYM
|
||||||
|
#undef HAVE_GETPAGESIZE
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* We may need some replacement for stdarg.h here */
|
/* We may need some replacement for stdarg.h here */
|
||||||
|
@ -149,7 +155,6 @@
|
||||||
#undef SDL_VIDEO_DISABLED
|
#undef SDL_VIDEO_DISABLED
|
||||||
|
|
||||||
/* Enable various audio drivers */
|
/* Enable various audio drivers */
|
||||||
#undef SDL_AUDIO_DRIVER_AHI
|
|
||||||
#undef SDL_AUDIO_DRIVER_ALSA
|
#undef SDL_AUDIO_DRIVER_ALSA
|
||||||
#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC
|
#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC
|
||||||
#undef SDL_AUDIO_DRIVER_ARTS
|
#undef SDL_AUDIO_DRIVER_ARTS
|
||||||
|
@ -163,6 +168,8 @@
|
||||||
#undef SDL_AUDIO_DRIVER_DUMMY
|
#undef SDL_AUDIO_DRIVER_DUMMY
|
||||||
#undef SDL_AUDIO_DRIVER_DMEDIA
|
#undef SDL_AUDIO_DRIVER_DMEDIA
|
||||||
#undef SDL_AUDIO_DRIVER_DSOUND
|
#undef SDL_AUDIO_DRIVER_DSOUND
|
||||||
|
#undef SDL_AUDIO_DRIVER_PULSE
|
||||||
|
#undef SDL_AUDIO_DRIVER_PULSE_DYNAMIC
|
||||||
#undef SDL_AUDIO_DRIVER_ESD
|
#undef SDL_AUDIO_DRIVER_ESD
|
||||||
#undef SDL_AUDIO_DRIVER_ESD_DYNAMIC
|
#undef SDL_AUDIO_DRIVER_ESD_DYNAMIC
|
||||||
#undef SDL_AUDIO_DRIVER_MINT
|
#undef SDL_AUDIO_DRIVER_MINT
|
||||||
|
@ -195,7 +202,6 @@
|
||||||
|
|
||||||
/* Enable various input drivers */
|
/* Enable various input drivers */
|
||||||
#undef SDL_INPUT_TSLIB
|
#undef SDL_INPUT_TSLIB
|
||||||
#undef SDL_JOYSTICK_AMIGA
|
|
||||||
#undef SDL_JOYSTICK_BEOS
|
#undef SDL_JOYSTICK_BEOS
|
||||||
#undef SDL_JOYSTICK_DC
|
#undef SDL_JOYSTICK_DC
|
||||||
#undef SDL_JOYSTICK_DUMMY
|
#undef SDL_JOYSTICK_DUMMY
|
||||||
|
@ -221,10 +227,8 @@
|
||||||
#undef SDL_LOADSO_WIN32
|
#undef SDL_LOADSO_WIN32
|
||||||
|
|
||||||
/* Enable various threading systems */
|
/* Enable various threading systems */
|
||||||
#undef SDL_THREAD_AMIGA
|
|
||||||
#undef SDL_THREAD_BEOS
|
#undef SDL_THREAD_BEOS
|
||||||
#undef SDL_THREAD_DC
|
#undef SDL_THREAD_DC
|
||||||
#undef SDL_THREAD_EPOC
|
|
||||||
#undef SDL_THREAD_OS2
|
#undef SDL_THREAD_OS2
|
||||||
#undef SDL_THREAD_PTH
|
#undef SDL_THREAD_PTH
|
||||||
#undef SDL_THREAD_PTHREAD
|
#undef SDL_THREAD_PTHREAD
|
||||||
|
@ -234,11 +238,9 @@
|
||||||
#undef SDL_THREAD_WIN32
|
#undef SDL_THREAD_WIN32
|
||||||
|
|
||||||
/* Enable various timer systems */
|
/* Enable various timer systems */
|
||||||
#undef SDL_TIMER_AMIGA
|
|
||||||
#undef SDL_TIMER_BEOS
|
#undef SDL_TIMER_BEOS
|
||||||
#undef SDL_TIMER_DC
|
#undef SDL_TIMER_DC
|
||||||
#undef SDL_TIMER_DUMMY
|
#undef SDL_TIMER_DUMMY
|
||||||
#undef SDL_TIMER_EPOC
|
|
||||||
#undef SDL_TIMER_MACOS
|
#undef SDL_TIMER_MACOS
|
||||||
#undef SDL_TIMER_MINT
|
#undef SDL_TIMER_MINT
|
||||||
#undef SDL_TIMER_OS2
|
#undef SDL_TIMER_OS2
|
||||||
|
@ -250,14 +252,12 @@
|
||||||
/* Enable various video drivers */
|
/* Enable various video drivers */
|
||||||
#undef SDL_VIDEO_DRIVER_AALIB
|
#undef SDL_VIDEO_DRIVER_AALIB
|
||||||
#undef SDL_VIDEO_DRIVER_BWINDOW
|
#undef SDL_VIDEO_DRIVER_BWINDOW
|
||||||
#undef SDL_VIDEO_DRIVER_CYBERGRAPHICS
|
|
||||||
#undef SDL_VIDEO_DRIVER_DC
|
#undef SDL_VIDEO_DRIVER_DC
|
||||||
#undef SDL_VIDEO_DRIVER_DDRAW
|
#undef SDL_VIDEO_DRIVER_DDRAW
|
||||||
#undef SDL_VIDEO_DRIVER_DGA
|
#undef SDL_VIDEO_DRIVER_DGA
|
||||||
#undef SDL_VIDEO_DRIVER_DIRECTFB
|
#undef SDL_VIDEO_DRIVER_DIRECTFB
|
||||||
#undef SDL_VIDEO_DRIVER_DRAWSPROCKET
|
#undef SDL_VIDEO_DRIVER_DRAWSPROCKET
|
||||||
#undef SDL_VIDEO_DRIVER_DUMMY
|
#undef SDL_VIDEO_DRIVER_DUMMY
|
||||||
#undef SDL_VIDEO_DRIVER_EPOC
|
|
||||||
#undef SDL_VIDEO_DRIVER_FBCON
|
#undef SDL_VIDEO_DRIVER_FBCON
|
||||||
#undef SDL_VIDEO_DRIVER_GAPI
|
#undef SDL_VIDEO_DRIVER_GAPI
|
||||||
#undef SDL_VIDEO_DRIVER_GEM
|
#undef SDL_VIDEO_DRIVER_GEM
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2006 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _SDL_config_amiga_h
|
|
||||||
#define _SDL_config_amiga_h
|
|
||||||
|
|
||||||
#include "SDL_platform.h"
|
|
||||||
|
|
||||||
/* This is a set of defines to configure the SDL features */
|
|
||||||
|
|
||||||
#define SDL_HAS_64BIT_TYPE 1
|
|
||||||
|
|
||||||
/* Useful headers */
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
#define HAVE_STDIO_H 1
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
#define HAVE_SIGNAL_H 1
|
|
||||||
|
|
||||||
/* C library functions */
|
|
||||||
#define HAVE_MALLOC 1
|
|
||||||
#define HAVE_CALLOC 1
|
|
||||||
#define HAVE_REALLOC 1
|
|
||||||
#define HAVE_FREE 1
|
|
||||||
#define HAVE_ALLOCA 1
|
|
||||||
#define HAVE_GETENV 1
|
|
||||||
#define HAVE_PUTENV 1
|
|
||||||
#define HAVE_MEMSET 1
|
|
||||||
#define HAVE_MEMCPY 1
|
|
||||||
#define HAVE_MEMMOVE 1
|
|
||||||
#define HAVE_MEMCMP 1
|
|
||||||
|
|
||||||
/* Enable various audio drivers */
|
|
||||||
#define SDL_AUDIO_DRIVER_AHI 1
|
|
||||||
#define SDL_AUDIO_DRIVER_DISK 1
|
|
||||||
#define SDL_AUDIO_DRIVER_DUMMY 1
|
|
||||||
|
|
||||||
/* Enable various cdrom drivers */
|
|
||||||
#define SDL_CDROM_DUMMY 1
|
|
||||||
|
|
||||||
/* Enable various input drivers */
|
|
||||||
#define SDL_JOYSTICK_AMIGA 1
|
|
||||||
|
|
||||||
/* Enable various shared object loading systems */
|
|
||||||
#define SDL_LOADSO_DUMMY 1
|
|
||||||
|
|
||||||
/* Enable various threading systems */
|
|
||||||
#define SDL_THREAD_AMIGA 1
|
|
||||||
|
|
||||||
/* Enable various timer systems */
|
|
||||||
#define SDL_TIMER_AMIGA 1
|
|
||||||
|
|
||||||
/* Enable various video drivers */
|
|
||||||
#define SDL_VIDEO_DRIVER_CYBERGRAPHICS 1
|
|
||||||
#define SDL_VIDEO_DRIVER_DUMMY 1
|
|
||||||
|
|
||||||
/* Enable OpenGL support */
|
|
||||||
#define SDL_VIDEO_OPENGL 1
|
|
||||||
|
|
||||||
#endif /* _SDL_config_amiga_h */
|
|
|
@ -25,6 +25,9 @@
|
||||||
|
|
||||||
#include "SDL_platform.h"
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */
|
||||||
|
#include <AvailabilityMacros.h>
|
||||||
|
|
||||||
/* This is a set of defines to configure the SDL features */
|
/* This is a set of defines to configure the SDL features */
|
||||||
|
|
||||||
#define SDL_HAS_64BIT_TYPE 1
|
#define SDL_HAS_64BIT_TYPE 1
|
||||||
|
@ -114,7 +117,7 @@
|
||||||
|
|
||||||
/* Enable various video drivers */
|
/* Enable various video drivers */
|
||||||
#define SDL_VIDEO_DRIVER_DUMMY 1
|
#define SDL_VIDEO_DRIVER_DUMMY 1
|
||||||
#if TARGET_API_MAC_CARBON
|
#if ((defined TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON))
|
||||||
#define SDL_VIDEO_DRIVER_TOOLBOX 1
|
#define SDL_VIDEO_DRIVER_TOOLBOX 1
|
||||||
#else
|
#else
|
||||||
#define SDL_VIDEO_DRIVER_QUARTZ 1
|
#define SDL_VIDEO_DRIVER_QUARTZ 1
|
||||||
|
|
115
include/SDL_config_nds.h
Normal file
115
include/SDL_config_nds.h
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2006 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SDL_config_nds_h
|
||||||
|
#define _SDL_config_nds_h
|
||||||
|
|
||||||
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* This is a set of defines to configure the SDL features */
|
||||||
|
|
||||||
|
/* General platform specific identifiers */
|
||||||
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* C datatypes */
|
||||||
|
#define SDL_HAS_64BIT_TYPE 1
|
||||||
|
|
||||||
|
/* Endianness */
|
||||||
|
#define SDL_BYTEORDER 1234
|
||||||
|
|
||||||
|
/* Useful headers */
|
||||||
|
#define HAVE_ALLOCA_H 1
|
||||||
|
#define HAVE_SYS_TYPES_H 1
|
||||||
|
#define HAVE_STDIO_H 1
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
#define HAVE_STDLIB_H 1
|
||||||
|
#define HAVE_STDARG_H 1
|
||||||
|
#define HAVE_MALLOC_H 1
|
||||||
|
#define HAVE_STRING_H 1
|
||||||
|
#define HAVE_INTTYPES_H 1
|
||||||
|
#define HAVE_STDINT_H 1
|
||||||
|
#define HAVE_CTYPE_H 1
|
||||||
|
#define HAVE_MATH_H 1
|
||||||
|
#define HAVE_ICONV_H 1
|
||||||
|
#define HAVE_SIGNAL_H 1
|
||||||
|
|
||||||
|
/* C library functions */
|
||||||
|
#define HAVE_MALLOC 1
|
||||||
|
#define HAVE_CALLOC 1
|
||||||
|
#define HAVE_REALLOC 1
|
||||||
|
#define HAVE_FREE 1
|
||||||
|
#define HAVE_ALLOCA 1
|
||||||
|
#define HAVE_GETENV 1
|
||||||
|
#define HAVE_PUTENV 1
|
||||||
|
#define HAVE_UNSETENV 1
|
||||||
|
#define HAVE_QSORT 1
|
||||||
|
#define HAVE_ABS 1
|
||||||
|
#define HAVE_BCOPY 1
|
||||||
|
#define HAVE_MEMSET 1
|
||||||
|
#define HAVE_MEMCPY 1
|
||||||
|
#define HAVE_MEMMOVE 1
|
||||||
|
#define HAVE_STRLEN 1
|
||||||
|
#define HAVE_STRLCPY 1
|
||||||
|
#define HAVE_STRLCAT 1
|
||||||
|
#define HAVE_STRDUP 1
|
||||||
|
#define HAVE_STRCHR 1
|
||||||
|
#define HAVE_STRRCHR 1
|
||||||
|
#define HAVE_STRSTR 1
|
||||||
|
#define HAVE_STRTOL 1
|
||||||
|
#define HAVE_STRTOUL 1
|
||||||
|
#define HAVE_STRTOLL 1
|
||||||
|
#define HAVE_STRTOULL 1
|
||||||
|
#define HAVE_ATOI 1
|
||||||
|
#define HAVE_ATOF 1
|
||||||
|
#define HAVE_STRCMP 1
|
||||||
|
#define HAVE_STRNCMP 1
|
||||||
|
#define HAVE_STRCASECMP 1
|
||||||
|
#define HAVE_STRNCASECMP 1
|
||||||
|
#define HAVE_SSCANF 1
|
||||||
|
#define HAVE_SNPRINTF 1
|
||||||
|
#define HAVE_VSNPRINTF 1
|
||||||
|
#define HAVE_SETJMP 1
|
||||||
|
|
||||||
|
/* Enable various audio drivers */
|
||||||
|
#define SDL_AUDIO_DRIVER_NDS 1
|
||||||
|
#define SDL_AUDIO_DRIVER_DUMMY 1
|
||||||
|
|
||||||
|
/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */
|
||||||
|
#define SDL_CDROM_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable various input drivers */
|
||||||
|
#define SDL_JOYSTICK_NDS 1
|
||||||
|
|
||||||
|
/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */
|
||||||
|
#define SDL_LOADSO_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable the stub thread support (src/thread/generic/\*.c) */
|
||||||
|
#define SDL_THREADS_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable various timer systems */
|
||||||
|
#define SDL_TIMER_NDS 1
|
||||||
|
|
||||||
|
/* Enable various video drivers */
|
||||||
|
#define SDL_VIDEO_DRIVER_NDS 1
|
||||||
|
#define SDL_VIDEO_DRIVER_DUMMY 1
|
||||||
|
|
||||||
|
#endif /* _SDL_config_nds_h */
|
146
include/SDL_config_symbian.h
Normal file
146
include/SDL_config_symbian.h
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2006 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Symbian version Markus Mertama
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SDL_CONFIG_SYMBIAN_H
|
||||||
|
#define _SDL_CONFIG_SYMBIAN_H
|
||||||
|
|
||||||
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* This is the minimal configuration that can be used to build SDL */
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __GCCE__
|
||||||
|
#define SYMBIAN32_GCCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _SIZE_T_DEFINED
|
||||||
|
typedef unsigned int size_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _INTPTR_T_DECLARED
|
||||||
|
typedef unsigned int uintptr_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _INT8_T_DECLARED
|
||||||
|
typedef signed char int8_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _UINT8_T_DECLARED
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _INT16_T_DECLARED
|
||||||
|
typedef signed short int16_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _UINT16_T_DECLARED
|
||||||
|
typedef unsigned short uint16_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _INT32_T_DECLARED
|
||||||
|
typedef signed int int32_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _UINT32_T_DECLARED
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _INT64_T_DECLARED
|
||||||
|
typedef signed long long int64_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _UINT64_T_DECLARED
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SDL_AUDIO_DRIVER_EPOCAUDIO 1
|
||||||
|
|
||||||
|
|
||||||
|
/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */
|
||||||
|
#define SDL_CDROM_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */
|
||||||
|
#define SDL_JOYSTICK_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */
|
||||||
|
#define SDL_LOADSO_DISABLED 1
|
||||||
|
|
||||||
|
#define SDL_THREAD_SYMBIAN 1
|
||||||
|
|
||||||
|
#define SDL_VIDEO_DRIVER_EPOC 1
|
||||||
|
|
||||||
|
#define SDL_VIDEO_OPENGL 0
|
||||||
|
|
||||||
|
#define SDL_HAS_64BIT_TYPE 1
|
||||||
|
|
||||||
|
#define HAVE_LIBC 1
|
||||||
|
#define HAVE_STDIO_H 1
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
#define HAVE_STRING_H 1
|
||||||
|
#define HAVE_CTYPE_H 1
|
||||||
|
#define HAVE_MATH_H 1
|
||||||
|
|
||||||
|
#define HAVE_MALLOC 1
|
||||||
|
#define HAVE_CALLOC 1
|
||||||
|
#define HAVE_REALLOC 1
|
||||||
|
#define HAVE_FREE 1
|
||||||
|
//#define HAVE_ALLOCA 1
|
||||||
|
#define HAVE_QSORT 1
|
||||||
|
#define HAVE_ABS 1
|
||||||
|
#define HAVE_MEMSET 1
|
||||||
|
#define HAVE_MEMCPY 1
|
||||||
|
#define HAVE_MEMMOVE 1
|
||||||
|
#define HAVE_MEMCMP 1
|
||||||
|
#define HAVE_STRLEN 1
|
||||||
|
#define HAVE__STRUPR 1
|
||||||
|
#define HAVE_STRCHR 1
|
||||||
|
#define HAVE_STRRCHR 1
|
||||||
|
#define HAVE_STRSTR 1
|
||||||
|
#define HAVE_ITOA 1
|
||||||
|
#define HAVE_STRTOL 1
|
||||||
|
#define HAVE_STRTOUL 1
|
||||||
|
#define HAVE_STRTOLL 1
|
||||||
|
#define HAVE_STRTOD 1
|
||||||
|
#define HAVE_ATOI 1
|
||||||
|
#define HAVE_ATOF 1
|
||||||
|
#define HAVE_STRCMP 1
|
||||||
|
#define HAVE_STRNCMP 1
|
||||||
|
//#define HAVE__STRICMP 1
|
||||||
|
#define HAVE__STRNICMP 1
|
||||||
|
#define HAVE_SSCANF 1
|
||||||
|
#define HAVE_STDARG_H 1
|
||||||
|
#define HAVE_STDDEF_H 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _SDL_CONFIG_SYMBIAN_H */
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
/* This is a set of defines to configure the SDL features */
|
/* This is a set of defines to configure the SDL features */
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#if defined(__GNUC__) || defined(__DMC__)
|
||||||
#define HAVE_STDINT_H 1
|
#define HAVE_STDINT_H 1
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
typedef signed __int8 int8_t;
|
typedef signed __int8 int8_t;
|
||||||
|
@ -46,6 +46,13 @@ typedef unsigned int uintptr_t;
|
||||||
#endif
|
#endif
|
||||||
#define _UINTPTR_T_DEFINED
|
#define _UINTPTR_T_DEFINED
|
||||||
#endif
|
#endif
|
||||||
|
/* Older Visual C++ headers don't have the Win64-compatible typedefs... */
|
||||||
|
#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR)))
|
||||||
|
#define DWORD_PTR DWORD
|
||||||
|
#endif
|
||||||
|
#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR)))
|
||||||
|
#define LONG_PTR LONG
|
||||||
|
#endif
|
||||||
#else /* !__GNUC__ && !_MSC_VER */
|
#else /* !__GNUC__ && !_MSC_VER */
|
||||||
typedef signed char int8_t;
|
typedef signed char int8_t;
|
||||||
typedef unsigned char uint8_t;
|
typedef unsigned char uint8_t;
|
||||||
|
|
|
@ -56,7 +56,7 @@ extern "C" {
|
||||||
header should only be included in files that actually use them.
|
header should only be included in files that actually use them.
|
||||||
*/
|
*/
|
||||||
#if defined(__GNUC__) && defined(__i386__) && \
|
#if defined(__GNUC__) && defined(__i386__) && \
|
||||||
!(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */)
|
!(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
|
||||||
static __inline__ Uint16 SDL_Swap16(Uint16 x)
|
static __inline__ Uint16 SDL_Swap16(Uint16 x)
|
||||||
{
|
{
|
||||||
__asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x));
|
__asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x));
|
||||||
|
@ -88,7 +88,8 @@ static __inline__ Uint16 SDL_Swap16(Uint16 x) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__i386__)
|
#if defined(__GNUC__) && defined(__i386__) && \
|
||||||
|
!(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
|
||||||
static __inline__ Uint32 SDL_Swap32(Uint32 x)
|
static __inline__ Uint32 SDL_Swap32(Uint32 x)
|
||||||
{
|
{
|
||||||
__asm__("bswap %0" : "=r" (x) : "0" (x));
|
__asm__("bswap %0" : "=r" (x) : "0" (x));
|
||||||
|
@ -123,7 +124,8 @@ static __inline__ Uint32 SDL_Swap32(Uint32 x) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SDL_HAS_64BIT_TYPE
|
#ifdef SDL_HAS_64BIT_TYPE
|
||||||
#if defined(__GNUC__) && defined(__i386__)
|
#if defined(__GNUC__) && defined(__i386__) && \
|
||||||
|
!(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
|
||||||
static __inline__ Uint64 SDL_Swap64(Uint64 x)
|
static __inline__ Uint64 SDL_Swap64(Uint64 x)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
|
|
|
@ -29,10 +29,6 @@
|
||||||
#undef __AIX__
|
#undef __AIX__
|
||||||
#define __AIX__ 1
|
#define __AIX__ 1
|
||||||
#endif
|
#endif
|
||||||
#if defined(AMIGA) || defined(__AMIGA) || defined(__amigados__)
|
|
||||||
#undef __AMIGA__
|
|
||||||
#define __AMIGA__ 1
|
|
||||||
#endif
|
|
||||||
#if defined(__BEOS__)
|
#if defined(__BEOS__)
|
||||||
#undef __BEOS__
|
#undef __BEOS__
|
||||||
#define __BEOS__ 1
|
#define __BEOS__ 1
|
||||||
|
|
|
@ -62,10 +62,15 @@ typedef struct SDL_RWops {
|
||||||
|
|
||||||
Uint32 type;
|
Uint32 type;
|
||||||
union {
|
union {
|
||||||
#ifdef __WIN32__
|
#if defined(__WIN32__) && !defined(__SYMBIAN32__)
|
||||||
struct {
|
struct {
|
||||||
int append;
|
int append;
|
||||||
void *h;
|
void *h;
|
||||||
|
struct {
|
||||||
|
void *data;
|
||||||
|
int size;
|
||||||
|
int left;
|
||||||
|
} buffer;
|
||||||
} win32io;
|
} win32io;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_STDIO_H
|
#ifdef HAVE_STDIO_H
|
||||||
|
|
|
@ -91,7 +91,9 @@ typedef uint32_t Uint32;
|
||||||
|
|
||||||
#ifdef SDL_HAS_64BIT_TYPE
|
#ifdef SDL_HAS_64BIT_TYPE
|
||||||
typedef int64_t Sint64;
|
typedef int64_t Sint64;
|
||||||
|
#ifndef SYMBIAN32_GCCE
|
||||||
typedef uint64_t Uint64;
|
typedef uint64_t Uint64;
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
/* This is really just a hack to prevent the compiler from complaining */
|
/* This is really just a hack to prevent the compiler from complaining */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -127,7 +129,9 @@ typedef enum {
|
||||||
DUMMY_ENUM_VALUE
|
DUMMY_ENUM_VALUE
|
||||||
} SDL_DUMMY_ENUM;
|
} SDL_DUMMY_ENUM;
|
||||||
|
|
||||||
|
#ifndef __NDS__
|
||||||
SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
|
SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "begin_code.h"
|
#include "begin_code.h"
|
||||||
|
@ -181,10 +185,10 @@ extern DECLSPEC void SDLCALL SDL_free(void *mem);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_ALLOCA
|
#ifdef HAVE_ALLOCA
|
||||||
#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*count)
|
#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count))
|
||||||
#define SDL_stack_free(data)
|
#define SDL_stack_free(data)
|
||||||
#else
|
#else
|
||||||
#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*count)
|
#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count))
|
||||||
#define SDL_stack_free(data) SDL_free(data)
|
#define SDL_stack_free(data) SDL_free(data)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -263,7 +267,10 @@ do { \
|
||||||
} while(0)
|
} while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(i386)
|
/* We can count on memcpy existing on Mac OS X and being well-tuned. */
|
||||||
|
#if defined(__MACH__) && defined(__APPLE__)
|
||||||
|
#define SDL_memcpy(dst, src, len) memcpy(dst, src, len)
|
||||||
|
#elif defined(__GNUC__) && defined(i386)
|
||||||
#define SDL_memcpy(dst, src, len) \
|
#define SDL_memcpy(dst, src, len) \
|
||||||
do { \
|
do { \
|
||||||
int u0, u1, u2; \
|
int u0, u1, u2; \
|
||||||
|
@ -292,7 +299,10 @@ extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(i386)
|
/* We can count on memcpy existing on Mac OS X and being well-tuned. */
|
||||||
|
#if defined(__MACH__) && defined(__APPLE__)
|
||||||
|
#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4)
|
||||||
|
#elif defined(__GNUC__) && defined(i386)
|
||||||
#define SDL_memcpy4(dst, src, len) \
|
#define SDL_memcpy4(dst, src, len) \
|
||||||
do { \
|
do { \
|
||||||
int ecx, edi, esi; \
|
int ecx, edi, esi; \
|
||||||
|
@ -561,19 +571,17 @@ extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char
|
||||||
#define SDL_iconv_t iconv_t
|
#define SDL_iconv_t iconv_t
|
||||||
#define SDL_iconv_open iconv_open
|
#define SDL_iconv_open iconv_open
|
||||||
#define SDL_iconv_close iconv_close
|
#define SDL_iconv_close iconv_close
|
||||||
extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
|
|
||||||
#else
|
#else
|
||||||
typedef struct _SDL_iconv_t *SDL_iconv_t;
|
typedef struct _SDL_iconv_t *SDL_iconv_t;
|
||||||
extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode);
|
extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode);
|
||||||
extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
|
extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
|
||||||
extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
|
|
||||||
#endif
|
#endif
|
||||||
|
extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
|
||||||
/* This function converts a string between encodings in one pass, returning a
|
/* This function converts a string between encodings in one pass, returning a
|
||||||
string that must be freed with SDL_free() or NULL on error.
|
string that must be freed with SDL_free() or NULL on error.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, char *inbuf, size_t inbytesleft);
|
extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft);
|
||||||
#define SDL_iconv_utf8_ascii(S) SDL_iconv_string("ASCII", "UTF-8", S, SDL_strlen(S)+1)
|
#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1)
|
||||||
#define SDL_iconv_utf8_latin1(S) SDL_iconv_string("LATIN1", "UTF-8", S, SDL_strlen(S)+1)
|
|
||||||
#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)
|
#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)
|
||||||
#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)
|
#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,8 @@ typedef struct SDL_SysWMinfo {
|
||||||
Display *display; /* The X11 display */
|
Display *display; /* The X11 display */
|
||||||
Window window; /* The X11 display window */
|
Window window; /* The X11 display window */
|
||||||
/* These locking functions should be called around
|
/* These locking functions should be called around
|
||||||
any X11 functions using the display variable.
|
any X11 functions using the display variable,
|
||||||
|
but not the gfxdisplay variable.
|
||||||
They lock the event thread, so should not be
|
They lock the event thread, so should not be
|
||||||
called around event functions or from event filters.
|
called around event functions or from event filters.
|
||||||
*/
|
*/
|
||||||
|
@ -96,6 +97,9 @@ typedef struct SDL_SysWMinfo {
|
||||||
/* Introduced in SDL 1.0.2 */
|
/* Introduced in SDL 1.0.2 */
|
||||||
Window fswindow; /* The X11 fullscreen window */
|
Window fswindow; /* The X11 fullscreen window */
|
||||||
Window wmwindow; /* The X11 managed input window */
|
Window wmwindow; /* The X11 managed input window */
|
||||||
|
|
||||||
|
/* Introduced in SDL 1.2.12 */
|
||||||
|
Display *gfxdisplay; /* The X11 display to which rendering is done */
|
||||||
} x11;
|
} x11;
|
||||||
} info;
|
} info;
|
||||||
} SDL_SysWMinfo;
|
} SDL_SysWMinfo;
|
||||||
|
|
|
@ -45,7 +45,7 @@ struct SDL_Thread;
|
||||||
typedef struct SDL_Thread SDL_Thread;
|
typedef struct SDL_Thread SDL_Thread;
|
||||||
|
|
||||||
/* Create a thread */
|
/* Create a thread */
|
||||||
#if (defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)
|
#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__)
|
||||||
/*
|
/*
|
||||||
We compile SDL into a DLL on OS/2. This means, that it's the DLL which
|
We compile SDL into a DLL on OS/2. This means, that it's the DLL which
|
||||||
creates a new thread for the calling process with the SDL_CreateThread()
|
creates a new thread for the calling process with the SDL_CreateThread()
|
||||||
|
|
|
@ -37,7 +37,7 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_MAJOR_VERSION 1
|
#define SDL_MAJOR_VERSION 1
|
||||||
#define SDL_MINOR_VERSION 2
|
#define SDL_MINOR_VERSION 2
|
||||||
#define SDL_PATCHLEVEL 11
|
#define SDL_PATCHLEVEL 12
|
||||||
|
|
||||||
typedef struct SDL_version {
|
typedef struct SDL_version {
|
||||||
Uint8 major;
|
Uint8 major;
|
||||||
|
|
|
@ -447,13 +447,15 @@ extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags,
|
||||||
* Maps an RGB triple to an opaque pixel value for a given pixel format
|
* Maps an RGB triple to an opaque pixel value for a given pixel format
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC Uint32 SDLCALL SDL_MapRGB
|
extern DECLSPEC Uint32 SDLCALL SDL_MapRGB
|
||||||
(SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b);
|
(const SDL_PixelFormat * const format,
|
||||||
|
const Uint8 r, const Uint8 g, const Uint8 b);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Maps an RGBA quadruple to a pixel value for a given pixel format
|
* Maps an RGBA quadruple to a pixel value for a given pixel format
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(SDL_PixelFormat *format,
|
extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA
|
||||||
Uint8 r, Uint8 g, Uint8 b, Uint8 a);
|
(const SDL_PixelFormat * const format,
|
||||||
|
const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Maps a pixel value into the RGB components for a given pixel format
|
* Maps a pixel value into the RGB components for a given pixel format
|
||||||
|
|
|
@ -83,11 +83,15 @@
|
||||||
#endif
|
#endif
|
||||||
#endif /* SDLCALL */
|
#endif /* SDLCALL */
|
||||||
|
|
||||||
/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */
|
|
||||||
#ifdef __SYMBIAN32__
|
#ifdef __SYMBIAN32__
|
||||||
|
#ifndef EKA2
|
||||||
#undef DECLSPEC
|
#undef DECLSPEC
|
||||||
#define DECLSPEC
|
#define DECLSPEC
|
||||||
#endif /* __SYMBIAN32__ */
|
#elif !defined(__WINS__)
|
||||||
|
#undef DECLSPEC
|
||||||
|
#define DECLSPEC __declspec(dllexport)
|
||||||
|
#endif //EKA2
|
||||||
|
#endif //__SYMBIAN32__
|
||||||
|
|
||||||
/* Force structure packing at 4 byte alignment.
|
/* Force structure packing at 4 byte alignment.
|
||||||
This is necessary if the header is included in code which has structure
|
This is necessary if the header is included in code which has structure
|
||||||
|
@ -116,14 +120,16 @@
|
||||||
#if defined(_MSC_VER) || defined(__BORLANDC__) || \
|
#if defined(_MSC_VER) || defined(__BORLANDC__) || \
|
||||||
defined(__DMC__) || defined(__SC__) || \
|
defined(__DMC__) || defined(__SC__) || \
|
||||||
defined(__WATCOMC__) || defined(__LCC__) || \
|
defined(__WATCOMC__) || defined(__LCC__) || \
|
||||||
defined(__DECC)
|
defined(__DECC) || defined(__EABI__)
|
||||||
#ifndef __inline__
|
#ifndef __inline__
|
||||||
#define __inline__ __inline
|
#define __inline__ __inline
|
||||||
#endif
|
#endif
|
||||||
#define SDL_INLINE_OKAY
|
#define SDL_INLINE_OKAY
|
||||||
#else
|
#else
|
||||||
#if !defined(__MRC__) && !defined(_SGI_SOURCE)
|
#if !defined(__MRC__) && !defined(_SGI_SOURCE)
|
||||||
|
#ifndef __inline__
|
||||||
#define __inline__ inline
|
#define __inline__ inline
|
||||||
|
#endif
|
||||||
#define SDL_INLINE_OKAY
|
#define SDL_INLINE_OKAY
|
||||||
#endif /* Not a funky compiler */
|
#endif /* Not a funky compiler */
|
||||||
#endif /* Visual C++ */
|
#endif /* Visual C++ */
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
prefix=@prefix@
|
prefix=@prefix@
|
||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
exec_prefix_set=no
|
exec_prefix_set=no
|
||||||
|
libdir=@libdir@
|
||||||
|
|
||||||
@ENABLE_STATIC_FALSE@usage="\
|
@ENABLE_STATIC_FALSE@usage="\
|
||||||
@ENABLE_STATIC_FALSE@Usage: sdl-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
@ENABLE_STATIC_FALSE@Usage: sdl-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
||||||
|
|
|
@ -54,7 +54,9 @@ static SDL_version version =
|
||||||
|
|
||||||
/* The initialized subsystems */
|
/* The initialized subsystems */
|
||||||
static Uint32 SDL_initialized = 0;
|
static Uint32 SDL_initialized = 0;
|
||||||
|
#if !SDL_TIMERS_DISABLED
|
||||||
static Uint32 ticks_started = 0;
|
static Uint32 ticks_started = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CHECK_LEAKS
|
#ifdef CHECK_LEAKS
|
||||||
int surfaces_allocated = 0;
|
int surfaces_allocated = 0;
|
||||||
|
@ -323,7 +325,7 @@ unsigned _System LibMain(unsigned hmod, unsigned termination)
|
||||||
}
|
}
|
||||||
#endif /* __WATCOMC__ */
|
#endif /* __WATCOMC__ */
|
||||||
|
|
||||||
#elif defined(__WIN32__)
|
#elif defined(__WIN32__) && !defined(__SYMBIAN32__)
|
||||||
|
|
||||||
#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))
|
#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))
|
||||||
/* Need to include DllMain() on Watcom C for some reason.. */
|
/* Need to include DllMain() on Watcom C for some reason.. */
|
||||||
|
|
|
@ -46,6 +46,9 @@ static AudioBootStrap *bootstrap[] = {
|
||||||
#if SDL_AUDIO_DRIVER_ALSA
|
#if SDL_AUDIO_DRIVER_ALSA
|
||||||
&ALSA_bootstrap,
|
&ALSA_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_PULSE
|
||||||
|
&PULSE_bootstrap,
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_QNXNTO
|
#if SDL_AUDIO_DRIVER_QNXNTO
|
||||||
&QNXNTOAUDIO_bootstrap,
|
&QNXNTOAUDIO_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
@ -82,9 +85,6 @@ static AudioBootStrap *bootstrap[] = {
|
||||||
#if SDL_AUDIO_DRIVER_SNDMGR
|
#if SDL_AUDIO_DRIVER_SNDMGR
|
||||||
&SNDMGR_bootstrap,
|
&SNDMGR_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
&AHI_bootstrap,
|
|
||||||
#endif
|
|
||||||
#if SDL_AUDIO_DRIVER_MINT
|
#if SDL_AUDIO_DRIVER_MINT
|
||||||
&MINTAUDIO_GSXB_bootstrap,
|
&MINTAUDIO_GSXB_bootstrap,
|
||||||
&MINTAUDIO_MCSN_bootstrap,
|
&MINTAUDIO_MCSN_bootstrap,
|
||||||
|
@ -101,11 +101,17 @@ static AudioBootStrap *bootstrap[] = {
|
||||||
#if SDL_AUDIO_DRIVER_DC
|
#if SDL_AUDIO_DRIVER_DC
|
||||||
&DCAUD_bootstrap,
|
&DCAUD_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_NDS
|
||||||
|
&NDSAUD_bootstrap,
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
||||||
&MMEAUDIO_bootstrap,
|
&MMEAUDIO_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_DART
|
#if SDL_AUDIO_DRIVER_DART
|
||||||
&DART_bootstrap,
|
&DART_bootstrap,
|
||||||
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_EPOCAUDIO
|
||||||
|
&EPOCAudio_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -115,10 +121,6 @@ SDL_AudioDevice *current_audio = NULL;
|
||||||
int SDL_AudioInit(const char *driver_name);
|
int SDL_AudioInit(const char *driver_name);
|
||||||
void SDL_AudioQuit(void);
|
void SDL_AudioQuit(void);
|
||||||
|
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
static int audio_configured = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The general mixing thread function */
|
/* The general mixing thread function */
|
||||||
int SDLCALL SDL_RunAudio(void *audiop)
|
int SDLCALL SDL_RunAudio(void *audiop)
|
||||||
{
|
{
|
||||||
|
@ -128,21 +130,6 @@ int SDLCALL SDL_RunAudio(void *audiop)
|
||||||
void *udata;
|
void *udata;
|
||||||
void (SDLCALL *fill)(void *userdata,Uint8 *stream, int len);
|
void (SDLCALL *fill)(void *userdata,Uint8 *stream, int len);
|
||||||
int silence;
|
int silence;
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
int started = 0;
|
|
||||||
|
|
||||||
/* AmigaOS NEEDS that the audio driver is opened in the thread that uses it! */
|
|
||||||
|
|
||||||
D(bug("Task audio started audio struct:<%lx>...\n",audiop));
|
|
||||||
|
|
||||||
D(bug("Before Openaudio..."));
|
|
||||||
if(audio->OpenAudio(audio, &audio->spec)==-1)
|
|
||||||
{
|
|
||||||
D(bug("Open audio failed...\n"));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
D(bug("OpenAudio...OK\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Perform any thread setup */
|
/* Perform any thread setup */
|
||||||
if ( audio->ThreadInit ) {
|
if ( audio->ThreadInit ) {
|
||||||
|
@ -154,14 +141,6 @@ int SDLCALL SDL_RunAudio(void *audiop)
|
||||||
fill = audio->spec.callback;
|
fill = audio->spec.callback;
|
||||||
udata = audio->spec.userdata;
|
udata = audio->spec.userdata;
|
||||||
|
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
audio_configured = 1;
|
|
||||||
|
|
||||||
D(bug("Audio configured... Checking for conversion\n"));
|
|
||||||
SDL_mutexP(audio->mixer_lock);
|
|
||||||
D(bug("Semaphore obtained...\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( audio->convert.needed ) {
|
if ( audio->convert.needed ) {
|
||||||
if ( audio->convert.src_format == AUDIO_U8 ) {
|
if ( audio->convert.src_format == AUDIO_U8 ) {
|
||||||
silence = 0x80;
|
silence = 0x80;
|
||||||
|
@ -174,11 +153,6 @@ int SDLCALL SDL_RunAudio(void *audiop)
|
||||||
stream_len = audio->spec.size;
|
stream_len = audio->spec.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
SDL_mutexV(audio->mixer_lock);
|
|
||||||
D(bug("Entering audio loop...\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __OS2__
|
#ifdef __OS2__
|
||||||
/* Increase the priority of this thread to make sure that
|
/* Increase the priority of this thread to make sure that
|
||||||
the audio will be continuous all the time! */
|
the audio will be continuous all the time! */
|
||||||
|
@ -216,6 +190,7 @@ int SDLCALL SDL_RunAudio(void *audiop)
|
||||||
stream = audio->fake_stream;
|
stream = audio->fake_stream;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_memset(stream, silence, stream_len);
|
SDL_memset(stream, silence, stream_len);
|
||||||
|
|
||||||
if ( ! audio->paused ) {
|
if ( ! audio->paused ) {
|
||||||
|
@ -253,14 +228,6 @@ int SDLCALL SDL_RunAudio(void *audiop)
|
||||||
audio->WaitDone(audio);
|
audio->WaitDone(audio);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
D(bug("WaitAudio...Done\n"));
|
|
||||||
|
|
||||||
audio->CloseAudio(audio);
|
|
||||||
|
|
||||||
D(bug("CloseAudio..Done, subtask exiting...\n"));
|
|
||||||
audio_configured = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef __OS2__
|
#ifdef __OS2__
|
||||||
#ifdef DEBUG_BUILD
|
#ifdef DEBUG_BUILD
|
||||||
printf("[SDL_RunAudio] : Task exiting. (TID%d)\n", SDL_ThreadID());
|
printf("[SDL_RunAudio] : Task exiting. (TID%d)\n", SDL_ThreadID());
|
||||||
|
@ -350,7 +317,7 @@ int SDL_AudioInit(const char *driver_name)
|
||||||
This probably isn't the place to do this, but... Shh! :)
|
This probably isn't the place to do this, but... Shh! :)
|
||||||
*/
|
*/
|
||||||
for ( i=0; bootstrap[i]; ++i ) {
|
for ( i=0; bootstrap[i]; ++i ) {
|
||||||
if ( SDL_strcmp(bootstrap[i]->name, "esd") == 0 ) {
|
if ( SDL_strcasecmp(bootstrap[i]->name, "esd") == 0 ) {
|
||||||
#ifdef HAVE_PUTENV
|
#ifdef HAVE_PUTENV
|
||||||
const char *esd_no_spawn;
|
const char *esd_no_spawn;
|
||||||
|
|
||||||
|
@ -381,8 +348,7 @@ int SDL_AudioInit(const char *driver_name)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
for ( i=0; bootstrap[i]; ++i ) {
|
for ( i=0; bootstrap[i]; ++i ) {
|
||||||
if (SDL_strncmp(bootstrap[i]->name, driver_name,
|
if (SDL_strcasecmp(bootstrap[i]->name, driver_name) == 0) {
|
||||||
SDL_strlen(bootstrap[i]->name)) == 0) {
|
|
||||||
if ( bootstrap[i]->available() ) {
|
if ( bootstrap[i]->available() ) {
|
||||||
audio=bootstrap[i]->create(idx);
|
audio=bootstrap[i]->create(idx);
|
||||||
break;
|
break;
|
||||||
|
@ -471,7 +437,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
if ( desired->channels == 0 ) {
|
if ( desired->channels == 0 ) {
|
||||||
env = SDL_getenv("SDL_AUDIO_CHANNELS");
|
env = SDL_getenv("SDL_AUDIO_CHANNELS");
|
||||||
if ( env ) {
|
if ( env ) {
|
||||||
desired->channels = SDL_atoi(env);
|
desired->channels = (Uint8)SDL_atoi(env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( desired->channels == 0 ) {
|
if ( desired->channels == 0 ) {
|
||||||
|
@ -491,7 +457,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
if ( desired->samples == 0 ) {
|
if ( desired->samples == 0 ) {
|
||||||
env = SDL_getenv("SDL_AUDIO_SAMPLES");
|
env = SDL_getenv("SDL_AUDIO_SAMPLES");
|
||||||
if ( env ) {
|
if ( env ) {
|
||||||
desired->samples = SDL_atoi(env);
|
desired->samples = (Uint16)SDL_atoi(env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( desired->samples == 0 ) {
|
if ( desired->samples == 0 ) {
|
||||||
|
@ -508,10 +474,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__MACOS__) || (defined(__RISCOS__) && SDL_THREADS_DISABLED)
|
#if SDL_THREADS_DISABLED
|
||||||
/* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */
|
|
||||||
#else
|
|
||||||
#if defined(__MINT__) && SDL_THREADS_DISABLED
|
|
||||||
/* Uses interrupt driven audio, without thread */
|
/* Uses interrupt driven audio, without thread */
|
||||||
#else
|
#else
|
||||||
/* Create a semaphore for locking the sound buffers */
|
/* Create a semaphore for locking the sound buffers */
|
||||||
|
@ -521,8 +484,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
SDL_CloseAudio();
|
SDL_CloseAudio();
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
#endif /* __MINT__ */
|
#endif /* SDL_THREADS_DISABLED */
|
||||||
#endif /* __MACOS__ */
|
|
||||||
|
|
||||||
/* Calculate the silence and size of the audio specification */
|
/* Calculate the silence and size of the audio specification */
|
||||||
SDL_CalculateAudioSpec(desired);
|
SDL_CalculateAudioSpec(desired);
|
||||||
|
@ -533,33 +495,12 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
audio->enabled = 1;
|
audio->enabled = 1;
|
||||||
audio->paused = 1;
|
audio->paused = 1;
|
||||||
|
|
||||||
#if !SDL_AUDIO_DRIVER_AHI
|
|
||||||
|
|
||||||
/* AmigaOS opens audio inside the main loop */
|
|
||||||
audio->opened = audio->OpenAudio(audio, &audio->spec)+1;
|
audio->opened = audio->OpenAudio(audio, &audio->spec)+1;
|
||||||
|
|
||||||
if ( ! audio->opened ) {
|
if ( ! audio->opened ) {
|
||||||
SDL_CloseAudio();
|
SDL_CloseAudio();
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
D(bug("Locking semaphore..."));
|
|
||||||
SDL_mutexP(audio->mixer_lock);
|
|
||||||
|
|
||||||
|
|
||||||
audio->thread = SDL_CreateThread(SDL_RunAudio, audio);
|
|
||||||
D(bug("Created thread...\n"));
|
|
||||||
|
|
||||||
if ( audio->thread == NULL ) {
|
|
||||||
SDL_mutexV(audio->mixer_lock);
|
|
||||||
SDL_CloseAudio();
|
|
||||||
SDL_SetError("Couldn't create audio thread");
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while(!audio_configured)
|
|
||||||
SDL_Delay(100);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If the audio driver changes the buffer size, accept it */
|
/* If the audio driver changes the buffer size, accept it */
|
||||||
if ( audio->spec.samples != desired->samples ) {
|
if ( audio->spec.samples != desired->samples ) {
|
||||||
|
@ -591,7 +532,8 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
if ( audio->convert.needed ) {
|
if ( audio->convert.needed ) {
|
||||||
audio->convert.len = desired->size;
|
audio->convert.len = (int) ( ((double) desired->size) /
|
||||||
|
audio->convert.len_ratio );
|
||||||
audio->convert.buf =(Uint8 *)SDL_AllocAudioMem(
|
audio->convert.buf =(Uint8 *)SDL_AllocAudioMem(
|
||||||
audio->convert.len*audio->convert.len_mult);
|
audio->convert.len*audio->convert.len_mult);
|
||||||
if ( audio->convert.buf == NULL ) {
|
if ( audio->convert.buf == NULL ) {
|
||||||
|
@ -602,12 +544,11 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !SDL_AUDIO_DRIVER_AHI
|
|
||||||
/* Start the audio thread if necessary */
|
/* Start the audio thread if necessary */
|
||||||
switch (audio->opened) {
|
switch (audio->opened) {
|
||||||
case 1:
|
case 1:
|
||||||
/* Start the audio thread */
|
/* Start the audio thread */
|
||||||
#if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC)
|
#if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC) && !defined(__SYMBIAN32__)
|
||||||
#undef SDL_CreateThread
|
#undef SDL_CreateThread
|
||||||
audio->thread = SDL_CreateThread(SDL_RunAudio, audio, NULL, NULL);
|
audio->thread = SDL_CreateThread(SDL_RunAudio, audio, NULL, NULL);
|
||||||
#else
|
#else
|
||||||
|
@ -624,11 +565,6 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
/* The audio is now playing */
|
/* The audio is now playing */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
SDL_mutexV(audio->mixer_lock);
|
|
||||||
D(bug("SDL_OpenAudio USCITA...\n"));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -702,12 +638,10 @@ void SDL_AudioQuit(void)
|
||||||
SDL_FreeAudioMem(audio->convert.buf);
|
SDL_FreeAudioMem(audio->convert.buf);
|
||||||
|
|
||||||
}
|
}
|
||||||
#if !SDL_AUDIO_DRIVER_AHI
|
|
||||||
if ( audio->opened ) {
|
if ( audio->opened ) {
|
||||||
audio->CloseAudio(audio);
|
audio->CloseAudio(audio);
|
||||||
audio->opened = 0;
|
audio->opened = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/* Free the driver data */
|
/* Free the driver data */
|
||||||
audio->free(audio);
|
audio->free(audio);
|
||||||
current_audio = NULL;
|
current_audio = NULL;
|
||||||
|
|
|
@ -44,11 +44,7 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format)
|
||||||
dst = cvt->buf;
|
dst = cvt->buf;
|
||||||
for ( i=cvt->len_cvt/2; i; --i ) {
|
for ( i=cvt->len_cvt/2; i; --i ) {
|
||||||
sample = src[0] + src[1];
|
sample = src[0] + src[1];
|
||||||
if ( sample > 255 ) {
|
*dst = (Uint8)(sample / 2);
|
||||||
*dst = 255;
|
|
||||||
} else {
|
|
||||||
*dst = (Uint8)sample;
|
|
||||||
}
|
|
||||||
src += 2;
|
src += 2;
|
||||||
dst += 1;
|
dst += 1;
|
||||||
}
|
}
|
||||||
|
@ -62,14 +58,7 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format)
|
||||||
dst = (Sint8 *)cvt->buf;
|
dst = (Sint8 *)cvt->buf;
|
||||||
for ( i=cvt->len_cvt/2; i; --i ) {
|
for ( i=cvt->len_cvt/2; i; --i ) {
|
||||||
sample = src[0] + src[1];
|
sample = src[0] + src[1];
|
||||||
if ( sample > 127 ) {
|
*dst = (Sint8)(sample / 2);
|
||||||
*dst = 127;
|
|
||||||
} else
|
|
||||||
if ( sample < -128 ) {
|
|
||||||
*dst = -128;
|
|
||||||
} else {
|
|
||||||
*dst = (Sint8)sample;
|
|
||||||
}
|
|
||||||
src += 2;
|
src += 2;
|
||||||
dst += 1;
|
dst += 1;
|
||||||
}
|
}
|
||||||
|
@ -85,14 +74,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format)
|
||||||
for ( i=cvt->len_cvt/4; i; --i ) {
|
for ( i=cvt->len_cvt/4; i; --i ) {
|
||||||
sample = (Uint16)((src[0]<<8)|src[1])+
|
sample = (Uint16)((src[0]<<8)|src[1])+
|
||||||
(Uint16)((src[2]<<8)|src[3]);
|
(Uint16)((src[2]<<8)|src[3]);
|
||||||
if ( sample > 65535 ) {
|
sample /= 2;
|
||||||
dst[0] = 0xFF;
|
|
||||||
dst[1] = 0xFF;
|
|
||||||
} else {
|
|
||||||
dst[1] = (sample&0xFF);
|
dst[1] = (sample&0xFF);
|
||||||
sample >>= 8;
|
sample >>= 8;
|
||||||
dst[0] = (sample&0xFF);
|
dst[0] = (sample&0xFF);
|
||||||
}
|
|
||||||
src += 4;
|
src += 4;
|
||||||
dst += 2;
|
dst += 2;
|
||||||
}
|
}
|
||||||
|
@ -100,14 +85,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format)
|
||||||
for ( i=cvt->len_cvt/4; i; --i ) {
|
for ( i=cvt->len_cvt/4; i; --i ) {
|
||||||
sample = (Uint16)((src[1]<<8)|src[0])+
|
sample = (Uint16)((src[1]<<8)|src[0])+
|
||||||
(Uint16)((src[3]<<8)|src[2]);
|
(Uint16)((src[3]<<8)|src[2]);
|
||||||
if ( sample > 65535 ) {
|
sample /= 2;
|
||||||
dst[0] = 0xFF;
|
|
||||||
dst[1] = 0xFF;
|
|
||||||
} else {
|
|
||||||
dst[0] = (sample&0xFF);
|
dst[0] = (sample&0xFF);
|
||||||
sample >>= 8;
|
sample >>= 8;
|
||||||
dst[1] = (sample&0xFF);
|
dst[1] = (sample&0xFF);
|
||||||
}
|
|
||||||
src += 4;
|
src += 4;
|
||||||
dst += 2;
|
dst += 2;
|
||||||
}
|
}
|
||||||
|
@ -124,18 +105,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format)
|
||||||
for ( i=cvt->len_cvt/4; i; --i ) {
|
for ( i=cvt->len_cvt/4; i; --i ) {
|
||||||
sample = (Sint16)((src[0]<<8)|src[1])+
|
sample = (Sint16)((src[0]<<8)|src[1])+
|
||||||
(Sint16)((src[2]<<8)|src[3]);
|
(Sint16)((src[2]<<8)|src[3]);
|
||||||
if ( sample > 32767 ) {
|
sample /= 2;
|
||||||
dst[0] = 0x7F;
|
|
||||||
dst[1] = 0xFF;
|
|
||||||
} else
|
|
||||||
if ( sample < -32768 ) {
|
|
||||||
dst[0] = 0x80;
|
|
||||||
dst[1] = 0x00;
|
|
||||||
} else {
|
|
||||||
dst[1] = (sample&0xFF);
|
dst[1] = (sample&0xFF);
|
||||||
sample >>= 8;
|
sample >>= 8;
|
||||||
dst[0] = (sample&0xFF);
|
dst[0] = (sample&0xFF);
|
||||||
}
|
|
||||||
src += 4;
|
src += 4;
|
||||||
dst += 2;
|
dst += 2;
|
||||||
}
|
}
|
||||||
|
@ -143,18 +116,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format)
|
||||||
for ( i=cvt->len_cvt/4; i; --i ) {
|
for ( i=cvt->len_cvt/4; i; --i ) {
|
||||||
sample = (Sint16)((src[1]<<8)|src[0])+
|
sample = (Sint16)((src[1]<<8)|src[0])+
|
||||||
(Sint16)((src[3]<<8)|src[2]);
|
(Sint16)((src[3]<<8)|src[2]);
|
||||||
if ( sample > 32767 ) {
|
sample /= 2;
|
||||||
dst[1] = 0x7F;
|
|
||||||
dst[0] = 0xFF;
|
|
||||||
} else
|
|
||||||
if ( sample < -32768 ) {
|
|
||||||
dst[1] = 0x80;
|
|
||||||
dst[0] = 0x00;
|
|
||||||
} else {
|
|
||||||
dst[0] = (sample&0xFF);
|
dst[0] = (sample&0xFF);
|
||||||
sample >>= 8;
|
sample >>= 8;
|
||||||
dst[1] = (sample&0xFF);
|
dst[1] = (sample&0xFF);
|
||||||
}
|
|
||||||
src += 4;
|
src += 4;
|
||||||
dst += 2;
|
dst += 2;
|
||||||
}
|
}
|
||||||
|
@ -1374,7 +1339,7 @@ int SDL_BuildAudioCVT(SDL_AudioCVT *cvt,
|
||||||
|
|
||||||
/* First filter: Endian conversion from src to dst */
|
/* First filter: Endian conversion from src to dst */
|
||||||
if ( (src_format & 0x1000) != (dst_format & 0x1000)
|
if ( (src_format & 0x1000) != (dst_format & 0x1000)
|
||||||
&& ((src_format & 0xff) != 8) ) {
|
&& ((src_format & 0xff) == 16) && ((dst_format & 0xff) == 16)) {
|
||||||
cvt->filters[cvt->filter_index++] = SDL_ConvertEndian;
|
cvt->filters[cvt->filter_index++] = SDL_ConvertEndian;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,9 @@ typedef struct AudioBootStrap {
|
||||||
#if SDL_AUDIO_DRIVER_BSD
|
#if SDL_AUDIO_DRIVER_BSD
|
||||||
extern AudioBootStrap BSD_AUDIO_bootstrap;
|
extern AudioBootStrap BSD_AUDIO_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_PULSE
|
||||||
|
extern AudioBootStrap PULSE_bootstrap;
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_OSS
|
#if SDL_AUDIO_DRIVER_OSS
|
||||||
extern AudioBootStrap DSP_bootstrap;
|
extern AudioBootStrap DSP_bootstrap;
|
||||||
extern AudioBootStrap DMA_bootstrap;
|
extern AudioBootStrap DMA_bootstrap;
|
||||||
|
@ -146,9 +149,6 @@ extern AudioBootStrap COREAUDIO_bootstrap;
|
||||||
#if SDL_AUDIO_DRIVER_SNDMGR
|
#if SDL_AUDIO_DRIVER_SNDMGR
|
||||||
extern AudioBootStrap SNDMGR_bootstrap;
|
extern AudioBootStrap SNDMGR_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_AHI
|
|
||||||
extern AudioBootStrap AHI_bootstrap;
|
|
||||||
#endif
|
|
||||||
#if SDL_AUDIO_DRIVER_MINT
|
#if SDL_AUDIO_DRIVER_MINT
|
||||||
extern AudioBootStrap MINTAUDIO_GSXB_bootstrap;
|
extern AudioBootStrap MINTAUDIO_GSXB_bootstrap;
|
||||||
extern AudioBootStrap MINTAUDIO_MCSN_bootstrap;
|
extern AudioBootStrap MINTAUDIO_MCSN_bootstrap;
|
||||||
|
@ -165,12 +165,18 @@ extern AudioBootStrap DUMMYAUD_bootstrap;
|
||||||
#if SDL_AUDIO_DRIVER_DC
|
#if SDL_AUDIO_DRIVER_DC
|
||||||
extern AudioBootStrap DCAUD_bootstrap;
|
extern AudioBootStrap DCAUD_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_NDS
|
||||||
|
extern AudioBootStrap NDSAUD_bootstrap;
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
||||||
extern AudioBootStrap MMEAUDIO_bootstrap;
|
extern AudioBootStrap MMEAUDIO_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_DART
|
#if SDL_AUDIO_DRIVER_DART
|
||||||
extern AudioBootStrap DART_bootstrap;
|
extern AudioBootStrap DART_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_EPOCAUDIO
|
||||||
|
extern AudioBootStrap EPOCAudio_bootstrap;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This is the current audio device */
|
/* This is the current audio device */
|
||||||
extern SDL_AudioDevice *current_audio;
|
extern SDL_AudioDevice *current_audio;
|
||||||
|
|
|
@ -1,337 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2006 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
/* Allow access to a raw mixing buffer (for AmigaOS) */
|
|
||||||
|
|
||||||
#include "SDL_audio.h"
|
|
||||||
#include "../SDL_audio_c.h"
|
|
||||||
#include "SDL_ahiaudio.h"
|
|
||||||
|
|
||||||
/* Audio driver functions */
|
|
||||||
static int AHI_OpenAudio(_THIS, SDL_AudioSpec *spec);
|
|
||||||
static void AHI_WaitAudio(_THIS);
|
|
||||||
static void AHI_PlayAudio(_THIS);
|
|
||||||
static Uint8 *AHI_GetAudioBuf(_THIS);
|
|
||||||
static void AHI_CloseAudio(_THIS);
|
|
||||||
|
|
||||||
#ifndef __SASC
|
|
||||||
#define mymalloc(x) AllocVec(x,MEMF_PUBLIC)
|
|
||||||
#define myfree FreeVec
|
|
||||||
#else
|
|
||||||
#define mymalloc malloc
|
|
||||||
#define myfree free
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Audio driver bootstrap functions */
|
|
||||||
|
|
||||||
static int Audio_Available(void)
|
|
||||||
{
|
|
||||||
int ok=0;
|
|
||||||
struct MsgPort *p;
|
|
||||||
struct AHIRequest *req;
|
|
||||||
|
|
||||||
if(p=CreateMsgPort())
|
|
||||||
{
|
|
||||||
if(req=(struct AHIRequest *)CreateIORequest(p,sizeof(struct AHIRequest)))
|
|
||||||
{
|
|
||||||
req->ahir_Version=4;
|
|
||||||
|
|
||||||
if(!OpenDevice(AHINAME,0,(struct IORequest *)req,NULL))
|
|
||||||
{
|
|
||||||
D(bug("AHI available.\n"));
|
|
||||||
ok=1;
|
|
||||||
CloseDevice((struct IORequest *)req);
|
|
||||||
}
|
|
||||||
DeleteIORequest((struct IORequest *)req);
|
|
||||||
}
|
|
||||||
DeleteMsgPort(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
D(if(!ok) bug("AHI not available\n"));
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Audio_DeleteDevice(SDL_AudioDevice *device)
|
|
||||||
{
|
|
||||||
SDL_free(device->hidden);
|
|
||||||
SDL_free(device);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SDL_AudioDevice *Audio_CreateDevice(int devindex)
|
|
||||||
{
|
|
||||||
SDL_AudioDevice *this;
|
|
||||||
|
|
||||||
#ifndef NO_AMIGADEBUG
|
|
||||||
D(bug("AHI created...\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize all variables that we clean on shutdown */
|
|
||||||
this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice));
|
|
||||||
if ( this ) {
|
|
||||||
SDL_memset(this, 0, (sizeof *this));
|
|
||||||
this->hidden = (struct SDL_PrivateAudioData *)
|
|
||||||
SDL_malloc((sizeof *this->hidden));
|
|
||||||
}
|
|
||||||
if ( (this == NULL) || (this->hidden == NULL) ) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
if ( this ) {
|
|
||||||
SDL_free(this);
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
|
|
||||||
|
|
||||||
/* Set the function pointers */
|
|
||||||
this->OpenAudio = AHI_OpenAudio;
|
|
||||||
this->WaitAudio = AHI_WaitAudio;
|
|
||||||
this->PlayAudio = AHI_PlayAudio;
|
|
||||||
this->GetAudioBuf = AHI_GetAudioBuf;
|
|
||||||
this->CloseAudio = AHI_CloseAudio;
|
|
||||||
|
|
||||||
this->free = Audio_DeleteDevice;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioBootStrap AHI_bootstrap = {
|
|
||||||
"AHI", Audio_Available, Audio_CreateDevice
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void static AHI_WaitAudio(_THIS)
|
|
||||||
{
|
|
||||||
if(!CheckIO((struct IORequest *)audio_req[current_buffer]))
|
|
||||||
{
|
|
||||||
WaitIO((struct IORequest *)audio_req[current_buffer]);
|
|
||||||
// AbortIO((struct IORequest *)audio_req[current_buffer]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void AHI_PlayAudio(_THIS)
|
|
||||||
{
|
|
||||||
if(playing>1)
|
|
||||||
WaitIO((struct IORequest *)audio_req[current_buffer]);
|
|
||||||
|
|
||||||
/* Write the audio data out */
|
|
||||||
audio_req[current_buffer] -> ahir_Std. io_Message.mn_Node.ln_Pri = 60;
|
|
||||||
audio_req[current_buffer] -> ahir_Std. io_Data = mixbuf[current_buffer];
|
|
||||||
audio_req[current_buffer] -> ahir_Std. io_Length = this->hidden->size;
|
|
||||||
audio_req[current_buffer] -> ahir_Std. io_Offset = 0;
|
|
||||||
audio_req[current_buffer] -> ahir_Std . io_Command = CMD_WRITE;
|
|
||||||
audio_req[current_buffer] -> ahir_Frequency = this->hidden->freq;
|
|
||||||
audio_req[current_buffer] -> ahir_Volume = 0x10000;
|
|
||||||
audio_req[current_buffer] -> ahir_Type = this->hidden->type;
|
|
||||||
audio_req[current_buffer] -> ahir_Position = 0x8000;
|
|
||||||
audio_req[current_buffer] -> ahir_Link = (playing>0 ? audio_req[current_buffer^1] : NULL);
|
|
||||||
|
|
||||||
SendIO((struct IORequest *)audio_req[current_buffer]);
|
|
||||||
current_buffer^=1;
|
|
||||||
|
|
||||||
playing++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Uint8 *AHI_GetAudioBuf(_THIS)
|
|
||||||
{
|
|
||||||
return(mixbuf[current_buffer]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void AHI_CloseAudio(_THIS)
|
|
||||||
{
|
|
||||||
D(bug("Closing audio...\n"));
|
|
||||||
|
|
||||||
playing=0;
|
|
||||||
|
|
||||||
if(audio_req[0])
|
|
||||||
{
|
|
||||||
if(audio_req[1])
|
|
||||||
{
|
|
||||||
D(bug("Break req[1]...\n"));
|
|
||||||
|
|
||||||
AbortIO((struct IORequest *)audio_req[1]);
|
|
||||||
WaitIO((struct IORequest *)audio_req[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Break req[0]...\n"));
|
|
||||||
|
|
||||||
AbortIO((struct IORequest *)audio_req[0]);
|
|
||||||
WaitIO((struct IORequest *)audio_req[0]);
|
|
||||||
|
|
||||||
if(audio_req[1])
|
|
||||||
{
|
|
||||||
D(bug("Break AGAIN req[1]...\n"));
|
|
||||||
AbortIO((struct IORequest *)audio_req[1]);
|
|
||||||
WaitIO((struct IORequest *)audio_req[1]);
|
|
||||||
}
|
|
||||||
// Double abort to be sure to break the dbuffering process.
|
|
||||||
|
|
||||||
SDL_Delay(200);
|
|
||||||
|
|
||||||
D(bug("Reqs breaked, closing device...\n"));
|
|
||||||
CloseDevice((struct IORequest *)audio_req[0]);
|
|
||||||
D(bug("Device closed, freeing memory...\n"));
|
|
||||||
myfree(audio_req[1]);
|
|
||||||
D(bug("Memory freed, deleting IOReq...\n"));
|
|
||||||
DeleteIORequest((struct IORequest *)audio_req[0]);
|
|
||||||
audio_req[0]=audio_req[1]=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Freeing mixbuf[0]...\n"));
|
|
||||||
if ( mixbuf[0] != NULL ) {
|
|
||||||
myfree(mixbuf[0]);
|
|
||||||
// SDL_FreeAudioMem(mixbuf[0]);
|
|
||||||
mixbuf[0] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Freeing mixbuf[1]...\n"));
|
|
||||||
if ( mixbuf[1] != NULL ) {
|
|
||||||
myfree(mixbuf[1]);
|
|
||||||
// SDL_FreeAudioMem(mixbuf[1]);
|
|
||||||
mixbuf[1] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Freeing audio_port...\n"));
|
|
||||||
|
|
||||||
if ( audio_port != NULL ) {
|
|
||||||
DeleteMsgPort(audio_port);
|
|
||||||
audio_port = NULL;
|
|
||||||
}
|
|
||||||
D(bug("...done!\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int AHI_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
|
||||||
{
|
|
||||||
// int width;
|
|
||||||
|
|
||||||
D(bug("AHI opening...\n"));
|
|
||||||
|
|
||||||
/* Determine the audio parameters from the AudioSpec */
|
|
||||||
switch ( spec->format & 0xFF ) {
|
|
||||||
|
|
||||||
case 8: { /* Signed 8 bit audio data */
|
|
||||||
D(bug("Samples a 8 bit...\n"));
|
|
||||||
spec->format = AUDIO_S8;
|
|
||||||
this->hidden->bytespersample=1;
|
|
||||||
if(spec->channels<2)
|
|
||||||
this->hidden->type = AHIST_M8S;
|
|
||||||
else
|
|
||||||
this->hidden->type = AHIST_S8S;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 16: { /* Signed 16 bit audio data */
|
|
||||||
D(bug("Samples a 16 bit...\n"));
|
|
||||||
spec->format = AUDIO_S16MSB;
|
|
||||||
this->hidden->bytespersample=2;
|
|
||||||
if(spec->channels<2)
|
|
||||||
this->hidden->type = AHIST_M16S;
|
|
||||||
else
|
|
||||||
this->hidden->type = AHIST_S16S;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: {
|
|
||||||
SDL_SetError("Unsupported audio format");
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(spec->channels!=1 && spec->channels!=2)
|
|
||||||
{
|
|
||||||
D(bug("Wrong channel number!\n"));
|
|
||||||
SDL_SetError("Channel number non supported");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Before CalculateAudioSpec\n"));
|
|
||||||
/* Update the fragment size as size in bytes */
|
|
||||||
SDL_CalculateAudioSpec(spec);
|
|
||||||
|
|
||||||
D(bug("Before CreateMsgPort\n"));
|
|
||||||
|
|
||||||
if(!(audio_port=CreateMsgPort()))
|
|
||||||
{
|
|
||||||
SDL_SetError("Unable to create a MsgPort");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Before CreateIORequest\n"));
|
|
||||||
|
|
||||||
if(!(audio_req[0]=(struct AHIRequest *)CreateIORequest(audio_port,sizeof(struct AHIRequest))))
|
|
||||||
{
|
|
||||||
SDL_SetError("Unable to create an AHIRequest");
|
|
||||||
DeleteMsgPort(audio_port);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
audio_req[0]->ahir_Version = 4;
|
|
||||||
|
|
||||||
if(OpenDevice(AHINAME,0,(struct IORequest *)audio_req[0],NULL))
|
|
||||||
{
|
|
||||||
SDL_SetError("Unable to open AHI device!\n");
|
|
||||||
DeleteIORequest((struct IORequest *)audio_req[0]);
|
|
||||||
DeleteMsgPort(audio_port);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("AFTER opendevice\n"));
|
|
||||||
|
|
||||||
/* Set output frequency and size */
|
|
||||||
this->hidden->freq = spec->freq;
|
|
||||||
this->hidden->size = spec->size;
|
|
||||||
|
|
||||||
D(bug("Before buffer allocation\n"));
|
|
||||||
|
|
||||||
/* Allocate mixing buffer */
|
|
||||||
mixbuf[0] = (Uint8 *)mymalloc(spec->size);
|
|
||||||
mixbuf[1] = (Uint8 *)mymalloc(spec->size);
|
|
||||||
|
|
||||||
D(bug("Before audio_req allocation\n"));
|
|
||||||
|
|
||||||
if(!(audio_req[1]=mymalloc(sizeof(struct AHIRequest))))
|
|
||||||
{
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Before audio_req memcpy\n"));
|
|
||||||
|
|
||||||
SDL_memcpy(audio_req[1],audio_req[0],sizeof(struct AHIRequest));
|
|
||||||
|
|
||||||
if ( mixbuf[0] == NULL || mixbuf[1] == NULL ) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
D(bug("Before mixbuf memset\n"));
|
|
||||||
|
|
||||||
SDL_memset(mixbuf[0], spec->silence, spec->size);
|
|
||||||
SDL_memset(mixbuf[1], spec->silence, spec->size);
|
|
||||||
|
|
||||||
current_buffer=0;
|
|
||||||
playing=0;
|
|
||||||
|
|
||||||
D(bug("AHI opened: freq:%ld mixbuf:%lx/%lx buflen:%ld bits:%ld channels:%ld\n",spec->freq,mixbuf[0],mixbuf[1],spec->size,this->hidden->bytespersample*8,spec->channels));
|
|
||||||
|
|
||||||
/* We're ready to rock and roll. :-) */
|
|
||||||
return(0);
|
|
||||||
}
|
|
|
@ -23,6 +23,11 @@
|
||||||
|
|
||||||
/* Allow access to a raw mixing buffer */
|
/* Allow access to a raw mixing buffer */
|
||||||
|
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "SDL_timer.h"
|
#include "SDL_timer.h"
|
||||||
#include "SDL_audio.h"
|
#include "SDL_audio.h"
|
||||||
#include "../SDL_audiomem.h"
|
#include "../SDL_audiomem.h"
|
||||||
|
@ -60,6 +65,8 @@ static int (*SDL_NAME(arts_stream_set))(arts_stream_t s, arts_parameter_t param,
|
||||||
static int (*SDL_NAME(arts_stream_get))(arts_stream_t s, arts_parameter_t param);
|
static int (*SDL_NAME(arts_stream_get))(arts_stream_t s, arts_parameter_t param);
|
||||||
static int (*SDL_NAME(arts_write))(arts_stream_t s, const void *buffer, int count);
|
static int (*SDL_NAME(arts_write))(arts_stream_t s, const void *buffer, int count);
|
||||||
static void (*SDL_NAME(arts_close_stream))(arts_stream_t s);
|
static void (*SDL_NAME(arts_close_stream))(arts_stream_t s);
|
||||||
|
static int (*SDL_NAME(arts_suspended))(void);
|
||||||
|
static const char *(*SDL_NAME(arts_error_text))(int errorcode);
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -72,6 +79,8 @@ static struct {
|
||||||
{ "arts_stream_get", (void **)&SDL_NAME(arts_stream_get) },
|
{ "arts_stream_get", (void **)&SDL_NAME(arts_stream_get) },
|
||||||
{ "arts_write", (void **)&SDL_NAME(arts_write) },
|
{ "arts_write", (void **)&SDL_NAME(arts_write) },
|
||||||
{ "arts_close_stream", (void **)&SDL_NAME(arts_close_stream) },
|
{ "arts_close_stream", (void **)&SDL_NAME(arts_close_stream) },
|
||||||
|
{ "arts_suspended", (void **)&SDL_NAME(arts_suspended) },
|
||||||
|
{ "arts_error_text", (void **)&SDL_NAME(arts_error_text) },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void UnloadARTSLibrary()
|
static void UnloadARTSLibrary()
|
||||||
|
@ -127,14 +136,14 @@ static int Audio_Available(void)
|
||||||
return available;
|
return available;
|
||||||
}
|
}
|
||||||
if ( SDL_NAME(arts_init)() == 0 ) {
|
if ( SDL_NAME(arts_init)() == 0 ) {
|
||||||
#define ARTS_CRASH_HACK /* Play a stream so aRts doesn't crash */
|
if ( SDL_NAME(arts_suspended)() ) {
|
||||||
#ifdef ARTS_CRASH_HACK
|
/* Play a stream so aRts doesn't crash */
|
||||||
arts_stream_t stream2;
|
arts_stream_t stream2;
|
||||||
stream2=SDL_NAME(arts_play_stream)(44100, 16, 2, "SDL");
|
stream2=SDL_NAME(arts_play_stream)(44100, 16, 2, "SDL");
|
||||||
SDL_NAME(arts_write)(stream2, "", 0);
|
SDL_NAME(arts_write)(stream2, "", 0);
|
||||||
SDL_NAME(arts_close_stream)(stream2);
|
SDL_NAME(arts_close_stream)(stream2);
|
||||||
#endif
|
|
||||||
available = 1;
|
available = 1;
|
||||||
|
}
|
||||||
SDL_NAME(arts_free)();
|
SDL_NAME(arts_free)();
|
||||||
}
|
}
|
||||||
UnloadARTSLibrary();
|
UnloadARTSLibrary();
|
||||||
|
@ -255,6 +264,7 @@ static int ARTS_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
{
|
{
|
||||||
int bits, frag_spec;
|
int bits, frag_spec;
|
||||||
Uint16 test_format, format;
|
Uint16 test_format, format;
|
||||||
|
int error_code;
|
||||||
|
|
||||||
/* Reset the timer synchronization flag */
|
/* Reset the timer synchronization flag */
|
||||||
frame_ticks = 0.0;
|
frame_ticks = 0.0;
|
||||||
|
@ -292,8 +302,13 @@ static int ARTS_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
}
|
}
|
||||||
spec->format = test_format;
|
spec->format = test_format;
|
||||||
|
|
||||||
if ( SDL_NAME(arts_init)() != 0 ) {
|
error_code = SDL_NAME(arts_init)();
|
||||||
SDL_SetError("Unable to initialize ARTS");
|
if ( error_code != 0 ) {
|
||||||
|
SDL_SetError("Unable to initialize ARTS: %s", SDL_NAME(arts_error_text)(error_code));
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
if ( ! SDL_NAME(arts_suspended)() ) {
|
||||||
|
SDL_SetError("ARTS can not open audio device");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
stream = SDL_NAME(arts_play_stream)(spec->freq, bits, spec->channels, "SDL");
|
stream = SDL_NAME(arts_play_stream)(spec->freq, bits, spec->channels, "SDL");
|
||||||
|
|
|
@ -152,36 +152,53 @@ void BE_CloseAudio(_THIS)
|
||||||
|
|
||||||
int BE_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
int BE_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
{
|
{
|
||||||
|
int valid_datatype = 0;
|
||||||
media_raw_audio_format format;
|
media_raw_audio_format format;
|
||||||
|
Uint16 test_format = SDL_FirstAudioFormat(spec->format);
|
||||||
|
|
||||||
|
/* Parse the audio format and fill the Be raw audio format */
|
||||||
|
memset(&format, '\0', sizeof (media_raw_audio_format));
|
||||||
|
format.byte_order = B_MEDIA_LITTLE_ENDIAN;
|
||||||
|
format.frame_rate = (float) spec->freq;
|
||||||
|
format.channel_count = spec->channels; /* !!! FIXME: support > 2? */
|
||||||
|
while ((!valid_datatype) && (test_format)) {
|
||||||
|
valid_datatype = 1;
|
||||||
|
spec->format = test_format;
|
||||||
|
switch (test_format) {
|
||||||
|
case AUDIO_S8:
|
||||||
|
format.format = media_raw_audio_format::B_AUDIO_CHAR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AUDIO_U8:
|
||||||
|
format.format = media_raw_audio_format::B_AUDIO_UCHAR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AUDIO_S16LSB:
|
||||||
|
format.format = media_raw_audio_format::B_AUDIO_SHORT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AUDIO_S16MSB:
|
||||||
|
format.format = media_raw_audio_format::B_AUDIO_SHORT;
|
||||||
|
format.byte_order = B_MEDIA_BIG_ENDIAN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
valid_datatype = 0;
|
||||||
|
test_format = SDL_NextAudioFormat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid_datatype) { /* shouldn't happen, but just in case... */
|
||||||
|
SDL_SetError("Unsupported audio format");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the Be Application, if it's not already started */
|
/* Initialize the Be Application, if it's not already started */
|
||||||
if (SDL_InitBeApp() < 0) {
|
if (SDL_InitBeApp() < 0) {
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the audio format and fill the Be raw audio format */
|
|
||||||
format.frame_rate = (float)spec->freq;
|
|
||||||
format.channel_count = spec->channels;
|
|
||||||
switch (spec->format&~0x1000) {
|
|
||||||
case AUDIO_S8:
|
|
||||||
/* Signed 8-bit audio unsupported, convert to U8 */
|
|
||||||
spec->format = AUDIO_U8;
|
|
||||||
case AUDIO_U8:
|
|
||||||
format.format = media_raw_audio_format::B_AUDIO_UCHAR;
|
|
||||||
format.byte_order = 0;
|
|
||||||
break;
|
|
||||||
case AUDIO_U16:
|
|
||||||
/* Unsigned 16-bit audio unsupported, convert to S16 */
|
|
||||||
spec->format ^= 0x8000;
|
|
||||||
case AUDIO_S16:
|
|
||||||
format.format = media_raw_audio_format::B_AUDIO_SHORT;
|
|
||||||
if ( spec->format & 0x1000 ) {
|
|
||||||
format.byte_order = 1; /* Big endian */
|
|
||||||
} else {
|
|
||||||
format.byte_order = 2; /* Little endian */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
format.buffer_size = spec->samples;
|
format.buffer_size = spec->samples;
|
||||||
|
|
||||||
/* Calculate the final parameters for this audio specification */
|
/* Calculate the final parameters for this audio specification */
|
||||||
|
|
|
@ -75,6 +75,8 @@ LONG APIENTRY DARTEventFunc(ULONG ulStatus,
|
||||||
|
|
||||||
int DART_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
int DART_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
{
|
{
|
||||||
|
Uint16 test_format = SDL_FirstAudioFormat(spec->format);
|
||||||
|
int valid_datatype = 0;
|
||||||
MCI_AMP_OPEN_PARMS AmpOpenParms;
|
MCI_AMP_OPEN_PARMS AmpOpenParms;
|
||||||
MCI_GENERIC_PARMS GenericParms;
|
MCI_GENERIC_PARMS GenericParms;
|
||||||
int iDeviceOrd = 0; // Default device to be used
|
int iDeviceOrd = 0; // Default device to be used
|
||||||
|
@ -106,26 +108,39 @@ int DART_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
iDeviceOrd = AmpOpenParms.usDeviceID;
|
iDeviceOrd = AmpOpenParms.usDeviceID;
|
||||||
|
|
||||||
// Determine the audio parameters from the AudioSpec
|
// Determine the audio parameters from the AudioSpec
|
||||||
switch ( spec->format & 0xFF )
|
if (spec->channels > 2)
|
||||||
{
|
spec->channels = 2; // !!! FIXME: more than stereo support in OS/2?
|
||||||
case 8:
|
|
||||||
/* Unsigned 8 bit audio data */
|
while ((!valid_datatype) && (test_format)) {
|
||||||
spec->format = AUDIO_U8;
|
spec->format = test_format;
|
||||||
|
valid_datatype = 1;
|
||||||
|
switch (test_format) {
|
||||||
|
case AUDIO_U8:
|
||||||
|
// Unsigned 8 bit audio data
|
||||||
iSilence = 0x80;
|
iSilence = 0x80;
|
||||||
iBits = 8;
|
iBits = 8;
|
||||||
break;
|
break;
|
||||||
case 16:
|
|
||||||
/* Signed 16 bit audio data */
|
case AUDIO_S16LSB:
|
||||||
spec->format = AUDIO_S16;
|
// Signed 16 bit audio data
|
||||||
iSilence = 0x00;
|
iSilence = 0x00;
|
||||||
iBits = 16;
|
iBits = 16;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
valid_datatype = 0;
|
||||||
|
test_format = SDL_NextAudioFormat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid_datatype) { // shouldn't happen, but just in case...
|
||||||
// Close DART, and exit with error code!
|
// Close DART, and exit with error code!
|
||||||
mciSendCommand(iDeviceOrd, MCI_CLOSE, MCI_WAIT, &GenericParms, 0);
|
mciSendCommand(iDeviceOrd, MCI_CLOSE, MCI_WAIT, &GenericParms, 0);
|
||||||
SDL_SetError("Unsupported audio format");
|
SDL_SetError("Unsupported audio format");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
iFreq = spec->freq;
|
iFreq = spec->freq;
|
||||||
iChannels = spec->channels;
|
iChannels = spec->channels;
|
||||||
/* Update the fragment size as size in bytes */
|
/* Update the fragment size as size in bytes */
|
||||||
|
|
|
@ -201,14 +201,31 @@ static void DCAUD_CloseAudio(_THIS)
|
||||||
|
|
||||||
static int DCAUD_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
static int DCAUD_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
{
|
{
|
||||||
switch(spec->format&0xff) {
|
Uint16 test_format = SDL_FirstAudioFormat(spec->format);
|
||||||
case 8: spec->format = AUDIO_S8; break;
|
int valid_datatype = 0;
|
||||||
case 16: spec->format = AUDIO_S16LSB; break;
|
while ((!valid_datatype) && (test_format)) {
|
||||||
|
spec->format = test_format;
|
||||||
|
switch (test_format) {
|
||||||
|
/* only formats Dreamcast accepts... */
|
||||||
|
case AUDIO_S8:
|
||||||
|
case AUDIO_S16LSB:
|
||||||
|
valid_datatype = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
test_format = SDL_NextAudioFormat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid_datatype) { /* shouldn't happen, but just in case... */
|
||||||
SDL_SetError("Unsupported audio format");
|
SDL_SetError("Unsupported audio format");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (spec->channels > 2)
|
||||||
|
spec->channels = 2; /* no more than stereo on the Dreamcast. */
|
||||||
|
|
||||||
/* Update the fragment size as size in bytes */
|
/* Update the fragment size as size in bytes */
|
||||||
SDL_CalculateAudioSpec(spec);
|
SDL_CalculateAudioSpec(spec);
|
||||||
|
|
||||||
|
|
|
@ -141,68 +141,93 @@ static void AL_CloseAudio(_THIS)
|
||||||
|
|
||||||
static int AL_OpenAudio(_THIS, SDL_AudioSpec * spec)
|
static int AL_OpenAudio(_THIS, SDL_AudioSpec * spec)
|
||||||
{
|
{
|
||||||
ALconfig audio_config;
|
Uint16 test_format = SDL_FirstAudioFormat(spec->format);
|
||||||
|
long width = 0;
|
||||||
|
long fmt = 0;
|
||||||
|
int valid = 0;
|
||||||
|
|
||||||
#ifdef OLD_IRIX_AUDIO
|
#ifdef OLD_IRIX_AUDIO
|
||||||
|
{
|
||||||
long audio_param[2];
|
long audio_param[2];
|
||||||
|
audio_param[0] = AL_OUTPUT_RATE;
|
||||||
|
audio_param[1] = spec->freq;
|
||||||
|
valid = (ALsetparams(AL_DEFAULT_DEVICE, audio_param, 2) < 0);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
{
|
||||||
ALpv audio_param;
|
ALpv audio_param;
|
||||||
|
audio_param.param = AL_RATE;
|
||||||
|
audio_param.value.i = spec->freq;
|
||||||
|
valid = (alSetParams(AL_DEFAULT_OUTPUT, &audio_param, 1) < 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
int width;
|
|
||||||
|
|
||||||
/* Determine the audio parameters from the AudioSpec */
|
while ((!valid) && (test_format)) {
|
||||||
switch ( spec->format & 0xFF ) {
|
valid = 1;
|
||||||
|
spec->format = test_format;
|
||||||
|
|
||||||
case 8: { /* Signed 8 bit audio data */
|
switch (test_format) {
|
||||||
spec->format = AUDIO_S8;
|
case AUDIO_S8:
|
||||||
width = AL_SAMPLE_8;
|
width = AL_SAMPLE_8;
|
||||||
}
|
fmt = AL_SAMPFMT_TWOSCOMP;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16: { /* Signed 16 bit audio data */
|
case AUDIO_S16SYS:
|
||||||
spec->format = AUDIO_S16MSB;
|
|
||||||
width = AL_SAMPLE_16;
|
width = AL_SAMPLE_16;
|
||||||
}
|
fmt = AL_SAMPFMT_TWOSCOMP;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: {
|
default:
|
||||||
|
valid = 0;
|
||||||
|
test_format = SDL_NextAudioFormat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valid) {
|
||||||
|
ALconfig audio_config = alNewConfig();
|
||||||
|
valid = 0;
|
||||||
|
if (audio_config) {
|
||||||
|
if (alSetChannels(audio_config, spec->channels) < 0) {
|
||||||
|
if (spec->channels > 2) { /* can't handle > stereo? */
|
||||||
|
spec->channels = 2; /* try again below. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((alSetSampFmt(audio_config, fmt) >= 0) &&
|
||||||
|
((!width) || (alSetWidth(audio_config, width) >= 0)) &&
|
||||||
|
(alSetQueueSize(audio_config, spec->samples * 2) >= 0) &&
|
||||||
|
(alSetChannels(audio_config, spec->channels) >= 0)) {
|
||||||
|
|
||||||
|
audio_port = alOpenPort("SDL audio", "w", audio_config);
|
||||||
|
if (audio_port == NULL) {
|
||||||
|
/* docs say AL_BAD_CHANNELS happens here, too. */
|
||||||
|
int err = oserror();
|
||||||
|
if (err == AL_BAD_CHANNELS) {
|
||||||
|
spec->channels = 2;
|
||||||
|
alSetChannels(audio_config, spec->channels);
|
||||||
|
audio_port = alOpenPort("SDL audio", "w",
|
||||||
|
audio_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audio_port != NULL) {
|
||||||
|
valid = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
alFreeConfig(audio_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid) {
|
||||||
SDL_SetError("Unsupported audio format");
|
SDL_SetError("Unsupported audio format");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the fragment size as size in bytes */
|
/* Update the fragment size as size in bytes */
|
||||||
SDL_CalculateAudioSpec(spec);
|
SDL_CalculateAudioSpec(spec);
|
||||||
|
|
||||||
/* Set output frequency */
|
|
||||||
#ifdef OLD_IRIX_AUDIO
|
|
||||||
audio_param[0] = AL_OUTPUT_RATE;
|
|
||||||
audio_param[1] = spec->freq;
|
|
||||||
if( ALsetparams(AL_DEFAULT_DEVICE, audio_param, 2) < 0 ) {
|
|
||||||
#else
|
|
||||||
audio_param.param = AL_RATE;
|
|
||||||
audio_param.value.i = spec->freq;
|
|
||||||
if( alSetParams(AL_DEFAULT_OUTPUT, &audio_param, 1) < 0 ) {
|
|
||||||
#endif
|
|
||||||
SDL_SetError("alSetParams failed");
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open the audio port with the requested frequency */
|
|
||||||
audio_port = NULL;
|
|
||||||
audio_config = alNewConfig();
|
|
||||||
if ( audio_config &&
|
|
||||||
(alSetSampFmt(audio_config, AL_SAMPFMT_TWOSCOMP) >= 0) &&
|
|
||||||
(alSetWidth(audio_config, width) >= 0) &&
|
|
||||||
(alSetQueueSize(audio_config, spec->samples*2) >= 0) &&
|
|
||||||
(alSetChannels(audio_config, spec->channels) >= 0) ) {
|
|
||||||
audio_port = alOpenPort("SDL audio", "w", audio_config);
|
|
||||||
}
|
|
||||||
alFreeConfig(audio_config);
|
|
||||||
if( audio_port == NULL ) {
|
|
||||||
SDL_SetError("Unable to open audio port");
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate mixing buffer */
|
/* Allocate mixing buffer */
|
||||||
mixbuf = (Uint8 *) SDL_AllocAudioMem(spec->size);
|
mixbuf = (Uint8 *) SDL_AllocAudioMem(spec->size);
|
||||||
if (mixbuf == NULL) {
|
if (mixbuf == NULL) {
|
||||||
|
@ -214,3 +239,4 @@ static int AL_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
/* We're ready to rock and roll. :-) */
|
/* We're ready to rock and roll. :-) */
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,6 +168,15 @@ static int DSP_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
int frag_spec;
|
int frag_spec;
|
||||||
Uint16 test_format;
|
Uint16 test_format;
|
||||||
|
|
||||||
|
/* Make sure fragment size stays a power of 2, or OSS fails. */
|
||||||
|
/* I don't know which of these are actually legal values, though... */
|
||||||
|
if (spec->channels > 8)
|
||||||
|
spec->channels = 8;
|
||||||
|
else if (spec->channels > 4)
|
||||||
|
spec->channels = 4;
|
||||||
|
else if (spec->channels > 2)
|
||||||
|
spec->channels = 2;
|
||||||
|
|
||||||
/* Open the audio device */
|
/* Open the audio device */
|
||||||
audio_fd = SDL_OpenAudioPath(audiodev, sizeof(audiodev), OPEN_FLAGS, 0);
|
audio_fd = SDL_OpenAudioPath(audiodev, sizeof(audiodev), OPEN_FLAGS, 0);
|
||||||
if ( audio_fd < 0 ) {
|
if ( audio_fd < 0 ) {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <mint/osbind.h>
|
#include <mint/osbind.h>
|
||||||
#include <mint/falcon.h>
|
#include <mint/falcon.h>
|
||||||
#include <mint/mintbind.h>
|
#include <mint/mintbind.h>
|
||||||
|
#include <mint/cookie.h>
|
||||||
|
|
||||||
#include "SDL_audio.h"
|
#include "SDL_audio.h"
|
||||||
#include "SDL_mintaudio.h"
|
#include "SDL_mintaudio.h"
|
||||||
|
@ -46,6 +47,7 @@ volatile unsigned short SDL_MintAudio_numbuf; /* Buffer to play */
|
||||||
volatile unsigned short SDL_MintAudio_mutex;
|
volatile unsigned short SDL_MintAudio_mutex;
|
||||||
volatile unsigned long SDL_MintAudio_clocktics;
|
volatile unsigned long SDL_MintAudio_clocktics;
|
||||||
cookie_stfa_t *SDL_MintAudio_stfa;
|
cookie_stfa_t *SDL_MintAudio_stfa;
|
||||||
|
unsigned short SDL_MintAudio_hasfpu;
|
||||||
|
|
||||||
/* MiNT thread variables */
|
/* MiNT thread variables */
|
||||||
SDL_bool SDL_MintAudio_mint_present;
|
SDL_bool SDL_MintAudio_mint_present;
|
||||||
|
@ -139,6 +141,26 @@ int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq)
|
||||||
return MINTAUDIO_freqcount-1;
|
return MINTAUDIO_freqcount-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if FPU is present */
|
||||||
|
void SDL_MintAudio_CheckFpu(void)
|
||||||
|
{
|
||||||
|
unsigned long cookie_fpu;
|
||||||
|
|
||||||
|
SDL_MintAudio_hasfpu = 0;
|
||||||
|
if (Getcookie(C__FPU, &cookie_fpu) != C_FOUND) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch ((cookie_fpu>>16)&0xfffe) {
|
||||||
|
case 2:
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
case 16:
|
||||||
|
SDL_MintAudio_hasfpu = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The thread function, used under MiNT with xbios */
|
/* The thread function, used under MiNT with xbios */
|
||||||
int SDL_MintAudio_Thread(long param)
|
int SDL_MintAudio_Thread(long param)
|
||||||
{
|
{
|
||||||
|
|
|
@ -123,6 +123,7 @@ extern volatile unsigned short SDL_MintAudio_numbuf; /* Buffer to play */
|
||||||
extern volatile unsigned short SDL_MintAudio_mutex;
|
extern volatile unsigned short SDL_MintAudio_mutex;
|
||||||
extern cookie_stfa_t *SDL_MintAudio_stfa;
|
extern cookie_stfa_t *SDL_MintAudio_stfa;
|
||||||
extern volatile unsigned long SDL_MintAudio_clocktics;
|
extern volatile unsigned long SDL_MintAudio_clocktics;
|
||||||
|
extern unsigned short SDL_MintAudio_hasfpu; /* To preserve fpu registers if needed */
|
||||||
|
|
||||||
/* MiNT thread variables */
|
/* MiNT thread variables */
|
||||||
extern SDL_bool SDL_MintAudio_mint_present;
|
extern SDL_bool SDL_MintAudio_mint_present;
|
||||||
|
@ -135,6 +136,7 @@ void SDL_MintAudio_Callback(void);
|
||||||
void SDL_MintAudio_AddFrequency(_THIS, Uint32 frequency, Uint32 clock,
|
void SDL_MintAudio_AddFrequency(_THIS, Uint32 frequency, Uint32 clock,
|
||||||
Uint32 prediv, int gpio_bits);
|
Uint32 prediv, int gpio_bits);
|
||||||
int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq);
|
int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq);
|
||||||
|
void SDL_MintAudio_CheckFpu(void);
|
||||||
|
|
||||||
/* MiNT thread functions */
|
/* MiNT thread functions */
|
||||||
int SDL_MintAudio_Thread(long param);
|
int SDL_MintAudio_Thread(long param);
|
||||||
|
|
|
@ -217,6 +217,9 @@ static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
||||||
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
||||||
|
|
||||||
|
if (spec->channels > 2)
|
||||||
|
spec->channels = 2;
|
||||||
|
|
||||||
/* Check formats available */
|
/* Check formats available */
|
||||||
spec->format = AUDIO_S8;
|
spec->format = AUDIO_S8;
|
||||||
|
|
||||||
|
@ -349,6 +352,8 @@ static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
||||||
|
|
||||||
|
SDL_MintAudio_CheckFpu();
|
||||||
|
|
||||||
/* Setup audio hardware */
|
/* Setup audio hardware */
|
||||||
Mint_InitAudio(this, spec);
|
Mint_InitAudio(this, spec);
|
||||||
|
|
||||||
|
|
|
@ -201,6 +201,8 @@ static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
{
|
{
|
||||||
long snd_format;
|
long snd_format;
|
||||||
int i, resolution, format_signed, format_bigendian;
|
int i, resolution, format_signed, format_bigendian;
|
||||||
|
Uint16 test_format = SDL_FirstAudioFormat(spec->format);
|
||||||
|
int valid_datatype = 0;
|
||||||
|
|
||||||
resolution = spec->format & 0x00ff;
|
resolution = spec->format & 0x00ff;
|
||||||
format_signed = ((spec->format & 0x8000)!=0);
|
format_signed = ((spec->format & 0x8000)!=0);
|
||||||
|
@ -212,28 +214,46 @@ static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
||||||
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
||||||
|
|
||||||
|
if (spec->channels > 2) {
|
||||||
|
spec->channels = 2; /* no more than stereo! */
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((!valid_datatype) && (test_format)) {
|
||||||
/* Check formats available */
|
/* Check formats available */
|
||||||
snd_format = Sndstatus(SND_QUERYFORMATS);
|
snd_format = Sndstatus(SND_QUERYFORMATS);
|
||||||
switch (resolution) {
|
spec->format = test_format;
|
||||||
case 8:
|
resolution = spec->format & 0xff;
|
||||||
if ((snd_format & SND_FORMAT8)==0) {
|
format_signed = (spec->format & (1<<15));
|
||||||
SDL_SetError("Mint_CheckAudio: 8 bits samples not supported");
|
format_bigendian = (spec->format & (1<<12));
|
||||||
return -1;
|
switch (test_format) {
|
||||||
}
|
case AUDIO_U8:
|
||||||
|
case AUDIO_S8:
|
||||||
|
if (snd_format & SND_FORMAT8) {
|
||||||
|
valid_datatype = 1;
|
||||||
snd_format = Sndstatus(SND_QUERY8BIT);
|
snd_format = Sndstatus(SND_QUERY8BIT);
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
if ((snd_format & SND_FORMAT16)==0) {
|
|
||||||
SDL_SetError("Mint_CheckAudio: 16 bits samples not supported");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AUDIO_U16LSB:
|
||||||
|
case AUDIO_S16LSB:
|
||||||
|
case AUDIO_U16MSB:
|
||||||
|
case AUDIO_S16MSB:
|
||||||
|
if (snd_format & SND_FORMAT16) {
|
||||||
|
valid_datatype = 1;
|
||||||
snd_format = Sndstatus(SND_QUERY16BIT);
|
snd_format = Sndstatus(SND_QUERY16BIT);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SDL_SetError("Mint_CheckAudio: Unsupported sample resolution");
|
test_format = SDL_NextAudioFormat();
|
||||||
return -1;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid_datatype) {
|
||||||
|
SDL_SetError("Unsupported audio format");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check signed/unsigned format */
|
/* Check signed/unsigned format */
|
||||||
if (format_signed) {
|
if (format_signed) {
|
||||||
|
@ -386,6 +406,8 @@ static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
||||||
|
|
||||||
|
SDL_MintAudio_CheckFpu();
|
||||||
|
|
||||||
/* Setup audio hardware */
|
/* Setup audio hardware */
|
||||||
Mint_InitAudio(this, spec);
|
Mint_InitAudio(this, spec);
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
.globl _SDL_MintAudio_numbuf
|
.globl _SDL_MintAudio_numbuf
|
||||||
.globl _SDL_MintAudio_audiosize
|
.globl _SDL_MintAudio_audiosize
|
||||||
.globl _SDL_MintAudio_clocktics
|
.globl _SDL_MintAudio_clocktics
|
||||||
|
.globl _SDL_MintAudio_hasfpu
|
||||||
|
|
||||||
.globl _SDL_MintAudio_stfa
|
.globl _SDL_MintAudio_stfa
|
||||||
|
|
||||||
|
@ -77,7 +78,7 @@ _SDL_MintAudio_XbiosInterrupt:
|
||||||
|
|
||||||
/* Check if we are not already running */
|
/* Check if we are not already running */
|
||||||
tstw _SDL_MintAudio_mutex
|
tstw _SDL_MintAudio_mutex
|
||||||
bnes SDL_MintAudio_XbiosEnd
|
bne SDL_MintAudio_XbiosEnd
|
||||||
notw _SDL_MintAudio_mutex
|
notw _SDL_MintAudio_mutex
|
||||||
|
|
||||||
/* Swap buffers */
|
/* Swap buffers */
|
||||||
|
@ -85,9 +86,29 @@ _SDL_MintAudio_XbiosInterrupt:
|
||||||
|
|
||||||
moveml d0-d7/a0-a6,sp@-
|
moveml d0-d7/a0-a6,sp@-
|
||||||
|
|
||||||
|
/* Save FPU if needed */
|
||||||
|
tstw _SDL_MintAudio_hasfpu
|
||||||
|
beqs SDL_MintAudio_Xbios_nofpu1
|
||||||
|
.chip 68060
|
||||||
|
fsave sp@-
|
||||||
|
fmoveml fpcr/fpsr/fpiar,sp@-
|
||||||
|
fmovemx fp0-fp7,sp@-
|
||||||
|
.chip 68000
|
||||||
|
SDL_MintAudio_Xbios_nofpu1:
|
||||||
|
|
||||||
/* Callback */
|
/* Callback */
|
||||||
jsr _SDL_MintAudio_Callback
|
jsr _SDL_MintAudio_Callback
|
||||||
|
|
||||||
|
/* Restore FPU if needed */
|
||||||
|
tstw _SDL_MintAudio_hasfpu
|
||||||
|
beqs SDL_MintAudio_Xbios_nofpu2
|
||||||
|
.chip 68060
|
||||||
|
fmovemx sp@+,fp0-fp7
|
||||||
|
fmoveml sp@+,fpcr/fpsr/fpiar
|
||||||
|
frestore sp@+
|
||||||
|
.chip 68000
|
||||||
|
SDL_MintAudio_Xbios_nofpu2:
|
||||||
|
|
||||||
/* Reserve space for registers */
|
/* Reserve space for registers */
|
||||||
subl #savamt,savptr
|
subl #savamt,savptr
|
||||||
|
|
||||||
|
@ -131,17 +152,37 @@ _SDL_MintAudio_Dma8Interrupt:
|
||||||
|
|
||||||
/* Check if we are not already running */
|
/* Check if we are not already running */
|
||||||
tstw _SDL_MintAudio_mutex
|
tstw _SDL_MintAudio_mutex
|
||||||
bnes SDL_MintAudio_Dma8End
|
bne SDL_MintAudio_Dma8End
|
||||||
notw _SDL_MintAudio_mutex
|
notw _SDL_MintAudio_mutex
|
||||||
|
|
||||||
/* Swap buffers */
|
/* Swap buffers */
|
||||||
eorw #1,_SDL_MintAudio_numbuf
|
eorw #1,_SDL_MintAudio_numbuf
|
||||||
|
|
||||||
moveml d0-d7/a0-a6,sp@-
|
moveml d0-d1/a0-a1,sp@-
|
||||||
|
|
||||||
|
/* Save FPU if needed */
|
||||||
|
tstw _SDL_MintAudio_hasfpu
|
||||||
|
beqs SDL_MintAudio_Dma8_nofpu1
|
||||||
|
.chip 68060
|
||||||
|
fsave sp@-
|
||||||
|
fmoveml fpcr/fpsr/fpiar,sp@-
|
||||||
|
fmovemx fp0-fp7,sp@-
|
||||||
|
.chip 68000
|
||||||
|
SDL_MintAudio_Dma8_nofpu1:
|
||||||
|
|
||||||
/* Callback */
|
/* Callback */
|
||||||
jsr _SDL_MintAudio_Callback
|
jsr _SDL_MintAudio_Callback
|
||||||
|
|
||||||
|
/* Restore FPU if needed */
|
||||||
|
tstw _SDL_MintAudio_hasfpu
|
||||||
|
beqs SDL_MintAudio_Dma8_nofpu2
|
||||||
|
.chip 68060
|
||||||
|
fmovemx sp@+,fp0-fp7
|
||||||
|
fmoveml sp@+,fpcr/fpsr/fpiar
|
||||||
|
frestore sp@+
|
||||||
|
.chip 68000
|
||||||
|
SDL_MintAudio_Dma8_nofpu2:
|
||||||
|
|
||||||
/* Set new buffer */
|
/* Set new buffer */
|
||||||
|
|
||||||
moveq #0,d0
|
moveq #0,d0
|
||||||
|
@ -169,7 +210,7 @@ _SDL_MintAudio_Dma8Interrupt:
|
||||||
rorl #8,d1
|
rorl #8,d1
|
||||||
moveb d1,a0@(0x0f)
|
moveb d1,a0@(0x0f)
|
||||||
|
|
||||||
moveml sp@+,d0-d7/a0-a6
|
moveml sp@+,d0-d1/a0-a1
|
||||||
|
|
||||||
clrw _SDL_MintAudio_mutex
|
clrw _SDL_MintAudio_mutex
|
||||||
SDL_MintAudio_Dma8End:
|
SDL_MintAudio_Dma8End:
|
||||||
|
@ -195,9 +236,29 @@ _SDL_MintAudio_StfaInterrupt:
|
||||||
|
|
||||||
moveml d0-d7/a0-a6,sp@-
|
moveml d0-d7/a0-a6,sp@-
|
||||||
|
|
||||||
|
/* Save FPU if needed */
|
||||||
|
tstw _SDL_MintAudio_hasfpu
|
||||||
|
beqs SDL_MintAudio_Stfa_nofpu1
|
||||||
|
.chip 68060
|
||||||
|
fsave sp@-
|
||||||
|
fmoveml fpcr/fpsr/fpiar,sp@-
|
||||||
|
fmovemx fp0-fp7,sp@-
|
||||||
|
.chip 68000
|
||||||
|
SDL_MintAudio_Stfa_nofpu1:
|
||||||
|
|
||||||
/* Callback */
|
/* Callback */
|
||||||
jsr _SDL_MintAudio_Callback
|
jsr _SDL_MintAudio_Callback
|
||||||
|
|
||||||
|
/* Restore FPU if needed */
|
||||||
|
tstw _SDL_MintAudio_hasfpu
|
||||||
|
beqs SDL_MintAudio_Stfa_nofpu2
|
||||||
|
.chip 68060
|
||||||
|
fmovemx sp@+,fp0-fp7
|
||||||
|
fmoveml sp@+,fpcr/fpsr/fpiar
|
||||||
|
frestore sp@+
|
||||||
|
.chip 68000
|
||||||
|
SDL_MintAudio_Stfa_nofpu2:
|
||||||
|
|
||||||
/* Set new buffer */
|
/* Set new buffer */
|
||||||
|
|
||||||
moveq #0,d0
|
moveq #0,d0
|
||||||
|
|
|
@ -224,6 +224,10 @@ static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
||||||
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
||||||
|
|
||||||
|
if (spec->channels > 2) {
|
||||||
|
spec->channels = 2; /* no more than stereo! */
|
||||||
|
}
|
||||||
|
|
||||||
/* Check formats available */
|
/* Check formats available */
|
||||||
MINTAUDIO_freqcount=0;
|
MINTAUDIO_freqcount=0;
|
||||||
switch(cookie_mcsn->play) {
|
switch(cookie_mcsn->play) {
|
||||||
|
@ -391,6 +395,8 @@ static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
||||||
|
|
||||||
|
SDL_MintAudio_CheckFpu();
|
||||||
|
|
||||||
/* Setup audio hardware */
|
/* Setup audio hardware */
|
||||||
Mint_InitAudio(this, spec);
|
Mint_InitAudio(this, spec);
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,10 @@ static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
||||||
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
||||||
|
|
||||||
|
if (spec->channels > 2) {
|
||||||
|
spec->channels = 2; /* no more than stereo! */
|
||||||
|
}
|
||||||
|
|
||||||
/* Check formats available */
|
/* Check formats available */
|
||||||
MINTAUDIO_freqcount=0;
|
MINTAUDIO_freqcount=0;
|
||||||
for (i=0;i<16;i++) {
|
for (i=0;i<16;i++) {
|
||||||
|
@ -310,6 +314,8 @@ static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
||||||
|
|
||||||
|
SDL_MintAudio_CheckFpu();
|
||||||
|
|
||||||
/* Setup audio hardware */
|
/* Setup audio hardware */
|
||||||
Mint_InitAudio(this, spec);
|
Mint_InitAudio(this, spec);
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,8 @@ static int Audio_Available(void)
|
||||||
unsigned long dummy;
|
unsigned long dummy;
|
||||||
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
|
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
|
||||||
|
|
||||||
SDL_MintAudio_mint_present = (Getcookie(C_MiNT, &dummy) == C_FOUND);
|
/*SDL_MintAudio_mint_present = (Getcookie(C_MiNT, &dummy) == C_FOUND);*/
|
||||||
|
SDL_MintAudio_mint_present = SDL_FALSE;
|
||||||
|
|
||||||
/* We can't use XBIOS in interrupt with Magic, don't know about thread */
|
/* We can't use XBIOS in interrupt with Magic, don't know about thread */
|
||||||
if (Getcookie(C_MagX, &dummy) == C_FOUND) {
|
if (Getcookie(C_MagX, &dummy) == C_FOUND) {
|
||||||
|
@ -341,6 +342,10 @@ static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
DEBUG_PRINT(("channels=%d, ", spec->channels));
|
||||||
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
DEBUG_PRINT(("freq=%d\n", spec->freq));
|
||||||
|
|
||||||
|
if (spec->channels > 2) {
|
||||||
|
spec->channels = 2; /* no more than stereo! */
|
||||||
|
}
|
||||||
|
|
||||||
spec->format |= 0x8000; /* Audio is always signed */
|
spec->format |= 0x8000; /* Audio is always signed */
|
||||||
if ((spec->format & 0x00ff)==16) {
|
if ((spec->format & 0x00ff)==16) {
|
||||||
spec->format |= 0x1000; /* Audio is always big endian */
|
spec->format |= 0x1000; /* Audio is always big endian */
|
||||||
|
@ -433,7 +438,8 @@ static void Mint_InitAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
} else {
|
} else {
|
||||||
/* Install interrupt */
|
/* Install interrupt */
|
||||||
Jdisint(MFP_DMASOUND);
|
Jdisint(MFP_DMASOUND);
|
||||||
Xbtimer(XB_TIMERA, 8, 1, SDL_MintAudio_XbiosInterrupt);
|
/*Xbtimer(XB_TIMERA, 8, 1, SDL_MintAudio_XbiosInterrupt);*/
|
||||||
|
Xbtimer(XB_TIMERA, 8, 1, SDL_MintAudio_Dma8Interrupt);
|
||||||
Jenabint(MFP_DMASOUND);
|
Jenabint(MFP_DMASOUND);
|
||||||
|
|
||||||
if (Setinterrupt(SI_TIMERA, SI_PLAY)<0) {
|
if (Setinterrupt(SI_TIMERA, SI_PLAY)<0) {
|
||||||
|
@ -480,6 +486,8 @@ static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0]));
|
||||||
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1]));
|
||||||
|
|
||||||
|
SDL_MintAudio_CheckFpu();
|
||||||
|
|
||||||
/* Setup audio hardware */
|
/* Setup audio hardware */
|
||||||
Mint_InitAudio(this, spec);
|
Mint_InitAudio(this, spec);
|
||||||
|
|
||||||
|
|
335
src/audio/nds/SDL_ndsaudio.c
Normal file
335
src/audio/nds/SDL_ndsaudio.c
Normal file
|
@ -0,0 +1,335 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2006 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* Allow access to a raw mixing buffer */
|
||||||
|
#include <nds.h>
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "SDL_endian.h"
|
||||||
|
#include "SDL_timer.h"
|
||||||
|
#include "SDL_audio.h"
|
||||||
|
#include "../SDL_audiomem.h"
|
||||||
|
#include "../SDL_audio_c.h"
|
||||||
|
#include "SDL_ndsaudio.h"
|
||||||
|
#include "soundcommon.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Audio driver functions */
|
||||||
|
static int NDS_OpenAudio(_THIS, SDL_AudioSpec *spec);
|
||||||
|
static void NDS_WaitAudio(_THIS);
|
||||||
|
static void NDS_PlayAudio(_THIS);
|
||||||
|
static Uint8 *NDS_GetAudioBuf(_THIS);
|
||||||
|
static void NDS_CloseAudio(_THIS);
|
||||||
|
|
||||||
|
/* Audio driver bootstrap functions */
|
||||||
|
|
||||||
|
u32 framecounter = 0,soundoffset = 0;
|
||||||
|
static SDL_AudioDevice *sdl_nds_audiodevice;
|
||||||
|
|
||||||
|
//void SoundMixCallback(void *stream,u32 size)
|
||||||
|
//{
|
||||||
|
// //printf("SoundMixCallback\n");
|
||||||
|
//
|
||||||
|
// Uint8 *buffer;
|
||||||
|
//
|
||||||
|
// buffer = sdl_nds_audiodevice->hidden->mixbuf;
|
||||||
|
// memset(buffer, sdl_nds_audiodevice->spec.silence, size);
|
||||||
|
//
|
||||||
|
// if (!sdl_nds_audiodevice->paused){
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// //if (sdl_nds_audiodevice->convert.needed) {
|
||||||
|
// // int silence;
|
||||||
|
//
|
||||||
|
// // if (sdl_nds_audiodevice->convert.src_format == AUDIO_U8 ) {
|
||||||
|
// // silence = 0x80;
|
||||||
|
// // } else {
|
||||||
|
// // silence = 0;
|
||||||
|
// // }
|
||||||
|
// // memset(sdl_nds_audiodevice->convert.buf, silence, sdl_nds_audiodevice->convert.len);
|
||||||
|
// // sdl_nds_audiodevice->spec.callback(sdl_nds_audiodevice->spec.userdata,
|
||||||
|
// // (Uint8 *)sdl_nds_audiodevice->convert.buf,sdl_nds_audiodevice->convert.len);
|
||||||
|
// // SDL_ConvertAudio(&sdl_nds_audiodevice->convert);
|
||||||
|
// // memcpy(buffer, sdl_nds_audiodevice->convert.buf, sdl_nds_audiodevice->convert.len_cvt);
|
||||||
|
// //} else
|
||||||
|
// {
|
||||||
|
// sdl_nds_audiodevice->spec.callback(sdl_nds_audiodevice->spec.userdata, buffer, size);
|
||||||
|
// //memcpy((Sint16 *)stream,buffer, size);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if(soundsystem->format == 8)
|
||||||
|
// {
|
||||||
|
// int i;
|
||||||
|
// s32 *buffer32 = (s32 *)buffer;
|
||||||
|
// s32 *stream32 = (s32 *)stream;
|
||||||
|
// for(i=0;i<size/4;i++){ *stream32++ = buffer32[i] ^ 0x80808080;}
|
||||||
|
// //for(i = 0; i < size; i++)
|
||||||
|
// // ((s8*)stream)[i]=(buffer[i]^0x80);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// int i;
|
||||||
|
// for(i = 0; i < size; i++){
|
||||||
|
// //((short*)stream)[i] =(short)buffer[i] << 8; // sound 8bit ---> buffer 16bit
|
||||||
|
// //if (buffer[i] &0x80)
|
||||||
|
// //((Sint16*)stream)[i] = 0xff00 | buffer[i];
|
||||||
|
// ((Sint16*)stream)[i] = (buffer[i] - 128) << 8;
|
||||||
|
//
|
||||||
|
// //else
|
||||||
|
// // ((Sint16*)stream)[i] = buffer[i];
|
||||||
|
// }
|
||||||
|
// //register signed char *pSrc =buffer;
|
||||||
|
// //register short *pDest =stream;
|
||||||
|
// //int x;
|
||||||
|
// // for (x=size; x>0; x--)
|
||||||
|
// // {
|
||||||
|
// // register short temp = (((short)*pSrc)-128)<<8;
|
||||||
|
// // pSrc++;
|
||||||
|
// // *pDest++ = temp;
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// //memcpy((Sint16 *)stream,buffer, size);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
void SoundMixCallback(void *stream,u32 len)
|
||||||
|
{
|
||||||
|
SDL_AudioDevice *audio = (SDL_AudioDevice *)sdl_nds_audiodevice;
|
||||||
|
|
||||||
|
/* Silence the buffer, since it's ours */
|
||||||
|
SDL_memset(stream, audio->spec.silence, len);
|
||||||
|
|
||||||
|
/* Only do soemthing if audio is enabled */
|
||||||
|
if ( ! audio->enabled )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( ! audio->paused ) {
|
||||||
|
if ( audio->convert.needed ) {
|
||||||
|
//fprintf(stderr,"converting audio\n");
|
||||||
|
SDL_mutexP(audio->mixer_lock);
|
||||||
|
(*audio->spec.callback)(audio->spec.userdata,
|
||||||
|
(Uint8 *)audio->convert.buf,audio->convert.len);
|
||||||
|
SDL_mutexV(audio->mixer_lock);
|
||||||
|
SDL_ConvertAudio(&audio->convert);
|
||||||
|
SDL_memcpy(stream,audio->convert.buf,audio->convert.len_cvt);
|
||||||
|
} else {
|
||||||
|
SDL_mutexP(audio->mixer_lock);
|
||||||
|
(*audio->spec.callback)(audio->spec.userdata,
|
||||||
|
(Uint8 *)stream, len);
|
||||||
|
SDL_mutexV(audio->mixer_lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void MixSound(void)
|
||||||
|
{
|
||||||
|
int remain;
|
||||||
|
|
||||||
|
if(soundsystem->format == 8)
|
||||||
|
{
|
||||||
|
if((soundsystem->soundcursor + soundsystem->numsamples) > soundsystem->buffersize)
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor],soundsystem->buffersize - soundsystem->soundcursor);
|
||||||
|
remain = soundsystem->numsamples - (soundsystem->buffersize - soundsystem->soundcursor);
|
||||||
|
SoundMixCallback(soundsystem->mixbuffer,remain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor],soundsystem->numsamples);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((soundsystem->soundcursor + soundsystem->numsamples) > (soundsystem->buffersize >> 1))
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor << 1],(soundsystem->buffersize >> 1) - soundsystem->soundcursor);
|
||||||
|
remain = soundsystem->numsamples - ((soundsystem->buffersize >> 1) - soundsystem->soundcursor);
|
||||||
|
SoundMixCallback(soundsystem->mixbuffer,remain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor << 1],soundsystem->numsamples);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterruptHandler(void)
|
||||||
|
{
|
||||||
|
framecounter++;
|
||||||
|
}
|
||||||
|
void FiFoHandler(void)
|
||||||
|
{
|
||||||
|
u32 command;
|
||||||
|
while ( !(REG_IPC_FIFO_CR & (IPC_FIFO_RECV_EMPTY)) )
|
||||||
|
{
|
||||||
|
command = REG_IPC_FIFO_RX;
|
||||||
|
|
||||||
|
switch(command)
|
||||||
|
{
|
||||||
|
case FIFO_NONE:
|
||||||
|
break;
|
||||||
|
case UPDATEON_ARM9:
|
||||||
|
REG_IME = 0;
|
||||||
|
MixSound();
|
||||||
|
REG_IME = 1;
|
||||||
|
SendCommandToArm7(MIXCOMPLETE_ONARM9);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int Audio_Available(void)
|
||||||
|
{
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Audio_DeleteDevice(SDL_AudioDevice *device)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_AudioDevice *Audio_CreateDevice(int devindex)
|
||||||
|
{
|
||||||
|
|
||||||
|
SDL_AudioDevice *this;
|
||||||
|
|
||||||
|
/* Initialize all variables that we clean on shutdown */
|
||||||
|
this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice));
|
||||||
|
if ( this ) {
|
||||||
|
SDL_memset(this, 0, (sizeof *this));
|
||||||
|
this->hidden = (struct SDL_PrivateAudioData *)
|
||||||
|
SDL_malloc((sizeof *this->hidden));
|
||||||
|
}
|
||||||
|
if ( (this == NULL) || (this->hidden == NULL) ) {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
if ( this ) {
|
||||||
|
SDL_free(this);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
|
||||||
|
|
||||||
|
/* Set the function pointers */
|
||||||
|
this->OpenAudio = NDS_OpenAudio;
|
||||||
|
this->WaitAudio = NDS_WaitAudio;
|
||||||
|
this->PlayAudio = NDS_PlayAudio;
|
||||||
|
this->GetAudioBuf = NDS_GetAudioBuf;
|
||||||
|
this->CloseAudio = NDS_CloseAudio;
|
||||||
|
|
||||||
|
this->free = Audio_DeleteDevice;
|
||||||
|
//fprintf(stderr,"Audio_CreateDevice\n");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioBootStrap NDSAUD_bootstrap = {
|
||||||
|
"nds", "NDS audio",
|
||||||
|
Audio_Available, Audio_CreateDevice
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void static NDS_WaitAudio(_THIS)
|
||||||
|
{
|
||||||
|
//printf("NDS_WaitAudio\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_PlayAudio(_THIS)
|
||||||
|
{
|
||||||
|
//printf("playing audio\n");
|
||||||
|
if (this->paused)
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static Uint8 *NDS_GetAudioBuf(_THIS)
|
||||||
|
{
|
||||||
|
return NULL;//(this->hidden->mixbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_CloseAudio(_THIS)
|
||||||
|
{
|
||||||
|
/* if ( this->hidden->mixbuf != NULL ) {
|
||||||
|
SDL_FreeAudioMem(this->hidden->mixbuf);
|
||||||
|
this->hidden->mixbuf = NULL;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
static int NDS_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
|
{
|
||||||
|
//printf("NDS_OpenAudio\n");
|
||||||
|
int format = 0;
|
||||||
|
//switch(spec->format&0xff) {
|
||||||
|
//case 8: spec->format = AUDIO_S8;format=8; break;
|
||||||
|
//case 16: spec->format = AUDIO_S16LSB;format=16; break;
|
||||||
|
//default:
|
||||||
|
// SDL_SetError("Unsupported audio format");
|
||||||
|
// return(-1);
|
||||||
|
//}
|
||||||
|
switch (spec->format&~0x1000) {
|
||||||
|
case AUDIO_S8:
|
||||||
|
/* Signed 8-bit audio supported */
|
||||||
|
format=8;
|
||||||
|
break;
|
||||||
|
case AUDIO_U8:
|
||||||
|
spec->format ^= 0x80;format=8;
|
||||||
|
break;
|
||||||
|
case AUDIO_U16:
|
||||||
|
/* Unsigned 16-bit audio unsupported, convert to S16 */
|
||||||
|
spec->format ^=0x8000;format=16;
|
||||||
|
case AUDIO_S16:
|
||||||
|
/* Signed 16-bit audio supported */
|
||||||
|
format=16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Update the fragment size as size in bytes */
|
||||||
|
SDL_CalculateAudioSpec(spec);
|
||||||
|
|
||||||
|
/* Allocate mixing buffer */
|
||||||
|
//this->hidden->mixlen = spec->size;
|
||||||
|
//this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
|
||||||
|
//if ( this->hidden->mixbuf == NULL ) {
|
||||||
|
// SDL_SetError("Out of Memory");
|
||||||
|
// return(-1);
|
||||||
|
//}
|
||||||
|
|
||||||
|
SDL_NDSAudio_mutex = 0;
|
||||||
|
sdl_nds_audiodevice=this;
|
||||||
|
|
||||||
|
irqInit();
|
||||||
|
irqSet(IRQ_VBLANK,&InterruptHandler);
|
||||||
|
irqSet(IRQ_FIFO_NOT_EMPTY,&FiFoHandler);
|
||||||
|
irqEnable(IRQ_FIFO_NOT_EMPTY);
|
||||||
|
|
||||||
|
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR | IPC_FIFO_RECV_IRQ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SoundSystemInit(spec->freq,spec->size,0,format);
|
||||||
|
SoundStartMixer();
|
||||||
|
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
|
@ -21,12 +21,20 @@
|
||||||
*/
|
*/
|
||||||
#include "SDL_config.h"
|
#include "SDL_config.h"
|
||||||
|
|
||||||
#include "SDL_cgxvideo.h"
|
#ifndef _SDL_lowaudio_h
|
||||||
|
#define _SDL_lowaudio_h
|
||||||
|
|
||||||
/* Functions to be exported */
|
#include "../SDL_sysaudio.h"
|
||||||
extern void amiga_FreeWMCursor(_THIS, WMcursor *cursor);
|
|
||||||
extern WMcursor *amiga_CreateWMCursor(_THIS,
|
/* Hidden "this" pointer for the audio functions */
|
||||||
Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
|
#define _THIS SDL_AudioDevice *this
|
||||||
extern int amiga_ShowWMCursor(_THIS, WMcursor *cursor);
|
|
||||||
extern void amiga_WarpWMCursor(_THIS, Uint16 x, Uint16 y);
|
struct SDL_PrivateAudioData {
|
||||||
extern void amiga_CheckMouseMode(_THIS);
|
/* The file descriptor for the audio device */
|
||||||
|
//Uint8 *mixbuf;
|
||||||
|
//Uint32 mixlen;
|
||||||
|
};
|
||||||
|
unsigned short SDL_NDSAudio_mutex=0;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _SDL_lowaudio_h */
|
|
@ -20,42 +20,42 @@
|
||||||
slouken@libsdl.org
|
slouken@libsdl.org
|
||||||
*/
|
*/
|
||||||
#include "SDL_config.h"
|
#include "SDL_config.h"
|
||||||
|
#include "SDL_stdinc.h"
|
||||||
|
|
||||||
#include <exec/exec.h>
|
#include "soundcommon.h"
|
||||||
#include <dos/dos.h>
|
|
||||||
#include <dos/dostags.h>
|
|
||||||
#if defined (__SASC) || defined(STORMC4_WOS)
|
|
||||||
#include <proto/dos.h>
|
|
||||||
#include <proto/exec.h>
|
|
||||||
#else
|
|
||||||
#include <inline/dos.h>
|
|
||||||
#include <inline/exec.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mydebug.h"
|
void SoundSystemInit(u32 rate,u32 buffersize,u8 channel,u8 format)
|
||||||
|
{
|
||||||
|
soundsystem->rate = rate;
|
||||||
|
|
||||||
extern struct ExecBase *SysBase;
|
if(format == 8)
|
||||||
extern struct DosLibrary *DOSBase;
|
soundsystem->buffersize = buffersize;
|
||||||
|
else if(format == 16)
|
||||||
|
soundsystem->buffersize = buffersize * sizeof(short);
|
||||||
|
|
||||||
#ifdef STORMC4_WOS
|
soundsystem->mixbuffer = (s8*)SDL_malloc(soundsystem->buffersize);
|
||||||
#include <proto/powerpc.h>
|
//soundsystem->soundbuffer = soundsystem->mixbuffer;
|
||||||
|
soundsystem->format = format;
|
||||||
|
soundsystem->channel = channel;
|
||||||
|
soundsystem->prevtimer = 0;
|
||||||
|
soundsystem->soundcursor = 0;
|
||||||
|
soundsystem->numsamples = 0;
|
||||||
|
soundsystem->period = 0x1000000 / rate;
|
||||||
|
soundsystem->cmd = INIT;
|
||||||
|
}
|
||||||
|
|
||||||
/* use powerpc.library functions instead og exec */
|
void SoundStartMixer(void)
|
||||||
#define SYS_ThreadHandle struct TaskPPC *
|
{
|
||||||
#define Signal SignalPPC
|
soundsystem->cmd |= MIX;
|
||||||
#define Wait WaitPPC
|
}
|
||||||
#define Task TaskPPC
|
|
||||||
#define FindTask FindTaskPPC
|
|
||||||
#define SetSignal SetSignalPPC
|
|
||||||
|
|
||||||
#define InitSemaphore InitSemaphorePPC
|
void SendCommandToArm7(u32 command)
|
||||||
#define ObtainSemaphore ObtainSemaphorePPC
|
{
|
||||||
#define AttemptSemaphore AttemptSemaphorePPC
|
while (REG_IPC_FIFO_CR & IPC_FIFO_SEND_FULL);
|
||||||
#define ReleaseSemaphore ReleaseSemaphorePPC
|
if (REG_IPC_FIFO_CR & IPC_FIFO_ERROR)
|
||||||
#define SignalSemaphore SignalSemaphorePPC
|
{
|
||||||
|
REG_IPC_FIFO_CR |= IPC_FIFO_SEND_CLEAR;
|
||||||
#else
|
}
|
||||||
|
|
||||||
#define SYS_ThreadHandle struct Task *
|
|
||||||
#endif /*STORMC4_WOS*/
|
|
||||||
|
|
||||||
|
REG_IPC_FIFO_TX = command;
|
||||||
|
}
|
80
src/audio/nds/soundcommon.h
Normal file
80
src/audio/nds/soundcommon.h
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2006 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
#ifndef __SOUNDCOMMON_H
|
||||||
|
#define __SOUNDCOMMON_H
|
||||||
|
|
||||||
|
#include <nds.h>
|
||||||
|
|
||||||
|
#define CLOCK (1 << 25)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
NONE = 0,
|
||||||
|
INIT = 1,
|
||||||
|
MIX = 2,
|
||||||
|
MIXING = 4,
|
||||||
|
STOP = 8
|
||||||
|
}CommandType;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
FIFO_NONE = 0,
|
||||||
|
UPDATEON_ARM9 = 1,
|
||||||
|
MIXCOMPLETE_ONARM9 = 2,
|
||||||
|
}FifoType;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
s8 *mixbuffer;//,*soundbuffer;
|
||||||
|
u32 rate;
|
||||||
|
u32 buffersize;
|
||||||
|
u32 cmd;
|
||||||
|
u8 channel,format;
|
||||||
|
u32 soundcursor,numsamples;
|
||||||
|
s32 prevtimer;
|
||||||
|
s16 period;
|
||||||
|
}S_SoundSystem;
|
||||||
|
|
||||||
|
#define soundsystem ((S_SoundSystem*)((u32)(IPC)+sizeof(TransferRegion)))
|
||||||
|
|
||||||
|
#ifdef ARM9
|
||||||
|
extern void SoundSystemInit(u32 rate,u32 buffersize,u8 channel,u8 format);
|
||||||
|
extern void SoundStartMixer(void);
|
||||||
|
extern void SendCommandToArm7(u32 command);
|
||||||
|
#else
|
||||||
|
extern void SoundVBlankIrq(void);
|
||||||
|
extern void SoundSwapAndMix(void);
|
||||||
|
extern void SoundSetTimer(int period);
|
||||||
|
extern void SoundFifoHandler(void);
|
||||||
|
extern void SendCommandToArm9(u32 command);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
377
src/audio/pulse/SDL_pulseaudio.c
Normal file
377
src/audio/pulse/SDL_pulseaudio.c
Normal file
|
@ -0,0 +1,377 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2007 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Stéphan Kochen
|
||||||
|
stephan@kochen.nl
|
||||||
|
|
||||||
|
Based on parts of the ALSA and ESounD output drivers.
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* Allow access to an PulseAudio network stream mixing buffer */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pulse/simple.h>
|
||||||
|
|
||||||
|
#include "SDL_timer.h"
|
||||||
|
#include "SDL_audio.h"
|
||||||
|
#include "../SDL_audiomem.h"
|
||||||
|
#include "../SDL_audio_c.h"
|
||||||
|
#include "../SDL_audiodev_c.h"
|
||||||
|
#include "SDL_pulseaudio.h"
|
||||||
|
|
||||||
|
#ifdef SDL_AUDIO_DRIVER_PULSE_DYNAMIC
|
||||||
|
#include "SDL_name.h"
|
||||||
|
#include "SDL_loadso.h"
|
||||||
|
#else
|
||||||
|
#define SDL_NAME(X) X
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The tag name used by the driver */
|
||||||
|
#define PULSE_DRIVER_NAME "pulse"
|
||||||
|
|
||||||
|
/* Audio driver functions */
|
||||||
|
static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec);
|
||||||
|
static void PULSE_WaitAudio(_THIS);
|
||||||
|
static void PULSE_PlayAudio(_THIS);
|
||||||
|
static Uint8 *PULSE_GetAudioBuf(_THIS);
|
||||||
|
static void PULSE_CloseAudio(_THIS);
|
||||||
|
|
||||||
|
#ifdef SDL_AUDIO_DRIVER_PULSE_DYNAMIC
|
||||||
|
|
||||||
|
static const char *pulse_library = SDL_AUDIO_DRIVER_PULSE_DYNAMIC;
|
||||||
|
static void *pulse_handle = NULL;
|
||||||
|
static int pulse_loaded = 0;
|
||||||
|
|
||||||
|
static pa_simple* (*SDL_NAME(pa_simple_new))(
|
||||||
|
const char *server,
|
||||||
|
const char *name,
|
||||||
|
pa_stream_direction_t dir,
|
||||||
|
const char *dev,
|
||||||
|
const char *stream_name,
|
||||||
|
const pa_sample_spec *ss,
|
||||||
|
const pa_channel_map *map,
|
||||||
|
const pa_buffer_attr *attr,
|
||||||
|
int *error
|
||||||
|
);
|
||||||
|
static void (*SDL_NAME(pa_simple_free))(pa_simple *s);
|
||||||
|
static int (*SDL_NAME(pa_simple_drain))(pa_simple *s, int *error);
|
||||||
|
static int (*SDL_NAME(pa_simple_write))(
|
||||||
|
pa_simple *s,
|
||||||
|
const void *data,
|
||||||
|
size_t length,
|
||||||
|
int *error
|
||||||
|
);
|
||||||
|
static pa_channel_map* (*SDL_NAME(pa_channel_map_init_auto))(
|
||||||
|
pa_channel_map *m,
|
||||||
|
unsigned channels,
|
||||||
|
pa_channel_map_def_t def
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
const char *name;
|
||||||
|
void **func;
|
||||||
|
} pulse_functions[] = {
|
||||||
|
{ "pa_simple_new",
|
||||||
|
(void **)&SDL_NAME(pa_simple_new) },
|
||||||
|
{ "pa_simple_free",
|
||||||
|
(void **)&SDL_NAME(pa_simple_free) },
|
||||||
|
{ "pa_simple_drain",
|
||||||
|
(void **)&SDL_NAME(pa_simple_drain) },
|
||||||
|
{ "pa_simple_write",
|
||||||
|
(void **)&SDL_NAME(pa_simple_write) },
|
||||||
|
{ "pa_channel_map_init_auto",
|
||||||
|
(void **)&SDL_NAME(pa_channel_map_init_auto) },
|
||||||
|
};
|
||||||
|
|
||||||
|
static void UnloadPulseLibrary()
|
||||||
|
{
|
||||||
|
if ( pulse_loaded ) {
|
||||||
|
SDL_UnloadObject(pulse_handle);
|
||||||
|
pulse_handle = NULL;
|
||||||
|
pulse_loaded = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int LoadPulseLibrary(void)
|
||||||
|
{
|
||||||
|
int i, retval = -1;
|
||||||
|
|
||||||
|
pulse_handle = SDL_LoadObject(pulse_library);
|
||||||
|
if ( pulse_handle ) {
|
||||||
|
pulse_loaded = 1;
|
||||||
|
retval = 0;
|
||||||
|
for ( i=0; i<SDL_arraysize(pulse_functions); ++i ) {
|
||||||
|
*pulse_functions[i].func = SDL_LoadFunction(pulse_handle, pulse_functions[i].name);
|
||||||
|
if ( !*pulse_functions[i].func ) {
|
||||||
|
retval = -1;
|
||||||
|
UnloadPulseLibrary();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static void UnloadPulseLibrary()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int LoadPulseLibrary(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SDL_AUDIO_DRIVER_PULSE_DYNAMIC */
|
||||||
|
|
||||||
|
/* Audio driver bootstrap functions */
|
||||||
|
|
||||||
|
static int Audio_Available(void)
|
||||||
|
{
|
||||||
|
pa_sample_spec paspec;
|
||||||
|
pa_simple *connection;
|
||||||
|
int available;
|
||||||
|
|
||||||
|
available = 0;
|
||||||
|
if ( LoadPulseLibrary() < 0 ) {
|
||||||
|
return available;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Connect with a dummy format. */
|
||||||
|
paspec.format = PA_SAMPLE_U8;
|
||||||
|
paspec.rate = 11025;
|
||||||
|
paspec.channels = 1;
|
||||||
|
connection = SDL_NAME(pa_simple_new)(
|
||||||
|
SDL_getenv("PASERVER"), /* server */
|
||||||
|
"Test stream", /* application name */
|
||||||
|
PA_STREAM_PLAYBACK, /* playback mode */
|
||||||
|
SDL_getenv("PADEVICE"), /* device on the server */
|
||||||
|
"Simple DirectMedia Layer", /* stream description */
|
||||||
|
&paspec, /* sample format spec */
|
||||||
|
NULL, /* channel map */
|
||||||
|
NULL, /* buffering attributes */
|
||||||
|
NULL /* error code */
|
||||||
|
);
|
||||||
|
if ( connection != NULL ) {
|
||||||
|
available = 1;
|
||||||
|
SDL_NAME(pa_simple_free)(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
UnloadPulseLibrary();
|
||||||
|
return(available);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Audio_DeleteDevice(SDL_AudioDevice *device)
|
||||||
|
{
|
||||||
|
SDL_free(device->hidden);
|
||||||
|
SDL_free(device);
|
||||||
|
UnloadPulseLibrary();
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_AudioDevice *Audio_CreateDevice(int devindex)
|
||||||
|
{
|
||||||
|
SDL_AudioDevice *this;
|
||||||
|
|
||||||
|
/* Initialize all variables that we clean on shutdown */
|
||||||
|
LoadPulseLibrary();
|
||||||
|
this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice));
|
||||||
|
if ( this ) {
|
||||||
|
SDL_memset(this, 0, (sizeof *this));
|
||||||
|
this->hidden = (struct SDL_PrivateAudioData *)
|
||||||
|
SDL_malloc((sizeof *this->hidden));
|
||||||
|
}
|
||||||
|
if ( (this == NULL) || (this->hidden == NULL) ) {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
if ( this ) {
|
||||||
|
SDL_free(this);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
|
||||||
|
|
||||||
|
/* Set the function pointers */
|
||||||
|
this->OpenAudio = PULSE_OpenAudio;
|
||||||
|
this->WaitAudio = PULSE_WaitAudio;
|
||||||
|
this->PlayAudio = PULSE_PlayAudio;
|
||||||
|
this->GetAudioBuf = PULSE_GetAudioBuf;
|
||||||
|
this->CloseAudio = PULSE_CloseAudio;
|
||||||
|
|
||||||
|
this->free = Audio_DeleteDevice;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioBootStrap PULSE_bootstrap = {
|
||||||
|
PULSE_DRIVER_NAME, "PulseAudio",
|
||||||
|
Audio_Available, Audio_CreateDevice
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This function waits until it is possible to write a full sound buffer */
|
||||||
|
static void PULSE_WaitAudio(_THIS)
|
||||||
|
{
|
||||||
|
/* Check to see if the thread-parent process is still alive */
|
||||||
|
{ static int cnt = 0;
|
||||||
|
/* Note that this only works with thread implementations
|
||||||
|
that use a different process id for each thread.
|
||||||
|
*/
|
||||||
|
if (parent && (((++cnt)%10) == 0)) { /* Check every 10 loops */
|
||||||
|
if ( kill(parent, 0) < 0 ) {
|
||||||
|
this->enabled = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PULSE_PlayAudio(_THIS)
|
||||||
|
{
|
||||||
|
/* Write the audio data */
|
||||||
|
if ( SDL_NAME(pa_simple_write)(stream, mixbuf, mixlen, NULL) != 0 )
|
||||||
|
{
|
||||||
|
this->enabled = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Uint8 *PULSE_GetAudioBuf(_THIS)
|
||||||
|
{
|
||||||
|
return(mixbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PULSE_CloseAudio(_THIS)
|
||||||
|
{
|
||||||
|
if ( mixbuf != NULL ) {
|
||||||
|
SDL_FreeAudioMem(mixbuf);
|
||||||
|
mixbuf = NULL;
|
||||||
|
}
|
||||||
|
if ( stream != NULL ) {
|
||||||
|
SDL_NAME(pa_simple_drain)(stream, NULL);
|
||||||
|
SDL_NAME(pa_simple_free)(stream);
|
||||||
|
stream = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to get the name of the program */
|
||||||
|
static char *get_progname(void)
|
||||||
|
{
|
||||||
|
char *progname = NULL;
|
||||||
|
#ifdef __LINUX__
|
||||||
|
FILE *fp;
|
||||||
|
static char temp[BUFSIZ];
|
||||||
|
|
||||||
|
SDL_snprintf(temp, SDL_arraysize(temp), "/proc/%d/cmdline", getpid());
|
||||||
|
fp = fopen(temp, "r");
|
||||||
|
if ( fp != NULL ) {
|
||||||
|
if ( fgets(temp, sizeof(temp)-1, fp) ) {
|
||||||
|
progname = SDL_strrchr(temp, '/');
|
||||||
|
if ( progname == NULL ) {
|
||||||
|
progname = temp;
|
||||||
|
} else {
|
||||||
|
progname = progname+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return(progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
|
{
|
||||||
|
Uint16 test_format;
|
||||||
|
pa_sample_spec paspec;
|
||||||
|
pa_buffer_attr paattr;
|
||||||
|
pa_channel_map pacmap;
|
||||||
|
|
||||||
|
paspec.format = PA_SAMPLE_INVALID;
|
||||||
|
for ( test_format = SDL_FirstAudioFormat(spec->format); test_format; ) {
|
||||||
|
switch ( test_format ) {
|
||||||
|
case AUDIO_U8:
|
||||||
|
paspec.format = PA_SAMPLE_U8;
|
||||||
|
break;
|
||||||
|
case AUDIO_S16LSB:
|
||||||
|
paspec.format = PA_SAMPLE_S16LE;
|
||||||
|
break;
|
||||||
|
case AUDIO_S16MSB:
|
||||||
|
paspec.format = PA_SAMPLE_S16BE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( paspec.format != PA_SAMPLE_INVALID )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (paspec.format == PA_SAMPLE_INVALID ) {
|
||||||
|
SDL_SetError("Couldn't find any suitable audio formats");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
spec->format = test_format;
|
||||||
|
|
||||||
|
paspec.channels = spec->channels;
|
||||||
|
paspec.rate = spec->freq;
|
||||||
|
|
||||||
|
/* Calculate the final parameters for this audio specification */
|
||||||
|
SDL_CalculateAudioSpec(spec);
|
||||||
|
|
||||||
|
/* Allocate mixing buffer */
|
||||||
|
mixlen = spec->size;
|
||||||
|
mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen);
|
||||||
|
if ( mixbuf == NULL ) {
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
SDL_memset(mixbuf, spec->silence, spec->size);
|
||||||
|
|
||||||
|
/* Reduced prebuffering compared to the defaults. */
|
||||||
|
paattr.tlength = mixlen;
|
||||||
|
paattr.minreq = mixlen;
|
||||||
|
paattr.fragsize = mixlen;
|
||||||
|
paattr.prebuf = mixlen;
|
||||||
|
paattr.maxlength = mixlen * 4;
|
||||||
|
|
||||||
|
/* The SDL ALSA output hints us that we use Windows' channel mapping */
|
||||||
|
/* http://bugzilla.libsdl.org/show_bug.cgi?id=110 */
|
||||||
|
SDL_NAME(pa_channel_map_init_auto)(
|
||||||
|
&pacmap, spec->channels, PA_CHANNEL_MAP_WAVEEX);
|
||||||
|
|
||||||
|
/* Connect to the PulseAudio server */
|
||||||
|
stream = SDL_NAME(pa_simple_new)(
|
||||||
|
SDL_getenv("PASERVER"), /* server */
|
||||||
|
get_progname(), /* application name */
|
||||||
|
PA_STREAM_PLAYBACK, /* playback mode */
|
||||||
|
SDL_getenv("PADEVICE"), /* device on the server */
|
||||||
|
"Simple DirectMedia Layer", /* stream description */
|
||||||
|
&paspec, /* sample format spec */
|
||||||
|
&pacmap, /* channel map */
|
||||||
|
&paattr, /* buffering attributes */
|
||||||
|
NULL /* error code */
|
||||||
|
);
|
||||||
|
if ( stream == NULL ) {
|
||||||
|
PULSE_CloseAudio(this);
|
||||||
|
SDL_SetError("Could not connect to PulseAudio");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the parent process id (we're the parent of the audio thread) */
|
||||||
|
parent = getpid();
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
SDL - Simple DirectMedia Layer
|
SDL - Simple DirectMedia Layer
|
||||||
Copyright (C) 1997-2006 Sam Lantinga
|
Copyright (C) 1997-2007 Sam Lantinga
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -16,45 +16,38 @@
|
||||||
License along with this library; if not, write to the Free Software
|
License along with this library; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
Sam Lantinga
|
Stéphan Kochen
|
||||||
slouken@libsdl.org
|
stephan@kochen.nl
|
||||||
|
|
||||||
|
Based on parts of the ALSA and ESounD output drivers.
|
||||||
*/
|
*/
|
||||||
#include "SDL_config.h"
|
#include "SDL_config.h"
|
||||||
|
|
||||||
#ifndef _SDL_ahiaudio_h
|
#ifndef _SDL_pulseaudio_h
|
||||||
#define _SDL_ahiaudio_h
|
#define _SDL_pulseaudio_h
|
||||||
|
|
||||||
#include <exec/exec.h>
|
|
||||||
#include <dos/dos.h>
|
|
||||||
#ifdef __SASC
|
|
||||||
#include <proto/exec.h>
|
|
||||||
#else
|
|
||||||
#include <inline/exec.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <devices/ahi.h>
|
|
||||||
#include "mydebug.h"
|
|
||||||
|
|
||||||
#include "../SDL_sysaudio.h"
|
#include "../SDL_sysaudio.h"
|
||||||
|
|
||||||
/* Hidden "this" pointer for the audio functions */
|
/* Hidden "this" pointer for the video functions */
|
||||||
#define _THIS SDL_AudioDevice *this
|
#define _THIS SDL_AudioDevice *this
|
||||||
|
|
||||||
struct SDL_PrivateAudioData {
|
struct SDL_PrivateAudioData {
|
||||||
/* The handle for the audio device */
|
/* The audio stream handle */
|
||||||
struct AHIRequest *audio_req[2];
|
pa_simple * stream;
|
||||||
struct MsgPort *audio_port;
|
|
||||||
Sint32 freq,type,bytespersample,size;
|
/* The parent process id, to detect when application quits */
|
||||||
Uint8 *mixbuf[2]; /* The app mixing buffer */
|
pid_t parent;
|
||||||
int current_buffer;
|
|
||||||
Uint32 playing;
|
/* Raw mixing buffer */
|
||||||
|
Uint8 *mixbuf;
|
||||||
|
int mixlen;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Old variable names */
|
/* Old variable names */
|
||||||
#define audio_port (this->hidden->audio_port)
|
#define stream (this->hidden->stream)
|
||||||
#define audio_req (this->hidden->audio_req)
|
#define parent (this->hidden->parent)
|
||||||
#define mixbuf (this->hidden->mixbuf)
|
#define mixbuf (this->hidden->mixbuf)
|
||||||
#define current_buffer (this->hidden->current_buffer)
|
#define mixlen (this->hidden->mixlen)
|
||||||
#define playing (this->hidden->playing)
|
|
||||||
|
#endif /* _SDL_pulseaudio_h */
|
||||||
|
|
||||||
#endif /* _SDL_ahiaudio_h */
|
|
614
src/audio/symbian/SDL_epocaudio.cpp
Normal file
614
src/audio/symbian/SDL_epocaudio.cpp
Normal file
|
@ -0,0 +1,614 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@devolution.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
SDL_epocaudio.cpp
|
||||||
|
Epoc based SDL audio driver implementation
|
||||||
|
|
||||||
|
Markus Mertama
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef SAVE_RCSID
|
||||||
|
static char rcsid =
|
||||||
|
"@(#) $Id: SDL_epocaudio.c,v 0.0.0.0 2001/06/19 17:19:56 hercules Exp $";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "epoc_sdl.h"
|
||||||
|
|
||||||
|
#include <e32hal.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "SDL_audio.h"
|
||||||
|
#include "SDL_error.h"
|
||||||
|
#include "SDL_audiomem.h"
|
||||||
|
#include "SDL_audio_c.h"
|
||||||
|
#include "SDL_timer.h"
|
||||||
|
#include "SDL_audiodev_c.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "SDL_epocaudio.h"
|
||||||
|
|
||||||
|
#include "streamplayer.h"
|
||||||
|
|
||||||
|
|
||||||
|
//#define DEBUG_AUDIO
|
||||||
|
|
||||||
|
|
||||||
|
/* Audio driver functions */
|
||||||
|
|
||||||
|
static int EPOC_OpenAudio(SDL_AudioDevice *thisdevice, SDL_AudioSpec *spec);
|
||||||
|
static void EPOC_WaitAudio(SDL_AudioDevice *thisdevice);
|
||||||
|
static void EPOC_PlayAudio(SDL_AudioDevice *thisdevice);
|
||||||
|
static Uint8 *EPOC_GetAudioBuf(SDL_AudioDevice *thisdevice);
|
||||||
|
static void EPOC_CloseAudio(SDL_AudioDevice *thisdevice);
|
||||||
|
static void EPOC_ThreadInit(SDL_AudioDevice *thisdevice);
|
||||||
|
|
||||||
|
static int Audio_Available(void);
|
||||||
|
static SDL_AudioDevice *Audio_CreateDevice(int devindex);
|
||||||
|
static void Audio_DeleteDevice(SDL_AudioDevice *device);
|
||||||
|
|
||||||
|
|
||||||
|
//void sos_adump(SDL_AudioDevice* thisdevice, void* data, int len);
|
||||||
|
|
||||||
|
#ifdef __WINS__
|
||||||
|
#define DODUMP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DODUMP
|
||||||
|
NONSHARABLE_CLASS(TDump)
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TInt Open();
|
||||||
|
void Close();
|
||||||
|
void Dump(const TDesC8& aDes);
|
||||||
|
private:
|
||||||
|
RFile iFile;
|
||||||
|
RFs iFs;
|
||||||
|
};
|
||||||
|
|
||||||
|
TInt TDump::Open()
|
||||||
|
{
|
||||||
|
TInt err = iFs.Connect();
|
||||||
|
if(err == KErrNone)
|
||||||
|
{
|
||||||
|
#ifdef __WINS__
|
||||||
|
_LIT(target, "C:\\sdlau.raw");
|
||||||
|
#else
|
||||||
|
_LIT(target, "E:\\sdlau.raw");
|
||||||
|
#endif
|
||||||
|
err = iFile.Replace(iFs, target, EFileWrite);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
void TDump::Close()
|
||||||
|
{
|
||||||
|
iFile.Close();
|
||||||
|
iFs.Close();
|
||||||
|
}
|
||||||
|
void TDump::Dump(const TDesC8& aDes)
|
||||||
|
{
|
||||||
|
iFile.Write(aDes);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CSimpleWait) : public CTimer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Wait(TTimeIntervalMicroSeconds32 aWait);
|
||||||
|
static CSimpleWait* NewL();
|
||||||
|
private:
|
||||||
|
CSimpleWait();
|
||||||
|
void RunL();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CSimpleWait* CSimpleWait::NewL()
|
||||||
|
{
|
||||||
|
CSimpleWait* wait = new (ELeave) CSimpleWait();
|
||||||
|
CleanupStack::PushL(wait);
|
||||||
|
wait->ConstructL();
|
||||||
|
CleanupStack::Pop();
|
||||||
|
return wait;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleWait::Wait(TTimeIntervalMicroSeconds32 aWait)
|
||||||
|
{
|
||||||
|
After(aWait);
|
||||||
|
CActiveScheduler::Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
CSimpleWait::CSimpleWait() : CTimer(CActive::EPriorityStandard)
|
||||||
|
{
|
||||||
|
CActiveScheduler::Add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleWait::RunL()
|
||||||
|
{
|
||||||
|
CActiveScheduler::Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
const TInt KAudioBuffers(2);
|
||||||
|
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CEpocAudio) : public CBase, public MStreamObs, public MStreamProvider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void* NewL(TInt BufferSize, TInt aFill);
|
||||||
|
inline static CEpocAudio& Current(SDL_AudioDevice* thisdevice);
|
||||||
|
|
||||||
|
static void Free(SDL_AudioDevice* thisdevice);
|
||||||
|
|
||||||
|
void Wait();
|
||||||
|
void Play();
|
||||||
|
// void SetBuffer(const TDesC8& aBuffer);
|
||||||
|
void ThreadInitL(TAny* aDevice);
|
||||||
|
void Open(TInt iRate, TInt iChannels, TUint32 aType, TInt aBytes);
|
||||||
|
~CEpocAudio();
|
||||||
|
TUint8* Buffer();
|
||||||
|
TBool SetPause(TBool aPause);
|
||||||
|
#ifdef DODUMP
|
||||||
|
void Dump(const TDesC8& aBuf) {iDump.Dump(aBuf);}
|
||||||
|
#endif
|
||||||
|
private:
|
||||||
|
CEpocAudio(TInt aBufferSize);
|
||||||
|
void Complete(TInt aState, TInt aError);
|
||||||
|
TPtrC8 Data();
|
||||||
|
void ConstructL(TInt aFill);
|
||||||
|
private:
|
||||||
|
TInt iBufferSize;
|
||||||
|
CStreamPlayer* iPlayer;
|
||||||
|
TInt iBufferRate;
|
||||||
|
TInt iRate;
|
||||||
|
TInt iChannels;
|
||||||
|
TUint32 iType;
|
||||||
|
TInt iPosition;
|
||||||
|
TThreadId iTid;
|
||||||
|
TUint8* iAudioPtr;
|
||||||
|
TUint8* iBuffer;
|
||||||
|
// TTimeIntervalMicroSeconds iStart;
|
||||||
|
TTime iStart;
|
||||||
|
TInt iTune;
|
||||||
|
CSimpleWait* iWait;
|
||||||
|
#ifdef DODUMP
|
||||||
|
TDump iDump;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
inline CEpocAudio& CEpocAudio::Current(SDL_AudioDevice* thisdevice)
|
||||||
|
{
|
||||||
|
return *static_cast<CEpocAudio*>((void*)thisdevice->hidden);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TBool EndSc(TAny*)
|
||||||
|
{
|
||||||
|
CActiveScheduler::Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL_C void CleanScL()
|
||||||
|
{
|
||||||
|
CIdle* d = CIdle::NewLC(CActive:::EPriorityIdle);
|
||||||
|
d->Start(TCallBack(EndSc));
|
||||||
|
CActiveScheduler::Start();
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CEpocAudio::Free(SDL_AudioDevice* thisdevice)
|
||||||
|
{
|
||||||
|
CEpocAudio* ea = static_cast<CEpocAudio*>((void*)thisdevice->hidden);
|
||||||
|
if(ea)
|
||||||
|
{
|
||||||
|
ASSERT(ea->iTid == RThread().Id());
|
||||||
|
delete ea;
|
||||||
|
thisdevice->hidden = NULL;
|
||||||
|
|
||||||
|
CActiveScheduler* as = CActiveScheduler::Current();
|
||||||
|
ASSERT(as->StackDepth() == 0);
|
||||||
|
delete as;
|
||||||
|
CActiveScheduler::Install(NULL);
|
||||||
|
}
|
||||||
|
ASSERT(thisdevice->hidden == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CEpocAudio::CEpocAudio(TInt aBufferSize) : iBufferSize(aBufferSize), iPosition(-1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void* CEpocAudio::NewL(TInt aBufferSize, TInt aFill)
|
||||||
|
{
|
||||||
|
CEpocAudio* eAudioLib = new (ELeave) CEpocAudio(aBufferSize);
|
||||||
|
CleanupStack::PushL(eAudioLib);
|
||||||
|
eAudioLib->ConstructL(aFill);
|
||||||
|
CleanupStack::Pop();
|
||||||
|
return eAudioLib;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEpocAudio::ConstructL(TInt aFill)
|
||||||
|
{
|
||||||
|
iBuffer = (TUint8*) User::AllocL(KAudioBuffers * iBufferSize);
|
||||||
|
memset(iBuffer, aFill, KAudioBuffers * iBufferSize);
|
||||||
|
iAudioPtr = iBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TBool CEpocAudio::SetPause(TBool aPause)
|
||||||
|
{
|
||||||
|
if(aPause && iPosition >= 0)
|
||||||
|
{
|
||||||
|
iPosition = -1;
|
||||||
|
if(iPlayer != NULL)
|
||||||
|
iPlayer->Stop();
|
||||||
|
}
|
||||||
|
if(!aPause && iPosition < 0)
|
||||||
|
{
|
||||||
|
iPosition = 0;
|
||||||
|
if(iPlayer != NULL)
|
||||||
|
iPlayer->Start();
|
||||||
|
}
|
||||||
|
return iPosition < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEpocAudio::ThreadInitL(TAny* aDevice)
|
||||||
|
{
|
||||||
|
iTid = RThread().Id();
|
||||||
|
CActiveScheduler* as = new (ELeave) CActiveScheduler();
|
||||||
|
CActiveScheduler::Install(as);
|
||||||
|
|
||||||
|
EpocSdlEnv::AppendCleanupItem(TSdlCleanupItem((TSdlCleanupOperation)EPOC_CloseAudio, aDevice));
|
||||||
|
|
||||||
|
iWait = CSimpleWait::NewL();
|
||||||
|
|
||||||
|
iPlayer = new (ELeave) CStreamPlayer(*this, *this);
|
||||||
|
iPlayer->ConstructL();
|
||||||
|
iPlayer->OpenStream(iRate, iChannels, iType);
|
||||||
|
|
||||||
|
#ifdef DODUMP
|
||||||
|
User::LeaveIfError(iDump.Open());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TUint8* CEpocAudio::Buffer()
|
||||||
|
{
|
||||||
|
iStart.UniversalTime();
|
||||||
|
// iStart = iPlayer->Position();
|
||||||
|
return iAudioPtr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CEpocAudio::~CEpocAudio()
|
||||||
|
{
|
||||||
|
if(iWait != NULL)
|
||||||
|
iWait->Cancel();
|
||||||
|
delete iWait;
|
||||||
|
if(iPlayer != NULL)
|
||||||
|
iPlayer->Close();
|
||||||
|
delete iPlayer;
|
||||||
|
delete iBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEpocAudio::Complete(TInt aState, TInt aError)
|
||||||
|
{
|
||||||
|
if(aState == MStreamObs::EClose)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
if(iPlayer->Closed())
|
||||||
|
return;
|
||||||
|
switch(aError)
|
||||||
|
{
|
||||||
|
case KErrUnderflow:
|
||||||
|
case KErrInUse:
|
||||||
|
iPlayer->Start();
|
||||||
|
break;
|
||||||
|
case KErrAbort:
|
||||||
|
iPlayer->Open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sos_adump(SDL_AudioDevice* thisdevice, void* data, int len)
|
||||||
|
{
|
||||||
|
#ifdef DODUMP
|
||||||
|
const TPtrC8 buf((TUint8*)data, len);
|
||||||
|
CEpocAudio::Current(thisdevice).Dump(buf);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
const TInt KClip(256);
|
||||||
|
|
||||||
|
TPtrC8 CEpocAudio::Data()
|
||||||
|
{
|
||||||
|
if(iPosition < 0)
|
||||||
|
return KNullDesC8();
|
||||||
|
|
||||||
|
TPtrC8 data(iAudioPtr + iPosition, KClip);
|
||||||
|
|
||||||
|
#ifdef DODUMP
|
||||||
|
iDump.Dump(data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
iPosition += KClip;
|
||||||
|
if(iPosition >= iBufferSize)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* if(iAudioPtr == iBuffer)
|
||||||
|
iAudioPtr = iBuffer + iBufferSize;
|
||||||
|
else
|
||||||
|
iAudioPtr = iBuffer;
|
||||||
|
*/
|
||||||
|
iAudioPtr += iBufferSize;
|
||||||
|
|
||||||
|
if((iAudioPtr - iBuffer) >= KAudioBuffers * iBufferSize)
|
||||||
|
iAudioPtr = iBuffer;
|
||||||
|
|
||||||
|
iPosition = -1;
|
||||||
|
if(iWait->IsActive())
|
||||||
|
{
|
||||||
|
iWait->Cancel();
|
||||||
|
CActiveScheduler::Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void CEpocAudio::Play()
|
||||||
|
{
|
||||||
|
iPosition = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEpocAudio::Wait()
|
||||||
|
{
|
||||||
|
if(iPosition >= 0 /*&& iPlayer->Playing()*/)
|
||||||
|
{
|
||||||
|
const TInt64 bufMs = TInt64(iBufferSize - KClip) * TInt64(1000000);
|
||||||
|
const TInt64 specTime = bufMs / TInt64(iRate * iChannels * 2);
|
||||||
|
iWait->After(specTime);
|
||||||
|
|
||||||
|
CActiveScheduler::Start();
|
||||||
|
TTime end;
|
||||||
|
end.UniversalTime();
|
||||||
|
const TTimeIntervalMicroSeconds delta = end.MicroSecondsFrom(iStart);
|
||||||
|
|
||||||
|
|
||||||
|
// const TTimeIntervalMicroSeconds end = iPlayer->Position();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const TInt diff = specTime - delta.Int64();
|
||||||
|
|
||||||
|
if(diff > 0 && diff < 200000)
|
||||||
|
{
|
||||||
|
User::After(diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
User::After(10000);
|
||||||
|
// iWait->Wait(10000); //just give some time...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEpocAudio::Open(TInt aRate, TInt aChannels, TUint32 aType, TInt aBytes)
|
||||||
|
{
|
||||||
|
iRate = aRate;
|
||||||
|
iChannels = aChannels;
|
||||||
|
iType = aType;
|
||||||
|
iBufferRate = iRate * iChannels * aBytes; //1/x
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Audio driver bootstrap functions */
|
||||||
|
|
||||||
|
AudioBootStrap EPOCAudio_bootstrap = {
|
||||||
|
"epoc\0\0\0",
|
||||||
|
"EPOC streaming audio\0\0\0",
|
||||||
|
Audio_Available,
|
||||||
|
Audio_CreateDevice
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static SDL_AudioDevice *Audio_CreateDevice(int /*devindex*/)
|
||||||
|
{
|
||||||
|
SDL_AudioDevice *thisdevice;
|
||||||
|
|
||||||
|
/* Initialize all variables that we clean on shutdown */
|
||||||
|
thisdevice = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice));
|
||||||
|
if ( thisdevice ) {
|
||||||
|
memset(thisdevice, 0, (sizeof *thisdevice));
|
||||||
|
thisdevice->hidden = NULL; /*(struct SDL_PrivateAudioData *)
|
||||||
|
malloc((sizeof thisdevice->hidden)); */
|
||||||
|
}
|
||||||
|
if ( (thisdevice == NULL) /*|| (thisdevice->hidden == NULL) */) {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
if ( thisdevice ) {
|
||||||
|
free(thisdevice);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
// memset(thisdevice->hidden, 0, (sizeof *thisdevice->hidden));
|
||||||
|
|
||||||
|
/* Set the function pointers */
|
||||||
|
thisdevice->OpenAudio = EPOC_OpenAudio;
|
||||||
|
thisdevice->WaitAudio = EPOC_WaitAudio;
|
||||||
|
thisdevice->PlayAudio = EPOC_PlayAudio;
|
||||||
|
thisdevice->GetAudioBuf = EPOC_GetAudioBuf;
|
||||||
|
thisdevice->CloseAudio = EPOC_CloseAudio;
|
||||||
|
thisdevice->ThreadInit = EPOC_ThreadInit;
|
||||||
|
thisdevice->free = Audio_DeleteDevice;
|
||||||
|
|
||||||
|
return thisdevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void Audio_DeleteDevice(SDL_AudioDevice *device)
|
||||||
|
{
|
||||||
|
//free(device->hidden);
|
||||||
|
free(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Audio_Available(void)
|
||||||
|
{
|
||||||
|
return(1); // Audio stream modules should be always there!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int EPOC_OpenAudio(SDL_AudioDevice *thisdevice, SDL_AudioSpec *spec)
|
||||||
|
{
|
||||||
|
SDL_TRACE("SDL:EPOC_OpenAudio");
|
||||||
|
|
||||||
|
|
||||||
|
TUint32 type = KMMFFourCCCodePCM16;
|
||||||
|
TInt bytes = 2;
|
||||||
|
|
||||||
|
switch(spec->format)
|
||||||
|
{
|
||||||
|
case AUDIO_U16LSB:
|
||||||
|
type = KMMFFourCCCodePCMU16;
|
||||||
|
break;
|
||||||
|
case AUDIO_S16LSB:
|
||||||
|
type = KMMFFourCCCodePCM16;
|
||||||
|
break;
|
||||||
|
case AUDIO_U16MSB:
|
||||||
|
type = KMMFFourCCCodePCMU16B;
|
||||||
|
break;
|
||||||
|
case AUDIO_S16MSB:
|
||||||
|
type = KMMFFourCCCodePCM16B;
|
||||||
|
break;
|
||||||
|
//8 bit not supported!
|
||||||
|
case AUDIO_U8:
|
||||||
|
case AUDIO_S8:
|
||||||
|
default:
|
||||||
|
spec->format = AUDIO_S16LSB;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(spec->channels > 2)
|
||||||
|
spec->channels = 2;
|
||||||
|
|
||||||
|
spec->freq = CStreamPlayer::ClosestSupportedRate(spec->freq);
|
||||||
|
|
||||||
|
|
||||||
|
/* Allocate mixing buffer */
|
||||||
|
const TInt buflen = spec->size;// * bytes * spec->channels;
|
||||||
|
// audiobuf = NULL;
|
||||||
|
|
||||||
|
TRAPD(err, thisdevice->hidden = static_cast<SDL_PrivateAudioData*>(CEpocAudio::NewL(buflen, spec->silence)));
|
||||||
|
if(err != KErrNone)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
CEpocAudio::Current(thisdevice).Open(spec->freq, spec->channels, type, bytes);
|
||||||
|
|
||||||
|
CEpocAudio::Current(thisdevice).SetPause(ETrue);
|
||||||
|
|
||||||
|
// isSDLAudioPaused = 1;
|
||||||
|
|
||||||
|
thisdevice->enabled = 0; /* enable only after audio engine has been initialized!*/
|
||||||
|
|
||||||
|
/* We're ready to rock and roll. :-) */
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void EPOC_CloseAudio(SDL_AudioDevice* thisdevice)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_AUDIO
|
||||||
|
SDL_TRACE("Close audio\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CEpocAudio::Free(thisdevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void EPOC_ThreadInit(SDL_AudioDevice *thisdevice)
|
||||||
|
{
|
||||||
|
SDL_TRACE("SDL:EPOC_ThreadInit");
|
||||||
|
CEpocAudio::Current(thisdevice).ThreadInitL(thisdevice);
|
||||||
|
RThread().SetPriority(EPriorityMore);
|
||||||
|
thisdevice->enabled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function waits until it is possible to write a full sound buffer */
|
||||||
|
static void EPOC_WaitAudio(SDL_AudioDevice* thisdevice)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_AUDIO
|
||||||
|
SDL_TRACE1("wait %d audio\n", CEpocAudio::AudioLib().StreamPlayer(KSfxChannel).SyncTime());
|
||||||
|
TInt tics = User::TickCount();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CEpocAudio::Current(thisdevice).Wait();
|
||||||
|
|
||||||
|
#ifdef DEBUG_AUDIO
|
||||||
|
TInt ntics = User::TickCount() - tics;
|
||||||
|
SDL_TRACE1("audio waited %d\n", ntics);
|
||||||
|
SDL_TRACE1("audio at %d\n", tics);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void EPOC_PlayAudio(SDL_AudioDevice* thisdevice)
|
||||||
|
{
|
||||||
|
if(CEpocAudio::Current(thisdevice).SetPause(SDL_GetAudioStatus() == SDL_AUDIO_PAUSED))
|
||||||
|
SDL_Delay(500); //hold on the busy loop
|
||||||
|
else
|
||||||
|
CEpocAudio::Current(thisdevice).Play();
|
||||||
|
|
||||||
|
#ifdef DEBUG_AUDIO
|
||||||
|
SDL_TRACE("buffer has audio data\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_AUDIO
|
||||||
|
SDL_TRACE1("Wrote %d bytes of audio data\n", buflen);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static Uint8 *EPOC_GetAudioBuf(SDL_AudioDevice* thisdevice)
|
||||||
|
{
|
||||||
|
return CEpocAudio::Current(thisdevice).Buffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
37
src/audio/symbian/SDL_epocaudio.h
Normal file
37
src/audio/symbian/SDL_epocaudio.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@devolution.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SAVE_RCSID
|
||||||
|
static char rcsid =
|
||||||
|
"@(#) $Id: SDL_epocaudio.h,v 1.1.2.2 2001/02/10 07:20:03 hercules Exp $";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _SDL_EPOCAUDIO_H
|
||||||
|
#define _SDL_EPOCAUDIO_H
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "SDL_sysaudio.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _SDL_EPOCAUDIO_H */
|
279
src/audio/symbian/streamplayer.cpp
Normal file
279
src/audio/symbian/streamplayer.cpp
Normal file
|
@ -0,0 +1,279 @@
|
||||||
|
#include "streamplayer.h"
|
||||||
|
#include<mda/common/audio.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const TInt KMaxVolume(256);
|
||||||
|
|
||||||
|
LOCAL_C TInt GetSampleRate(TInt aRate)
|
||||||
|
{
|
||||||
|
switch(aRate)
|
||||||
|
{
|
||||||
|
case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz;
|
||||||
|
case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz;
|
||||||
|
case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz;
|
||||||
|
case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz;
|
||||||
|
case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz;
|
||||||
|
case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz;
|
||||||
|
case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz;
|
||||||
|
case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz;
|
||||||
|
case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz;
|
||||||
|
case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
|
||||||
|
case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
|
||||||
|
}
|
||||||
|
return KErrNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL_C TInt GetChannels(TInt aChannels)
|
||||||
|
{
|
||||||
|
switch(aChannels)
|
||||||
|
{
|
||||||
|
case 1: return TMdaAudioDataSettings::EChannelsMono;
|
||||||
|
case 2: return TMdaAudioDataSettings::EChannelsStereo;
|
||||||
|
}
|
||||||
|
return KErrNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
TInt CStreamPlayer::ClosestSupportedRate(TInt aRate)
|
||||||
|
{
|
||||||
|
if(aRate > 96000)
|
||||||
|
return 96000;
|
||||||
|
TInt rate = aRate;
|
||||||
|
while(GetSampleRate(rate) == KErrNotFound)
|
||||||
|
{
|
||||||
|
++rate;
|
||||||
|
}
|
||||||
|
return rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs) :
|
||||||
|
iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CStreamPlayer::~CStreamPlayer()
|
||||||
|
{
|
||||||
|
iState |= EDied;
|
||||||
|
if(iState & EInited)
|
||||||
|
Close();
|
||||||
|
User::After(100000); //wait buffer to be flushed
|
||||||
|
ASSERT(iPtr.Length() == 0);
|
||||||
|
delete iStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CStreamPlayer::ConstructL()
|
||||||
|
{
|
||||||
|
iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
|
||||||
|
iSilence.SetMax();
|
||||||
|
iSilence.FillZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TInt CStreamPlayer::OpenStream(TInt aRate, TInt aChannels, TUint32 aType)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
|
||||||
|
iType = aType;
|
||||||
|
|
||||||
|
iRate = GetSampleRate(aRate);
|
||||||
|
if(iRate == KErrNotFound)
|
||||||
|
return KErrNotSupported;
|
||||||
|
|
||||||
|
iChannels = GetChannels(aChannels);
|
||||||
|
if(iChannels == KErrNotFound)
|
||||||
|
return KErrNotSupported;
|
||||||
|
|
||||||
|
Open();
|
||||||
|
|
||||||
|
return KErrNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TInt CStreamPlayer::MaxVolume() const
|
||||||
|
{
|
||||||
|
return KMaxVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::SetVolume(TInt aNew)
|
||||||
|
{
|
||||||
|
|
||||||
|
const TInt maxi = MaxVolume();
|
||||||
|
if(aNew > maxi)
|
||||||
|
return;
|
||||||
|
if(aNew < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
iVolume = aNew;
|
||||||
|
|
||||||
|
iState |= EVolumeChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
TInt CStreamPlayer::Volume() const
|
||||||
|
{
|
||||||
|
return iVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::Open()
|
||||||
|
{
|
||||||
|
TMdaAudioDataSettings audioSettings;
|
||||||
|
audioSettings.Query();
|
||||||
|
audioSettings.iCaps = TMdaAudioDataSettings::ERealTime |
|
||||||
|
TMdaAudioDataSettings::ESampleRateFixed;
|
||||||
|
audioSettings.iSampleRate = iRate;
|
||||||
|
audioSettings.iChannels = iChannels;
|
||||||
|
audioSettings.iFlags = TMdaAudioDataSettings::ENoNetworkRouting;
|
||||||
|
audioSettings.iVolume = 0;
|
||||||
|
|
||||||
|
iState &= ~EStopped;
|
||||||
|
iStream->Open(&audioSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::Stop()
|
||||||
|
{
|
||||||
|
if(iState & (EStarted | EInited))
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
iState |= EStopped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::Start()
|
||||||
|
{
|
||||||
|
if(iPtr.Length() == 0)
|
||||||
|
{
|
||||||
|
iState |= EStarted;
|
||||||
|
if(iState & EInited)
|
||||||
|
{
|
||||||
|
Request();
|
||||||
|
}
|
||||||
|
else if(iState & EStopped)
|
||||||
|
{
|
||||||
|
Open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::Close()
|
||||||
|
{
|
||||||
|
iState &= ~EInited;
|
||||||
|
iStream->Stop();
|
||||||
|
iState &= ~EStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::Request()
|
||||||
|
{
|
||||||
|
if(iState & EInited)
|
||||||
|
{
|
||||||
|
iPtr.Set(KNullDesC8);
|
||||||
|
|
||||||
|
if(iState & EVolumeChange)
|
||||||
|
{
|
||||||
|
const TReal newVol = iVolume;
|
||||||
|
const TReal newMax = MaxVolume();
|
||||||
|
const TInt maxVol = iStream->MaxVolume();
|
||||||
|
const TReal max = static_cast<TReal>(maxVol);
|
||||||
|
const TReal newvolume = (newVol * max) / newMax;
|
||||||
|
const TInt vol = static_cast<TReal>(newvolume);
|
||||||
|
iStream->SetVolume(vol);
|
||||||
|
iState &= ~EVolumeChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(iState & EStarted)
|
||||||
|
{
|
||||||
|
iPtr.Set(iProvider.Data());
|
||||||
|
}
|
||||||
|
if(iPtr.Length() == 0)
|
||||||
|
{
|
||||||
|
iPtr.Set(iSilence);
|
||||||
|
}
|
||||||
|
TRAPD(err, iStream->WriteL(iPtr));
|
||||||
|
if(err != KErrNone)
|
||||||
|
{
|
||||||
|
iObs.Complete(MStreamObs::EWrite, err);
|
||||||
|
}
|
||||||
|
/* else
|
||||||
|
{
|
||||||
|
iProvider.Written(iPtr.Length());
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CStreamPlayer::SetCapsL()
|
||||||
|
{
|
||||||
|
iStream->SetDataTypeL(iType);
|
||||||
|
iStream->SetAudioPropertiesL(iRate, iChannels);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::MaoscOpenComplete(TInt aError)
|
||||||
|
{
|
||||||
|
if(aError == KErrNone)
|
||||||
|
{
|
||||||
|
TRAPD(err, SetCapsL());
|
||||||
|
if(err == KErrNone)
|
||||||
|
{
|
||||||
|
iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
|
||||||
|
iState |= EInited;
|
||||||
|
|
||||||
|
|
||||||
|
SetVolume(Volume());
|
||||||
|
|
||||||
|
if(iState & EStarted)
|
||||||
|
{
|
||||||
|
Request();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
aError = err;
|
||||||
|
}
|
||||||
|
if(!(iState & EDied))
|
||||||
|
iObs.Complete(MStreamObs::EInit, aError);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
|
||||||
|
{
|
||||||
|
iPtr.Set(KNullDesC8);
|
||||||
|
if(aError == KErrNone)
|
||||||
|
{
|
||||||
|
if(iState & EInited)
|
||||||
|
Request();
|
||||||
|
else
|
||||||
|
iStream->Stop();
|
||||||
|
}
|
||||||
|
else if(!(iState & EDied))
|
||||||
|
iObs.Complete(MStreamObs::EPlay, aError);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CStreamPlayer::MaoscPlayComplete(TInt aError)
|
||||||
|
{
|
||||||
|
iPtr.Set(KNullDesC8);
|
||||||
|
iState &= ~EStarted;
|
||||||
|
if(!(iState & EDied))
|
||||||
|
iObs.Complete(MStreamObs::EClose, aError);
|
||||||
|
}
|
||||||
|
|
||||||
|
TBool CStreamPlayer::Playing() const
|
||||||
|
{
|
||||||
|
return (iState & EInited) && (iState & EStarted);
|
||||||
|
}
|
||||||
|
|
||||||
|
TBool CStreamPlayer::Closed() const
|
||||||
|
{
|
||||||
|
return !(iState & EInited) && !(iState & EDied);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void CStreamPlayer::Request()
|
||||||
|
{
|
||||||
|
SetActive();
|
||||||
|
TRequestStatus* s = &iStatus;
|
||||||
|
User::RequestComplete(s, KErrNone);
|
||||||
|
}
|
||||||
|
// iTimer.After(0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
89
src/audio/symbian/streamplayer.h
Normal file
89
src/audio/symbian/streamplayer.h
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
#ifndef STREAMPLAYER_H
|
||||||
|
#define STREAMPLAYER_H
|
||||||
|
|
||||||
|
#include<MdaAudioOutputStream.h>
|
||||||
|
|
||||||
|
const TInt KSilenceBuffer = 256;
|
||||||
|
|
||||||
|
class MStreamObs
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
EInit,
|
||||||
|
EPlay,
|
||||||
|
EWrite,
|
||||||
|
EClose,
|
||||||
|
};
|
||||||
|
virtual void Complete(TInt aState, TInt aError) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MStreamProvider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual TPtrC8 Data() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CStreamPlayer) : public CBase, public MMdaAudioOutputStreamCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs);
|
||||||
|
~CStreamPlayer();
|
||||||
|
void ConstructL();
|
||||||
|
|
||||||
|
static TInt ClosestSupportedRate(TInt aRate);
|
||||||
|
|
||||||
|
TInt OpenStream(TInt aRate, TInt aChannels, TUint32 aType = KMMFFourCCCodePCM16);
|
||||||
|
|
||||||
|
void SetVolume(TInt aNew);
|
||||||
|
TInt Volume() const;
|
||||||
|
TInt MaxVolume() const;
|
||||||
|
|
||||||
|
void Stop();
|
||||||
|
void Start();
|
||||||
|
void Open();
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
TBool Playing() const;
|
||||||
|
TBool Closed() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void MaoscOpenComplete(TInt aError) ;
|
||||||
|
void MaoscBufferCopied(TInt aError, const TDesC8& aBuffer);
|
||||||
|
void MaoscPlayComplete(TInt aError);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Request();
|
||||||
|
void SetCapsL();
|
||||||
|
|
||||||
|
private:
|
||||||
|
MStreamProvider& iProvider;
|
||||||
|
MStreamObs& iObs;
|
||||||
|
TInt iVolume;
|
||||||
|
|
||||||
|
CMdaAudioOutputStream* iStream;
|
||||||
|
|
||||||
|
TInt iRate;
|
||||||
|
TInt iChannels;
|
||||||
|
TUint32 iType;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
ENone = 0,
|
||||||
|
EInited = 0x1,
|
||||||
|
EStarted = 0x2,
|
||||||
|
EStopped = 0x4,
|
||||||
|
EVolumeChange = 0x8,
|
||||||
|
EDied = 0x10
|
||||||
|
};
|
||||||
|
|
||||||
|
TInt iState;
|
||||||
|
TBuf8<KSilenceBuffer> iSilence;
|
||||||
|
TPtrC8 iPtr;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -136,7 +136,7 @@ static SDL_AudioDevice *Audio_CreateDevice(int devindex)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioBootStrap UMS_bootstrap = {
|
AudioBootStrap UMS_bootstrap = {
|
||||||
UMS_DRIVER_NAME, "AUX UMS audio",
|
UMS_DRIVER_NAME, "AIX UMS audio",
|
||||||
Audio_Available, Audio_CreateDevice
|
Audio_Available, Audio_CreateDevice
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -218,7 +218,7 @@ static void CheckMounts(const char *mtab)
|
||||||
if ( SDL_strcmp(mnt_type, MNTTYPE_SUPER) == 0 ) {
|
if ( SDL_strcmp(mnt_type, MNTTYPE_SUPER) == 0 ) {
|
||||||
tmp = SDL_strstr(mntent->mnt_opts, "fs=");
|
tmp = SDL_strstr(mntent->mnt_opts, "fs=");
|
||||||
if ( tmp ) {
|
if ( tmp ) {
|
||||||
SDL_free(mnt_type);
|
SDL_stack_free(mnt_type);
|
||||||
mnt_type = SDL_strdup(tmp + SDL_strlen("fs="));
|
mnt_type = SDL_strdup(tmp + SDL_strlen("fs="));
|
||||||
if ( mnt_type ) {
|
if ( mnt_type ) {
|
||||||
tmp = SDL_strchr(mnt_type, ',');
|
tmp = SDL_strchr(mnt_type, ',');
|
||||||
|
@ -229,7 +229,7 @@ static void CheckMounts(const char *mtab)
|
||||||
}
|
}
|
||||||
tmp = SDL_strstr(mntent->mnt_opts, "dev=");
|
tmp = SDL_strstr(mntent->mnt_opts, "dev=");
|
||||||
if ( tmp ) {
|
if ( tmp ) {
|
||||||
SDL_free(mnt_dev);
|
SDL_stack_free(mnt_dev);
|
||||||
mnt_dev = SDL_strdup(tmp + SDL_strlen("dev="));
|
mnt_dev = SDL_strdup(tmp + SDL_strlen("dev="));
|
||||||
if ( mnt_dev ) {
|
if ( mnt_dev ) {
|
||||||
tmp = SDL_strchr(mnt_dev, ',');
|
tmp = SDL_strchr(mnt_dev, ',');
|
||||||
|
|
|
@ -169,7 +169,7 @@ static int SDL_StartEventThread(Uint32 flags)
|
||||||
|
|
||||||
/* The event thread will handle timers too */
|
/* The event thread will handle timers too */
|
||||||
SDL_SetTimerThreaded(2);
|
SDL_SetTimerThreaded(2);
|
||||||
#if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC)
|
#if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC) && !defined(__SYMBIAN32__)
|
||||||
#undef SDL_CreateThread
|
#undef SDL_CreateThread
|
||||||
SDL_EventThread = SDL_CreateThread(SDL_GobbleEvents, NULL, NULL, NULL);
|
SDL_EventThread = SDL_CreateThread(SDL_GobbleEvents, NULL, NULL, NULL);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "SDL_rwops.h"
|
#include "SDL_rwops.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined(__WIN32__)
|
#if defined(__WIN32__) && !defined(__SYMBIAN32__)
|
||||||
|
|
||||||
/* Functions to read/write Win32 API file pointers */
|
/* Functions to read/write Win32 API file pointers */
|
||||||
/* Will not use it on WinCE because stdio is buffered, it means
|
/* Will not use it on WinCE because stdio is buffered, it means
|
||||||
|
@ -43,6 +43,8 @@
|
||||||
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
|
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define READAHEAD_BUFFER_SIZE 1024
|
||||||
|
|
||||||
static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, const char *mode)
|
static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, const char *mode)
|
||||||
{
|
{
|
||||||
#ifndef _WIN32_WCE
|
#ifndef _WIN32_WCE
|
||||||
|
@ -54,9 +56,12 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con
|
||||||
int a_mode;
|
int a_mode;
|
||||||
|
|
||||||
if (!context)
|
if (!context)
|
||||||
return -1;
|
return -1; /* failed (invalid call) */
|
||||||
|
|
||||||
context->hidden.win32io.h = INVALID_HANDLE_VALUE; /* mark this as unusable */
|
context->hidden.win32io.h = INVALID_HANDLE_VALUE; /* mark this as unusable */
|
||||||
|
context->hidden.win32io.buffer.data = NULL;
|
||||||
|
context->hidden.win32io.buffer.size = 0;
|
||||||
|
context->hidden.win32io.buffer.left = 0;
|
||||||
|
|
||||||
/* "r" = reading, file must exist */
|
/* "r" = reading, file must exist */
|
||||||
/* "w" = writing, truncate existing, file may not exist */
|
/* "w" = writing, truncate existing, file may not exist */
|
||||||
|
@ -74,14 +79,22 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con
|
||||||
if (!r_right && !w_right) /* inconsistent mode */
|
if (!r_right && !w_right) /* inconsistent mode */
|
||||||
return -1; /* failed (invalid call) */
|
return -1; /* failed (invalid call) */
|
||||||
|
|
||||||
|
context->hidden.win32io.buffer.data = (char *)SDL_malloc(READAHEAD_BUFFER_SIZE);
|
||||||
|
if (!context->hidden.win32io.buffer.data) {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
{
|
{
|
||||||
size_t size = SDL_strlen(filename)+1;
|
size_t size = SDL_strlen(filename)+1;
|
||||||
wchar_t *filenameW = SDL_stack_alloc(wchar_t, size);
|
wchar_t *filenameW = SDL_stack_alloc(wchar_t, size);
|
||||||
|
|
||||||
if ( MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, size) == 0 ) {
|
if ( MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, size) == 0 ) {
|
||||||
SDL_SetError("Unable to convert filename to Unicode");
|
|
||||||
SDL_stack_free(filenameW);
|
SDL_stack_free(filenameW);
|
||||||
|
SDL_free(context->hidden.win32io.buffer.data);
|
||||||
|
context->hidden.win32io.buffer.data = NULL;
|
||||||
|
SDL_SetError("Unable to convert filename to Unicode");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
h = CreateFile(filenameW, (w_right|r_right), (w_right)? 0 : FILE_SHARE_READ,
|
h = CreateFile(filenameW, (w_right|r_right), (w_right)? 0 : FILE_SHARE_READ,
|
||||||
|
@ -100,6 +113,8 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con
|
||||||
#endif /* _WIN32_WCE */
|
#endif /* _WIN32_WCE */
|
||||||
|
|
||||||
if (h==INVALID_HANDLE_VALUE) {
|
if (h==INVALID_HANDLE_VALUE) {
|
||||||
|
SDL_free(context->hidden.win32io.buffer.data);
|
||||||
|
context->hidden.win32io.buffer.data = NULL;
|
||||||
SDL_SetError("Couldn't open %s",filename);
|
SDL_SetError("Couldn't open %s",filename);
|
||||||
return -2; /* failed (CreateFile) */
|
return -2; /* failed (CreateFile) */
|
||||||
}
|
}
|
||||||
|
@ -118,6 +133,12 @@ static int SDLCALL win32_file_seek(SDL_RWops *context, int offset, int whence)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME: We may be able to satisfy the seek within buffered data */
|
||||||
|
if (whence == RW_SEEK_CUR && context->hidden.win32io.buffer.left) {
|
||||||
|
offset -= context->hidden.win32io.buffer.left;
|
||||||
|
}
|
||||||
|
context->hidden.win32io.buffer.left = 0;
|
||||||
|
|
||||||
switch (whence) {
|
switch (whence) {
|
||||||
case RW_SEEK_SET:
|
case RW_SEEK_SET:
|
||||||
win32whence = FILE_BEGIN; break;
|
win32whence = FILE_BEGIN; break;
|
||||||
|
@ -140,21 +161,50 @@ static int SDLCALL win32_file_seek(SDL_RWops *context, int offset, int whence)
|
||||||
}
|
}
|
||||||
static int SDLCALL win32_file_read(SDL_RWops *context, void *ptr, int size, int maxnum)
|
static int SDLCALL win32_file_read(SDL_RWops *context, void *ptr, int size, int maxnum)
|
||||||
{
|
{
|
||||||
|
int total_need;
|
||||||
|
int total_read = 0;
|
||||||
|
int read_ahead;
|
||||||
|
DWORD byte_read;
|
||||||
|
|
||||||
int total_bytes;
|
total_need = size*maxnum;
|
||||||
DWORD byte_read,nread;
|
|
||||||
|
|
||||||
total_bytes = size*maxnum;
|
if (!context || context->hidden.win32io.h == INVALID_HANDLE_VALUE || total_need<=0 || !size)
|
||||||
|
|
||||||
if (!context || context->hidden.win32io.h == INVALID_HANDLE_VALUE || total_bytes<=0 || !size)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!ReadFile(context->hidden.win32io.h,ptr,total_bytes,&byte_read,NULL)) {
|
if (context->hidden.win32io.buffer.left > 0) {
|
||||||
|
void *data = (char *)context->hidden.win32io.buffer.data +
|
||||||
|
context->hidden.win32io.buffer.size -
|
||||||
|
context->hidden.win32io.buffer.left;
|
||||||
|
read_ahead = SDL_min(total_need, context->hidden.win32io.buffer.left);
|
||||||
|
SDL_memcpy(ptr, data, read_ahead);
|
||||||
|
context->hidden.win32io.buffer.left -= read_ahead;
|
||||||
|
|
||||||
|
if (read_ahead == total_need) {
|
||||||
|
return maxnum;
|
||||||
|
}
|
||||||
|
ptr = (char *)ptr + read_ahead;
|
||||||
|
total_need -= read_ahead;
|
||||||
|
total_read += read_ahead;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total_need < READAHEAD_BUFFER_SIZE) {
|
||||||
|
if (!ReadFile(context->hidden.win32io.h,context->hidden.win32io.buffer.data,READAHEAD_BUFFER_SIZE,&byte_read,NULL)) {
|
||||||
SDL_Error(SDL_EFREAD);
|
SDL_Error(SDL_EFREAD);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
nread = byte_read/size;
|
read_ahead = SDL_min(total_need, (int)byte_read);
|
||||||
return nread;
|
SDL_memcpy(ptr, context->hidden.win32io.buffer.data, read_ahead);
|
||||||
|
context->hidden.win32io.buffer.size = byte_read;
|
||||||
|
context->hidden.win32io.buffer.left = byte_read-read_ahead;
|
||||||
|
total_read += read_ahead;
|
||||||
|
} else {
|
||||||
|
if (!ReadFile(context->hidden.win32io.h,ptr,total_need,&byte_read,NULL)) {
|
||||||
|
SDL_Error(SDL_EFREAD);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
total_read += byte_read;
|
||||||
|
}
|
||||||
|
return (total_read/size);
|
||||||
}
|
}
|
||||||
static int SDLCALL win32_file_write(SDL_RWops *context, const void *ptr, int size, int num)
|
static int SDLCALL win32_file_write(SDL_RWops *context, const void *ptr, int size, int num)
|
||||||
{
|
{
|
||||||
|
@ -167,6 +217,11 @@ static int SDLCALL win32_file_write(SDL_RWops *context, const void *ptr, int siz
|
||||||
if (!context || context->hidden.win32io.h==INVALID_HANDLE_VALUE || total_bytes<=0 || !size)
|
if (!context || context->hidden.win32io.h==INVALID_HANDLE_VALUE || total_bytes<=0 || !size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (context->hidden.win32io.buffer.left) {
|
||||||
|
SetFilePointer(context->hidden.win32io.h,-context->hidden.win32io.buffer.left,NULL,FILE_CURRENT);
|
||||||
|
context->hidden.win32io.buffer.left = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* if in append mode, we must go to the EOF before write */
|
/* if in append mode, we must go to the EOF before write */
|
||||||
if (context->hidden.win32io.append) {
|
if (context->hidden.win32io.append) {
|
||||||
if ( SetFilePointer(context->hidden.win32io.h,0L,NULL,FILE_END) == INVALID_SET_FILE_POINTER ) {
|
if ( SetFilePointer(context->hidden.win32io.h,0L,NULL,FILE_END) == INVALID_SET_FILE_POINTER ) {
|
||||||
|
@ -191,6 +246,10 @@ static int SDLCALL win32_file_close(SDL_RWops *context)
|
||||||
CloseHandle(context->hidden.win32io.h);
|
CloseHandle(context->hidden.win32io.h);
|
||||||
context->hidden.win32io.h = INVALID_HANDLE_VALUE; /* to be sure */
|
context->hidden.win32io.h = INVALID_HANDLE_VALUE; /* to be sure */
|
||||||
}
|
}
|
||||||
|
if (context->hidden.win32io.buffer.data) {
|
||||||
|
SDL_free(context->hidden.win32io.buffer.data);
|
||||||
|
context->hidden.win32io.buffer.data = NULL;
|
||||||
|
}
|
||||||
SDL_FreeRW(context);
|
SDL_FreeRW(context);
|
||||||
}
|
}
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -372,12 +431,11 @@ SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__WIN32__)
|
#if defined(__WIN32__) && !defined(__SYMBIAN32__)
|
||||||
rwops = SDL_AllocRW();
|
rwops = SDL_AllocRW();
|
||||||
if (!rwops)
|
if (!rwops)
|
||||||
return NULL; /* SDL_SetError already setup by SDL_AllocRW() */
|
return NULL; /* SDL_SetError already setup by SDL_AllocRW() */
|
||||||
rwops->hidden.win32io.h = INVALID_HANDLE_VALUE;
|
if (win32_file_open(rwops,file,mode) < 0) {
|
||||||
if (win32_file_open(rwops,file,mode)) {
|
|
||||||
SDL_FreeRW(rwops);
|
SDL_FreeRW(rwops);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ BITS 32
|
||||||
%include "common.inc"
|
%include "common.inc"
|
||||||
|
|
||||||
SDL_FUNC _ConvertMMX
|
SDL_FUNC _ConvertMMX
|
||||||
SDL_FUNC _mmxreturn
|
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
|
@ -51,9 +50,8 @@ _ConvertMMX:
|
||||||
y_loop:
|
y_loop:
|
||||||
mov ecx,[ebp+4]
|
mov ecx,[ebp+4]
|
||||||
|
|
||||||
jmp [ebp+32]
|
call [ebp+32]
|
||||||
|
|
||||||
_mmxreturn:
|
|
||||||
add esi,[ebp+12]
|
add esi,[ebp+12]
|
||||||
add edi,[ebp+28]
|
add edi,[ebp+28]
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,6 @@ SDL_FUNC _ConvertMMXpII32_16BGR565
|
||||||
SDL_FUNC _ConvertMMXpII32_16RGB555
|
SDL_FUNC _ConvertMMXpII32_16RGB555
|
||||||
SDL_FUNC _ConvertMMXpII32_16BGR555
|
SDL_FUNC _ConvertMMXpII32_16BGR555
|
||||||
|
|
||||||
EXTERN _mmxreturn
|
|
||||||
|
|
||||||
;; Macros for conversion routines
|
;; Macros for conversion routines
|
||||||
|
|
||||||
%macro _push_immq_mask 1
|
%macro _push_immq_mask 1
|
||||||
|
@ -121,7 +119,7 @@ _ConvertMMXpII32_24RGB888:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L3
|
jnz .L3
|
||||||
.L4:
|
.L4:
|
||||||
jmp _mmxreturn
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -190,7 +188,7 @@ _ConvertMMXpII32_16RGB565:
|
||||||
jnz .L3
|
jnz .L3
|
||||||
|
|
||||||
.L4:
|
.L4:
|
||||||
jmp _mmxreturn
|
retn
|
||||||
|
|
||||||
|
|
||||||
_ConvertMMXpII32_16BGR565:
|
_ConvertMMXpII32_16BGR565:
|
||||||
|
@ -260,7 +258,7 @@ _ConvertMMXpII32_16BGR565:
|
||||||
jnz .L3
|
jnz .L3
|
||||||
|
|
||||||
.L4:
|
.L4:
|
||||||
jmp _mmxreturn
|
retn
|
||||||
|
|
||||||
_ConvertMMXpII32_16BGR555:
|
_ConvertMMXpII32_16BGR555:
|
||||||
|
|
||||||
|
@ -285,7 +283,7 @@ _convert_bgr555_cheat:
|
||||||
|
|
||||||
mov edx,ecx ; Save ecx
|
mov edx,ecx ; Save ecx
|
||||||
|
|
||||||
and ecx,BYTE 0fffffff8h ; clear lower three bits
|
and ecx,DWORD 0fffffff8h ; clear lower three bits
|
||||||
jnz .L_OK
|
jnz .L_OK
|
||||||
jmp near .L2
|
jmp near .L2
|
||||||
|
|
||||||
|
@ -400,7 +398,7 @@ _convert_bgr555_cheat:
|
||||||
jnz .L3
|
jnz .L3
|
||||||
|
|
||||||
.L4:
|
.L4:
|
||||||
jmp _mmxreturn
|
retn
|
||||||
|
|
||||||
%ifidn __OUTPUT_FORMAT__,elf
|
%ifidn __OUTPUT_FORMAT__,elf
|
||||||
section .note.GNU-stack noalloc noexec nowrite progbits
|
section .note.GNU-stack noalloc noexec nowrite progbits
|
||||||
|
|
|
@ -14,9 +14,6 @@ BITS 32
|
||||||
%include "common.inc"
|
%include "common.inc"
|
||||||
|
|
||||||
SDL_FUNC _ConvertX86
|
SDL_FUNC _ConvertX86
|
||||||
SDL_FUNC _x86return
|
|
||||||
|
|
||||||
SDL_FUNC _Hermes_X86_CPU
|
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
|
@ -55,9 +52,8 @@ _ConvertX86:
|
||||||
y_loop:
|
y_loop:
|
||||||
mov ecx,[ebp+4]
|
mov ecx,[ebp+4]
|
||||||
|
|
||||||
jmp [ebp+32]
|
call [ebp+32]
|
||||||
|
|
||||||
_x86return:
|
|
||||||
add esi,[ebp+12]
|
add esi,[ebp+12]
|
||||||
add edi,[ebp+28]
|
add edi,[ebp+28]
|
||||||
|
|
||||||
|
@ -74,49 +70,6 @@ endconvert:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; Hermes_X86_CPU returns the CPUID flags in eax
|
|
||||||
|
|
||||||
_Hermes_X86_CPU:
|
|
||||||
pushfd
|
|
||||||
pop eax
|
|
||||||
|
|
||||||
mov ecx,eax
|
|
||||||
|
|
||||||
xor eax,040000h
|
|
||||||
push eax
|
|
||||||
|
|
||||||
popfd
|
|
||||||
pushfd
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
xor eax,ecx
|
|
||||||
jz .L1 ; Processor is 386
|
|
||||||
|
|
||||||
push ecx
|
|
||||||
popfd
|
|
||||||
|
|
||||||
mov eax,ecx
|
|
||||||
xor eax,200000h
|
|
||||||
|
|
||||||
push eax
|
|
||||||
popfd
|
|
||||||
pushfd
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
xor eax,ecx
|
|
||||||
je .L1
|
|
||||||
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov eax,1
|
|
||||||
cpuid
|
|
||||||
mov eax,edx
|
|
||||||
|
|
||||||
pop ebx
|
|
||||||
|
|
||||||
.L1:
|
|
||||||
ret
|
|
||||||
|
|
||||||
%ifidn __OUTPUT_FORMAT__,elf
|
%ifidn __OUTPUT_FORMAT__,elf
|
||||||
section .note.GNU-stack noalloc noexec nowrite progbits
|
section .note.GNU-stack noalloc noexec nowrite progbits
|
||||||
%endif
|
%endif
|
||||||
|
|
|
@ -20,7 +20,6 @@ SDL_FUNC _ConvertX86p16_16BGR555
|
||||||
SDL_FUNC _ConvertX86p16_8RGB332
|
SDL_FUNC _ConvertX86p16_8RGB332
|
||||||
|
|
||||||
EXTERN _ConvertX86
|
EXTERN _ConvertX86
|
||||||
EXTERN _x86return
|
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
|
@ -49,7 +48,7 @@ _ConvertX86p16_16BGR565:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov eax,edi
|
mov eax,edi
|
||||||
|
@ -127,7 +126,7 @@ _ConvertX86p16_16BGR565:
|
||||||
add edi,BYTE 2
|
add edi,BYTE 2
|
||||||
|
|
||||||
.L7
|
.L7
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,7 +155,7 @@ _ConvertX86p16_16RGB555:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov eax,edi
|
mov eax,edi
|
||||||
|
@ -235,7 +234,7 @@ _ConvertX86p16_16RGB555:
|
||||||
jmp SHORT .L6
|
jmp SHORT .L6
|
||||||
|
|
||||||
.L7 pop ebp
|
.L7 pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -269,7 +268,7 @@ _ConvertX86p16_16BGR555:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov eax,edi
|
mov eax,edi
|
||||||
|
@ -353,7 +352,7 @@ _ConvertX86p16_16BGR555:
|
||||||
add edi,BYTE 2
|
add edi,BYTE 2
|
||||||
|
|
||||||
.L7
|
.L7
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -386,7 +385,7 @@ _ConvertX86p16_8RGB332:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 mov eax,edi
|
.L3 mov eax,edi
|
||||||
and eax,BYTE 11b
|
and eax,BYTE 11b
|
||||||
|
@ -484,7 +483,7 @@ _ConvertX86p16_8RGB332:
|
||||||
jnz .L6
|
jnz .L6
|
||||||
|
|
||||||
.L7 pop ebp
|
.L7 pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
%ifidn __OUTPUT_FORMAT__,elf
|
%ifidn __OUTPUT_FORMAT__,elf
|
||||||
section .note.GNU-stack noalloc noexec nowrite progbits
|
section .note.GNU-stack noalloc noexec nowrite progbits
|
||||||
|
|
|
@ -24,8 +24,6 @@ SDL_FUNC _ConvertX86p32_16RGB555
|
||||||
SDL_FUNC _ConvertX86p32_16BGR555
|
SDL_FUNC _ConvertX86p32_16BGR555
|
||||||
SDL_FUNC _ConvertX86p32_8RGB332
|
SDL_FUNC _ConvertX86p32_8RGB332
|
||||||
|
|
||||||
EXTERN _x86return
|
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
;; _Convert_*
|
;; _Convert_*
|
||||||
|
@ -53,7 +51,7 @@ _ConvertX86p32_32BGR888:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; save ebp
|
.L3 ; save ebp
|
||||||
push ebp
|
push ebp
|
||||||
|
@ -113,7 +111,7 @@ _ConvertX86p32_32BGR888:
|
||||||
jnz .L5
|
jnz .L5
|
||||||
|
|
||||||
.L6 pop ebp
|
.L6 pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,7 +131,7 @@ _ConvertX86p32_32RGBA888:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; save ebp
|
.L3 ; save ebp
|
||||||
push ebp
|
push ebp
|
||||||
|
@ -184,7 +182,7 @@ _ConvertX86p32_32RGBA888:
|
||||||
jnz .L5
|
jnz .L5
|
||||||
|
|
||||||
.L6 pop ebp
|
.L6 pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,7 +202,7 @@ _ConvertX86p32_32BGRA888:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; save ebp
|
.L3 ; save ebp
|
||||||
push ebp
|
push ebp
|
||||||
|
@ -257,7 +255,7 @@ _ConvertX86p32_32BGRA888:
|
||||||
jnz .L5
|
jnz .L5
|
||||||
|
|
||||||
.L6 pop ebp
|
.L6 pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -282,7 +280,7 @@ _ConvertX86p32_24RGB888:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov edx,edi
|
mov edx,edi
|
||||||
|
@ -354,7 +352,7 @@ _ConvertX86p32_24RGB888:
|
||||||
jnz .L6
|
jnz .L6
|
||||||
|
|
||||||
.L7 pop ebp
|
.L7 pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -380,7 +378,7 @@ _ConvertX86p32_24BGR888:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov edx,edi
|
mov edx,edi
|
||||||
|
@ -455,7 +453,7 @@ _ConvertX86p32_24BGR888:
|
||||||
|
|
||||||
.L7
|
.L7
|
||||||
pop ebp
|
pop ebp
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -484,7 +482,7 @@ _ConvertX86p32_16RGB565:
|
||||||
jnz .L1
|
jnz .L1
|
||||||
|
|
||||||
.L2: ; End of short loop
|
.L2: ; End of short loop
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
|
@ -570,7 +568,7 @@ _ConvertX86p32_16RGB565:
|
||||||
add edi,BYTE 2
|
add edi,BYTE 2
|
||||||
|
|
||||||
.L7:
|
.L7:
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -599,7 +597,7 @@ _ConvertX86p32_16BGR565:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov ebx,edi
|
mov ebx,edi
|
||||||
|
@ -684,7 +682,7 @@ _ConvertX86p32_16BGR565:
|
||||||
add edi,BYTE 2
|
add edi,BYTE 2
|
||||||
|
|
||||||
.L7
|
.L7
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -713,7 +711,7 @@ _ConvertX86p32_16RGB555:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov ebx,edi
|
mov ebx,edi
|
||||||
|
@ -795,7 +793,7 @@ _ConvertX86p32_16RGB555:
|
||||||
add edi,BYTE 2
|
add edi,BYTE 2
|
||||||
|
|
||||||
.L7
|
.L7
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -825,7 +823,7 @@ _ConvertX86p32_16BGR555:
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .L1
|
jnz .L1
|
||||||
.L2
|
.L2
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
.L3 ; head
|
.L3 ; head
|
||||||
mov ebx,edi
|
mov ebx,edi
|
||||||
|
@ -910,7 +908,7 @@ _ConvertX86p32_16BGR555:
|
||||||
add edi,BYTE 2
|
add edi,BYTE 2
|
||||||
|
|
||||||
.L7
|
.L7
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1040,7 +1038,7 @@ _ConvertX86p32_8RGB332:
|
||||||
jnz .L3
|
jnz .L3
|
||||||
|
|
||||||
.L4:
|
.L4:
|
||||||
jmp _x86return
|
retn
|
||||||
|
|
||||||
%ifidn __OUTPUT_FORMAT__,elf
|
%ifidn __OUTPUT_FORMAT__,elf
|
||||||
section .note.GNU-stack noalloc noexec nowrite progbits
|
section .note.GNU-stack noalloc noexec nowrite progbits
|
||||||
|
|
|
@ -1,233 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2006 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_AMIGA
|
|
||||||
|
|
||||||
/* This is the system specific header for the SDL joystick API */
|
|
||||||
|
|
||||||
#include <libraries/lowlevel.h>
|
|
||||||
#if defined(__SASC) || defined(STORMC4_WOS)
|
|
||||||
#include <proto/exec.h>
|
|
||||||
#include <proto/lowlevel.h>
|
|
||||||
#include <proto/graphics.h>
|
|
||||||
#else
|
|
||||||
#include <inline/exec.h>
|
|
||||||
#include <inline/lowlevel.h>
|
|
||||||
#include <inline/graphics.h>
|
|
||||||
#endif
|
|
||||||
#include "mydebug.h"
|
|
||||||
|
|
||||||
extern struct ExecBase *SysBase;
|
|
||||||
extern struct GfxBase *GfxBase;
|
|
||||||
|
|
||||||
#include "SDL_joystick.h"
|
|
||||||
#include "../SDL_sysjoystick.h"
|
|
||||||
#include "../SDL_joystick_c.h"
|
|
||||||
|
|
||||||
/* Function to scan the system for joysticks.
|
|
||||||
* This function should set SDL_numjoysticks to the number of available
|
|
||||||
* joysticks. Joystick 0 should be the system default joystick.
|
|
||||||
* It should return 0, or -1 on an unrecoverable fatal error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Amiga specific datas */
|
|
||||||
struct Library *LowLevelBase=NULL;
|
|
||||||
|
|
||||||
ULONG joybut[]=
|
|
||||||
{
|
|
||||||
JPF_BUTTON_RED,
|
|
||||||
JPF_BUTTON_BLUE,
|
|
||||||
JPF_BUTTON_PLAY,
|
|
||||||
JPF_BUTTON_YELLOW,
|
|
||||||
JPF_BUTTON_GREEN,
|
|
||||||
JPF_BUTTON_FORWARD,
|
|
||||||
JPF_BUTTON_REVERSE,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct joystick_hwdata
|
|
||||||
{
|
|
||||||
ULONG joystate;
|
|
||||||
};
|
|
||||||
|
|
||||||
int SDL_SYS_JoystickInit(void)
|
|
||||||
{
|
|
||||||
if(!LowLevelBase)
|
|
||||||
{
|
|
||||||
if(LowLevelBase=OpenLibrary("lowlevel.library",37))
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
D(bug("%ld joysticks available.\n",SDL_numjoysticks));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function to get the device-dependent name of a joystick */
|
|
||||||
const char *SDL_SYS_JoystickName(int index)
|
|
||||||
{
|
|
||||||
if(index<2&&LowLevelBase)
|
|
||||||
{
|
|
||||||
switch(index)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
return "Port 1 Amiga Joystick/Joypad";
|
|
||||||
case 1:
|
|
||||||
return "Port 2 Amiga Joystick/Joypad";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_SetError("No joystick available with that index");
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function to open a joystick for use.
|
|
||||||
The joystick to open is specified by the index field of the joystick.
|
|
||||||
This should fill the nbuttons and naxes fields of the joystick structure.
|
|
||||||
It returns 0, or -1 if there is an error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
|
|
||||||
{
|
|
||||||
ULONG temp,i;
|
|
||||||
D(bug("Opening joystick %ld\n",joystick->index));
|
|
||||||
|
|
||||||
if(!(joystick->hwdata=SDL_malloc(sizeof(struct joystick_hwdata))))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* This loop is to check if the controller is a joypad */
|
|
||||||
|
|
||||||
for(i=0;i<20;i++)
|
|
||||||
{
|
|
||||||
temp=ReadJoyPort(joystick->index^1); // fix to invert amiga joyports
|
|
||||||
WaitTOF();
|
|
||||||
}
|
|
||||||
|
|
||||||
if((temp&JP_TYPE_MASK)==JP_TYPE_GAMECTLR)
|
|
||||||
joystick->nbuttons=7;
|
|
||||||
else
|
|
||||||
joystick->nbuttons=3;
|
|
||||||
|
|
||||||
joystick->nhats=0;
|
|
||||||
joystick->nballs=0;
|
|
||||||
joystick->naxes=2;
|
|
||||||
joystick->hwdata->joystate=0L;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function to update the state of a joystick - called as a device poll.
|
|
||||||
* This function shouldn't update the joystick structure directly,
|
|
||||||
* but instead should call SDL_PrivateJoystick*() to deliver events
|
|
||||||
* and update joystick device state.
|
|
||||||
*/
|
|
||||||
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
|
|
||||||
{
|
|
||||||
ULONG data;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(joystick->index<2)
|
|
||||||
{
|
|
||||||
data=ReadJoyPort(joystick->index);
|
|
||||||
|
|
||||||
if(data&JP_DIRECTION_MASK)
|
|
||||||
{
|
|
||||||
if(data&JPF_JOY_DOWN)
|
|
||||||
{
|
|
||||||
if(!(joystick->hwdata->joystate&JPF_JOY_DOWN))
|
|
||||||
SDL_PrivateJoystickAxis(joystick,0,127);
|
|
||||||
}
|
|
||||||
else if(data&JPF_JOY_UP)
|
|
||||||
{
|
|
||||||
if(!(joystick->hwdata->joystate&JPF_JOY_UP))
|
|
||||||
SDL_PrivateJoystickAxis(joystick,0,-127);
|
|
||||||
}
|
|
||||||
else if(joystick->hwdata->joystate&(JPF_JOY_UP|JPF_JOY_DOWN))
|
|
||||||
SDL_PrivateJoystickAxis(joystick,0,0);
|
|
||||||
|
|
||||||
if(data&JPF_JOY_LEFT)
|
|
||||||
{
|
|
||||||
if(!(joystick->hwdata->joystate&JPF_JOY_LEFT))
|
|
||||||
SDL_PrivateJoystickAxis(joystick,1,-127);
|
|
||||||
}
|
|
||||||
else if(data&JPF_JOY_RIGHT)
|
|
||||||
{
|
|
||||||
if(!(joystick->hwdata->joystate&JPF_JOY_RIGHT))
|
|
||||||
SDL_PrivateJoystickAxis(joystick,1,127);
|
|
||||||
}
|
|
||||||
else if(joystick->hwdata->joystate&(JPF_JOY_LEFT|JPF_JOY_RIGHT))
|
|
||||||
SDL_PrivateJoystickAxis(joystick,1,0);
|
|
||||||
}
|
|
||||||
else if(joystick->hwdata->joystate&(JPF_JOY_LEFT|JPF_JOY_RIGHT))
|
|
||||||
{
|
|
||||||
SDL_PrivateJoystickAxis(joystick,1,0);
|
|
||||||
}
|
|
||||||
else if(joystick->hwdata->joystate&(JPF_JOY_UP|JPF_JOY_DOWN))
|
|
||||||
{
|
|
||||||
SDL_PrivateJoystickAxis(joystick,0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0;i<joystick->nbuttons;i++)
|
|
||||||
{
|
|
||||||
if( (data&joybut[i]) )
|
|
||||||
{
|
|
||||||
if(i==1)
|
|
||||||
data&=(~(joybut[2]));
|
|
||||||
|
|
||||||
if(!(joystick->hwdata->joystate&joybut[i]))
|
|
||||||
SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED);
|
|
||||||
}
|
|
||||||
else if(joystick->hwdata->joystate&joybut[i])
|
|
||||||
SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED);
|
|
||||||
}
|
|
||||||
|
|
||||||
joystick->hwdata->joystate=data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function to close a joystick after use */
|
|
||||||
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
|
|
||||||
{
|
|
||||||
if(joystick->hwdata)
|
|
||||||
SDL_free(joystick->hwdata);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function to perform any system-specific joystick related cleanup */
|
|
||||||
|
|
||||||
void SDL_SYS_JoystickQuit(void)
|
|
||||||
{
|
|
||||||
if(LowLevelBase)
|
|
||||||
{
|
|
||||||
CloseLibrary(LowLevelBase);
|
|
||||||
LowLevelBase=NULL;
|
|
||||||
SDL_numjoysticks=0;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* SDL_JOYSTICK_AMIGA */
|
|
|
@ -123,6 +123,12 @@ struct joystick_hwdata {
|
||||||
struct report_desc *repdesc;
|
struct report_desc *repdesc;
|
||||||
struct report inreport;
|
struct report inreport;
|
||||||
int axis_map[JOYAXE_count]; /* map present JOYAXE_* to 0,1,..*/
|
int axis_map[JOYAXE_count]; /* map present JOYAXE_* to 0,1,..*/
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int xmin;
|
||||||
|
int ymin;
|
||||||
|
int xmax;
|
||||||
|
int ymax;
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *joynames[MAX_JOYS];
|
static char *joynames[MAX_JOYS];
|
||||||
|
@ -257,6 +263,12 @@ SDL_SYS_JoystickOpen(SDL_Joystick *joy)
|
||||||
joy->hwdata = hw;
|
joy->hwdata = hw;
|
||||||
hw->fd = fd;
|
hw->fd = fd;
|
||||||
hw->path = strdup(path);
|
hw->path = strdup(path);
|
||||||
|
hw->x = 0;
|
||||||
|
hw->y = 0;
|
||||||
|
hw->xmin = 0xffff;
|
||||||
|
hw->ymin = 0xffff;
|
||||||
|
hw->xmax = 0;
|
||||||
|
hw->ymax = 0;
|
||||||
if (! SDL_strncmp(path, "/dev/joy", 8)) {
|
if (! SDL_strncmp(path, "/dev/joy", 8)) {
|
||||||
hw->type = BSDJOY_JOY;
|
hw->type = BSDJOY_JOY;
|
||||||
joy->naxes = 2;
|
joy->naxes = 2;
|
||||||
|
@ -380,43 +392,42 @@ SDL_SYS_JoystickUpdate(SDL_Joystick *joy)
|
||||||
|
|
||||||
#if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
|
#if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
|
||||||
struct joystick gameport;
|
struct joystick gameport;
|
||||||
static int x, y, xmin = 0xffff, ymin = 0xffff, xmax = 0, ymax = 0;
|
|
||||||
|
|
||||||
if (joy->hwdata->type == BSDJOY_JOY) {
|
if (joy->hwdata->type == BSDJOY_JOY) {
|
||||||
if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
|
if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
|
||||||
return;
|
return;
|
||||||
if (abs(x - gameport.x) > 8) {
|
if (abs(joy->hwdata->x - gameport.x) > 8) {
|
||||||
x = gameport.x;
|
joy->hwdata->x = gameport.x;
|
||||||
if (x < xmin) {
|
if (joy->hwdata->x < joy->hwdata->xmin) {
|
||||||
xmin = x;
|
joy->hwdata->xmin = joy->hwdata->x;
|
||||||
}
|
}
|
||||||
if (x > xmax) {
|
if (joy->hwdata->x > joy->hwdata->xmax) {
|
||||||
xmax = x;
|
joy->hwdata->xmax = joy->hwdata->x;
|
||||||
}
|
}
|
||||||
if (xmin == xmax) {
|
if (joy->hwdata->xmin == joy->hwdata->xmax) {
|
||||||
xmin--;
|
joy->hwdata->xmin--;
|
||||||
xmax++;
|
joy->hwdata->xmax++;
|
||||||
}
|
}
|
||||||
v = (Sint32)x;
|
v = (Sint32)joy->hwdata->x;
|
||||||
v -= (xmax + xmin + 1)/2;
|
v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2;
|
||||||
v *= 32768/((xmax - xmin + 1)/2);
|
v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2);
|
||||||
SDL_PrivateJoystickAxis(joy, 0, v);
|
SDL_PrivateJoystickAxis(joy, 0, v);
|
||||||
}
|
}
|
||||||
if (abs(y - gameport.y) > 8) {
|
if (abs(joy->hwdata->y - gameport.y) > 8) {
|
||||||
y = gameport.y;
|
joy->hwdata->y = gameport.y;
|
||||||
if (y < ymin) {
|
if (joy->hwdata->y < joy->hwdata->ymin) {
|
||||||
ymin = y;
|
joy->hwdata->ymin = joy->hwdata->y;
|
||||||
}
|
}
|
||||||
if (y > ymax) {
|
if (joy->hwdata->y > joy->hwdata->ymax) {
|
||||||
ymax = y;
|
joy->hwdata->ymax = joy->hwdata->y;
|
||||||
}
|
}
|
||||||
if (ymin == ymax) {
|
if (joy->hwdata->ymin == joy->hwdata->ymax) {
|
||||||
ymin--;
|
joy->hwdata->ymin--;
|
||||||
ymax++;
|
joy->hwdata->ymax++;
|
||||||
}
|
}
|
||||||
v = (Sint32)y;
|
v = (Sint32)joy->hwdata->y;
|
||||||
v -= (ymax + ymin + 1)/2;
|
v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2;
|
||||||
v *= 32768/((ymax - ymin + 1)/2);
|
v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2);
|
||||||
SDL_PrivateJoystickAxis(joy, 1, v);
|
SDL_PrivateJoystickAxis(joy, 1, v);
|
||||||
}
|
}
|
||||||
if (gameport.b1 != joy->buttons[0]) {
|
if (gameport.b1 != joy->buttons[0]) {
|
||||||
|
|
|
@ -241,12 +241,10 @@ static void HIDGetElementInfo (CFTypeRef refElement, recElement *pElement)
|
||||||
pElement->cookie = (IOHIDElementCookie) number;
|
pElement->cookie = (IOHIDElementCookie) number;
|
||||||
refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementMinKey));
|
refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementMinKey));
|
||||||
if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
|
if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
|
||||||
pElement->min = number;
|
pElement->minReport = pElement->min = number;
|
||||||
pElement->maxReport = pElement->min;
|
|
||||||
refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementMaxKey));
|
refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementMaxKey));
|
||||||
if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
|
if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
|
||||||
pElement->max = number;
|
pElement->maxReport = pElement->max = number;
|
||||||
pElement->minReport = pElement->max;
|
|
||||||
/*
|
/*
|
||||||
TODO: maybe should handle the following stuff somehow?
|
TODO: maybe should handle the following stuff somehow?
|
||||||
|
|
||||||
|
@ -652,7 +650,8 @@ int SDL_SYS_JoystickInit(void)
|
||||||
/* Filter device list to non-keyboard/mouse stuff */
|
/* Filter device list to non-keyboard/mouse stuff */
|
||||||
if ( (device->usagePage != kHIDPage_GenericDesktop) ||
|
if ( (device->usagePage != kHIDPage_GenericDesktop) ||
|
||||||
((device->usage != kHIDUsage_GD_Joystick &&
|
((device->usage != kHIDUsage_GD_Joystick &&
|
||||||
device->usage != kHIDUsage_GD_GamePad)) ) {
|
device->usage != kHIDUsage_GD_GamePad &&
|
||||||
|
device->usage != kHIDUsage_GD_MultiAxisController)) ) {
|
||||||
|
|
||||||
/* release memory for the device */
|
/* release memory for the device */
|
||||||
HIDDisposeDevice (&device);
|
HIDDisposeDevice (&device);
|
||||||
|
|
|
@ -50,6 +50,7 @@ static struct {
|
||||||
{ "SideWinder Precision Pro", 4, 1, 0 },
|
{ "SideWinder Precision Pro", 4, 1, 0 },
|
||||||
{ "SideWinder 3D Pro", 4, 1, 0 },
|
{ "SideWinder 3D Pro", 4, 1, 0 },
|
||||||
{ "Microsoft SideWinder 3D Pro", 4, 1, 0 },
|
{ "Microsoft SideWinder 3D Pro", 4, 1, 0 },
|
||||||
|
{ "Microsoft SideWinder Precision Pro", 4, 1, 0 },
|
||||||
{ "Microsoft SideWinder Dual Strike USB version 1.0", 2, 1, 0 },
|
{ "Microsoft SideWinder Dual Strike USB version 1.0", 2, 1, 0 },
|
||||||
{ "WingMan Interceptor", 3, 3, 0 },
|
{ "WingMan Interceptor", 3, 3, 0 },
|
||||||
{ "WingMan Extreme Digital 3D", 4, 1, 0 },
|
{ "WingMan Extreme Digital 3D", 4, 1, 0 },
|
||||||
|
|
|
@ -45,18 +45,27 @@
|
||||||
/* We can have:
|
/* We can have:
|
||||||
1 joystick on IKBD port 1, read via hardware I/O
|
1 joystick on IKBD port 1, read via hardware I/O
|
||||||
or same joystick on IKBD port 1, read via xbios
|
or same joystick on IKBD port 1, read via xbios
|
||||||
2 joypads on ports A,B
|
1 joypad on port A (up to 4 with teamtap)
|
||||||
or 4 joysticks on joypads ports A,B
|
or 2 joysticks on joypad port A
|
||||||
|
or 1 analog paddle on joypad port A
|
||||||
or 1 lightpen on joypad port A
|
or 1 lightpen on joypad port A
|
||||||
or 2 analog paddles on joypads ports A,B
|
1 joypad on port B (up to 4 with teamtap)
|
||||||
|
or 2 joysticks on joypad port B
|
||||||
|
or 1 analog paddle on joypad port B
|
||||||
2 joysticks on parallel port
|
2 joysticks on parallel port
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
IKBD_JOY1=0,
|
IKBD_JOY1=0,
|
||||||
XBIOS_JOY1,
|
XBIOS_JOY1,
|
||||||
PORTA_PAD,
|
PORTA_PAD0,
|
||||||
PORTB_PAD,
|
PORTA_PAD1,
|
||||||
|
PORTA_PAD2,
|
||||||
|
PORTA_PAD3,
|
||||||
|
PORTB_PAD0,
|
||||||
|
PORTB_PAD1,
|
||||||
|
PORTB_PAD2,
|
||||||
|
PORTB_PAD3,
|
||||||
PORTA_JOY0,
|
PORTA_JOY0,
|
||||||
PORTA_JOY1,
|
PORTA_JOY1,
|
||||||
PORTB_JOY0,
|
PORTB_JOY0,
|
||||||
|
@ -116,8 +125,14 @@ typedef struct {
|
||||||
static atarijoy_t atarijoysticks[MAX_JOYSTICKS]={
|
static atarijoy_t atarijoysticks[MAX_JOYSTICKS]={
|
||||||
{SDL_FALSE,"IKBD joystick port 1",0},
|
{SDL_FALSE,"IKBD joystick port 1",0},
|
||||||
{SDL_FALSE,"Xbios joystick port 1",0},
|
{SDL_FALSE,"Xbios joystick port 1",0},
|
||||||
{SDL_FALSE,"Joypad port A",0},
|
{SDL_FALSE,"Joypad 0 port A",0},
|
||||||
{SDL_FALSE,"Joypad port B",0},
|
{SDL_FALSE,"Joypad 1 port A",0},
|
||||||
|
{SDL_FALSE,"Joypad 2 port A",0},
|
||||||
|
{SDL_FALSE,"Joypad 3 port A",0},
|
||||||
|
{SDL_FALSE,"Joypad 0 port B",0},
|
||||||
|
{SDL_FALSE,"Joypad 1 port B",0},
|
||||||
|
{SDL_FALSE,"Joypad 2 port B",0},
|
||||||
|
{SDL_FALSE,"Joypad 3 port B",0},
|
||||||
{SDL_FALSE,"Joystick 0 port A",0},
|
{SDL_FALSE,"Joystick 0 port A",0},
|
||||||
{SDL_FALSE,"Joystick 1 port A",0},
|
{SDL_FALSE,"Joystick 1 port A",0},
|
||||||
{SDL_FALSE,"Joystick 0 port B",0},
|
{SDL_FALSE,"Joystick 0 port B",0},
|
||||||
|
@ -146,7 +161,7 @@ static Uint16 jp_paddles[4];
|
||||||
static Uint16 jp_lightpens[2];
|
static Uint16 jp_lightpens[2];
|
||||||
static Uint16 jp_directions;
|
static Uint16 jp_directions;
|
||||||
static Uint16 jp_fires;
|
static Uint16 jp_fires;
|
||||||
static Uint32 jp_joypads[2];
|
static Uint32 jp_joypads[8];
|
||||||
|
|
||||||
/*--- Functions prototypes ---*/
|
/*--- Functions prototypes ---*/
|
||||||
|
|
||||||
|
@ -181,8 +196,14 @@ int SDL_SYS_JoystickInit(void)
|
||||||
atarijoysticks[IKBD_JOY1].enabled=(SDL_AtariIkbd_enabled!=0);
|
atarijoysticks[IKBD_JOY1].enabled=(SDL_AtariIkbd_enabled!=0);
|
||||||
}
|
}
|
||||||
if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) {
|
if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) {
|
||||||
atarijoysticks[PORTA_PAD].enabled=SDL_TRUE;
|
atarijoysticks[PORTA_PAD0].enabled =
|
||||||
atarijoysticks[PORTB_PAD].enabled=SDL_TRUE;
|
atarijoysticks[PORTA_PAD1].enabled =
|
||||||
|
atarijoysticks[PORTA_PAD2].enabled =
|
||||||
|
atarijoysticks[PORTA_PAD3].enabled =
|
||||||
|
atarijoysticks[PORTB_PAD0].enabled =
|
||||||
|
atarijoysticks[PORTB_PAD1].enabled =
|
||||||
|
atarijoysticks[PORTB_PAD2].enabled =
|
||||||
|
atarijoysticks[PORTB_PAD3].enabled = SDL_TRUE;
|
||||||
}
|
}
|
||||||
if (!atarijoysticks[IKBD_JOY1].enabled) {
|
if (!atarijoysticks[IKBD_JOY1].enabled) {
|
||||||
atarijoysticks[XBIOS_JOY1].enabled=(SDL_AtariXbios_enabled!=0);
|
atarijoysticks[XBIOS_JOY1].enabled=(SDL_AtariXbios_enabled!=0);
|
||||||
|
@ -200,8 +221,8 @@ int SDL_SYS_JoystickInit(void)
|
||||||
}
|
}
|
||||||
/* Joypads ports only on STE and Falcon */
|
/* Joypads ports only on STE and Falcon */
|
||||||
if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) {
|
if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) {
|
||||||
TEST_JOY_ENABLED(envr, "porta-pad", PORTA_PAD);
|
TEST_JOY_ENABLED(envr, "porta-pad", PORTA_PAD0);
|
||||||
if (!atarijoysticks[PORTA_PAD].enabled) {
|
if (!atarijoysticks[PORTA_PAD0].enabled) {
|
||||||
TEST_JOY_ENABLED(envr, "porta-joy0", PORTA_JOY0);
|
TEST_JOY_ENABLED(envr, "porta-joy0", PORTA_JOY0);
|
||||||
TEST_JOY_ENABLED(envr, "porta-joy1", PORTA_JOY1);
|
TEST_JOY_ENABLED(envr, "porta-joy1", PORTA_JOY1);
|
||||||
if (!(atarijoysticks[PORTA_JOY0].enabled) && !(atarijoysticks[PORTA_JOY1].enabled)) {
|
if (!(atarijoysticks[PORTA_JOY0].enabled) && !(atarijoysticks[PORTA_JOY1].enabled)) {
|
||||||
|
@ -212,8 +233,8 @@ int SDL_SYS_JoystickInit(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_JOY_ENABLED(envr, "portb-pad", PORTB_PAD);
|
TEST_JOY_ENABLED(envr, "portb-pad", PORTB_PAD0);
|
||||||
if (!atarijoysticks[PORTB_PAD].enabled) {
|
if (!atarijoysticks[PORTB_PAD0].enabled) {
|
||||||
TEST_JOY_ENABLED(envr, "portb-joy0", PORTB_JOY0);
|
TEST_JOY_ENABLED(envr, "portb-joy0", PORTB_JOY0);
|
||||||
TEST_JOY_ENABLED(envr, "portb-joy1", PORTB_JOY1);
|
TEST_JOY_ENABLED(envr, "portb-joy1", PORTB_JOY1);
|
||||||
if (!(atarijoysticks[PORTB_JOY0].enabled) && !(atarijoysticks[PORTB_JOY1].enabled)) {
|
if (!(atarijoysticks[PORTB_JOY0].enabled) && !(atarijoysticks[PORTB_JOY1].enabled)) {
|
||||||
|
@ -239,7 +260,7 @@ int SDL_SYS_JoystickInit(void)
|
||||||
|
|
||||||
/* Need to update joypad ports ? */
|
/* Need to update joypad ports ? */
|
||||||
joypad_ports_enabled=SDL_FALSE;
|
joypad_ports_enabled=SDL_FALSE;
|
||||||
for (i=PORTA_PAD;i<=PORTB_ANPAD;i++) {
|
for (i=PORTA_PAD0;i<=PORTB_ANPAD;i++) {
|
||||||
if (atarijoysticks[i].enabled) {
|
if (atarijoysticks[i].enabled) {
|
||||||
joypad_ports_enabled=SDL_TRUE;
|
joypad_ports_enabled=SDL_TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -303,8 +324,14 @@ int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
|
||||||
joystick->nballs=0;
|
joystick->nballs=0;
|
||||||
|
|
||||||
switch(numjoystick) {
|
switch(numjoystick) {
|
||||||
case PORTA_PAD:
|
case PORTA_PAD0:
|
||||||
case PORTB_PAD:
|
case PORTA_PAD1:
|
||||||
|
case PORTA_PAD2:
|
||||||
|
case PORTA_PAD3:
|
||||||
|
case PORTB_PAD0:
|
||||||
|
case PORTB_PAD1:
|
||||||
|
case PORTB_PAD2:
|
||||||
|
case PORTB_PAD3:
|
||||||
joystick->nhats=1;
|
joystick->nhats=1;
|
||||||
joystick->nbuttons=JP_NUM_BUTTONS;
|
joystick->nbuttons=JP_NUM_BUTTONS;
|
||||||
break;
|
break;
|
||||||
|
@ -379,13 +406,36 @@ void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
|
||||||
atarijoysticks[numjoystick].prevstate = curstate;
|
atarijoysticks[numjoystick].prevstate = curstate;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PORTA_PAD:
|
case PORTA_PAD0:
|
||||||
case PORTB_PAD:
|
case PORTA_PAD1:
|
||||||
|
case PORTA_PAD2:
|
||||||
|
case PORTA_PAD3:
|
||||||
|
case PORTB_PAD0:
|
||||||
|
case PORTB_PAD1:
|
||||||
|
case PORTB_PAD2:
|
||||||
|
case PORTB_PAD3:
|
||||||
{
|
{
|
||||||
int numjoypad,i;
|
int numjoypad,i;
|
||||||
|
|
||||||
numjoypad = 0;
|
numjoypad = 0;
|
||||||
if (numjoystick==PORTB_PAD) numjoypad=1;
|
switch(numjoystick) {
|
||||||
|
case PORTA_PAD0:
|
||||||
|
numjoypad = 0; break;
|
||||||
|
case PORTA_PAD1:
|
||||||
|
numjoypad = 1; break;
|
||||||
|
case PORTA_PAD2:
|
||||||
|
numjoypad = 2; break;
|
||||||
|
case PORTA_PAD3:
|
||||||
|
numjoypad = 3; break;
|
||||||
|
case PORTB_PAD0:
|
||||||
|
numjoypad = 4; break;
|
||||||
|
case PORTB_PAD1:
|
||||||
|
numjoypad = 5; break;
|
||||||
|
case PORTB_PAD2:
|
||||||
|
numjoypad = 6; break;
|
||||||
|
case PORTB_PAD3:
|
||||||
|
numjoypad = 7; break;
|
||||||
|
}
|
||||||
|
|
||||||
curstate=jp_joypads[numjoypad];
|
curstate=jp_joypads[numjoypad];
|
||||||
if (curstate!=prevstate) {
|
if (curstate!=prevstate) {
|
||||||
|
@ -561,9 +611,21 @@ struct JOYPAD_IO_S {
|
||||||
};
|
};
|
||||||
#define JOYPAD_IO ((*(volatile struct JOYPAD_IO_S *)JOYPAD_IO_BASE))
|
#define JOYPAD_IO ((*(volatile struct JOYPAD_IO_S *)JOYPAD_IO_BASE))
|
||||||
|
|
||||||
|
static const Uint16 joypad_masks[8*4]={
|
||||||
|
0xfffe, 0xfffd, 0xfffb, 0xfff7,
|
||||||
|
0xfff0, 0xfff1, 0xfff2, 0xfff3,
|
||||||
|
0xfff4, 0xfff5, 0xfff6, 0xfff8,
|
||||||
|
0xfff9, 0xfffa, 0xfffc, 0xffff,
|
||||||
|
0xffef, 0xffdf, 0xffbf, 0xff7f,
|
||||||
|
0xff0f, 0xff1f, 0xff2f, 0xff3f,
|
||||||
|
0xff4f, 0xff5f, 0xff6f, 0xff8f,
|
||||||
|
0xff9f, 0xffaf, 0xffcf, 0xffff
|
||||||
|
};
|
||||||
|
|
||||||
static void UpdateJoypads(void)
|
static void UpdateJoypads(void)
|
||||||
{
|
{
|
||||||
Uint16 tmp;
|
Uint16 tmp, i, j;
|
||||||
|
Uint32 cur_fire, cur_dir;
|
||||||
|
|
||||||
/*--- This function is called in supervisor mode ---*/
|
/*--- This function is called in supervisor mode ---*/
|
||||||
|
|
||||||
|
@ -587,47 +649,35 @@ static void UpdateJoypads(void)
|
||||||
tmp = (JOYPAD_IO.paddles[3] & 255);
|
tmp = (JOYPAD_IO.paddles[3] & 255);
|
||||||
jp_paddles[3] = (tmp<<8) | tmp;
|
jp_paddles[3] = (tmp<<8) | tmp;
|
||||||
|
|
||||||
/* Update joypad 0 */
|
/* Update joypads on teamtap port A */
|
||||||
JOYPAD_IO.directions=0xfffe;
|
for (i=0; i<4; i++) {
|
||||||
jp_joypads[0]=((~(JOYPAD_IO.fires)) & 3)<<(16);
|
jp_joypads[i] = 0;
|
||||||
JOYPAD_IO.directions=0xfffe;
|
for (j=0; j<4; j++) {
|
||||||
jp_joypads[0] |= ((~(JOYPAD_IO.directions))>>8) & 15;
|
JOYPAD_IO.directions = joypad_masks[(i*4)+j];
|
||||||
|
|
||||||
JOYPAD_IO.directions=0xfffd;
|
cur_fire = (~(JOYPAD_IO.fires) & 3)<<16;
|
||||||
jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+2);
|
cur_dir = (~(JOYPAD_IO.directions)>>8) & 15;
|
||||||
JOYPAD_IO.directions=0xfffd;
|
|
||||||
jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<4;
|
|
||||||
|
|
||||||
JOYPAD_IO.directions=0xfffb;
|
jp_joypads[i] |= cur_fire<<(j*2);
|
||||||
jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+4);
|
jp_joypads[i] |= cur_dir<<(j*4);
|
||||||
JOYPAD_IO.directions=0xfffb;
|
}
|
||||||
jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<8;
|
}
|
||||||
|
|
||||||
JOYPAD_IO.directions=0xfff7;
|
/* Update joypads on teamtap port B */
|
||||||
jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+6);
|
for (i=4; i<8; i++) {
|
||||||
JOYPAD_IO.directions=0xfff7;
|
jp_joypads[i] = 0;
|
||||||
jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<12;
|
for (j=0; j<4; j++) {
|
||||||
|
JOYPAD_IO.directions = joypad_masks[(i*4)+j];
|
||||||
|
|
||||||
/* Update joypad 1 */
|
cur_fire = (~(JOYPAD_IO.fires) & 0xc)<<14;
|
||||||
JOYPAD_IO.directions=0xffef;
|
cur_dir = (~(JOYPAD_IO.directions)>>12) & 15;
|
||||||
jp_joypads[1]=((~(JOYPAD_IO.fires)) & (3<<2))<<(16-2);
|
|
||||||
JOYPAD_IO.directions=0xffef;
|
|
||||||
jp_joypads[1] |= ((~(JOYPAD_IO.directions))>>12) & 15;
|
|
||||||
|
|
||||||
JOYPAD_IO.directions=0xffdf;
|
jp_joypads[i] |= cur_fire<<(j*2);
|
||||||
jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16);
|
jp_joypads[i] |= cur_dir<<(j*4);
|
||||||
JOYPAD_IO.directions=0xffdf;
|
}
|
||||||
jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<4;
|
}
|
||||||
|
|
||||||
JOYPAD_IO.directions=0xffbf;
|
JOYPAD_IO.directions=0xffff;
|
||||||
jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16+2);
|
|
||||||
JOYPAD_IO.directions=0xffbf;
|
|
||||||
jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<8;
|
|
||||||
|
|
||||||
JOYPAD_IO.directions=0xff7f;
|
|
||||||
jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16+4);
|
|
||||||
JOYPAD_IO.directions=0xff7f;
|
|
||||||
jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<12;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* SDL_JOYSTICK_MINT */
|
#endif /* SDL_JOYSTICK_MINT */
|
||||||
|
|
150
src/joystick/nds/SDL_sysjoystick.c
Normal file
150
src/joystick/nds/SDL_sysjoystick.c
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2006 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* This is the system specific header for the SDL joystick API */
|
||||||
|
#include <nds.h>
|
||||||
|
//#include <nds/registers_alt.h>
|
||||||
|
|
||||||
|
#include "SDL_error.h"
|
||||||
|
#include "SDL_events.h"
|
||||||
|
#include "SDL_joystick.h"
|
||||||
|
#include "../SDL_sysjoystick.h"
|
||||||
|
#include "../SDL_joystick_c.h"
|
||||||
|
|
||||||
|
#include "../../video/nds/SDL_ndsevents_c.h"
|
||||||
|
|
||||||
|
/* Function to scan the system for joysticks.
|
||||||
|
* This function should set SDL_numjoysticks to the number of available
|
||||||
|
* joysticks. Joystick 0 should be the system default joystick.
|
||||||
|
* It should return 0, or -1 on an unrecoverable fatal error.
|
||||||
|
*/
|
||||||
|
int SDL_SYS_JoystickInit(void)
|
||||||
|
{
|
||||||
|
SDL_numjoysticks = 1;
|
||||||
|
//keysInit();
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to get the device-dependent name of a joystick */
|
||||||
|
const char *SDL_SYS_JoystickName(int index)
|
||||||
|
{
|
||||||
|
if(!index)
|
||||||
|
return "NDS builtin joypad";
|
||||||
|
SDL_SetError("No joystick available with that index");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to open a joystick for use.
|
||||||
|
The joystick to open is specified by the index field of the joystick.
|
||||||
|
This should fill the nbuttons and naxes fields of the joystick structure.
|
||||||
|
It returns 0, or -1 if there is an error.
|
||||||
|
*/
|
||||||
|
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
joystick->nbuttons=8;
|
||||||
|
joystick->nhats=0;
|
||||||
|
joystick->nballs=0;
|
||||||
|
joystick->naxes=2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Function to update the state of a joystick - called as a device poll.
|
||||||
|
* This function shouldn't update the joystick structure directly,
|
||||||
|
* but instead should call SDL_PrivateJoystick*() to deliver events
|
||||||
|
* and update joystick device state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int prevbutton=0;
|
||||||
|
int prevkey=0;
|
||||||
|
|
||||||
|
int dc=0;int ldc=0;
|
||||||
|
u32 keysd,keysu=0;
|
||||||
|
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
//dc=keysd;
|
||||||
|
//if (dc)
|
||||||
|
//{
|
||||||
|
//fprintf(stderr,"heartbeat= %d\n",REG_VCOUNT);
|
||||||
|
//swiWaitForVBlank();
|
||||||
|
//scanKeys();
|
||||||
|
//keysd = keysDown();
|
||||||
|
//keysu = keysUp();
|
||||||
|
//ldc=keysd;
|
||||||
|
|
||||||
|
//}
|
||||||
|
/*if (prevkey && prevbutton)
|
||||||
|
{
|
||||||
|
scanKeys();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//scanKeys();
|
||||||
|
keysd = keysDown();
|
||||||
|
keysu = keysUp();
|
||||||
|
|
||||||
|
|
||||||
|
short ax=0,v=0,h=0;
|
||||||
|
if((keysd&KEY_UP)) {ax=1;v=-10;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=KEY_UP;}//fprintf(stderr,"KEY_UP\n");}
|
||||||
|
if((keysd&KEY_DOWN)) {ax=1;v=10;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=KEY_DOWN;}//fprintf(stderr,"KEY_DOWN\n");}
|
||||||
|
if((keysd&KEY_LEFT)) {ax=0;h=-10;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=KEY_LEFT;}//fprintf(stderr,"KEY_LEFT\n");}
|
||||||
|
if((keysd&KEY_RIGHT)) {ax=0;h=10;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=KEY_RIGHT;}//fprintf(stderr,"KEY_RIGHT\n");}
|
||||||
|
|
||||||
|
if((keysu&KEY_UP)) {ax=1;v=0;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=0;}//fprintf(stderr,"KEY_UP\n");}
|
||||||
|
if((keysu&KEY_DOWN)) {ax=1;v=0;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=0;}//fprintf(stderr,"KEY_DOWN\n");}
|
||||||
|
if((keysu&KEY_LEFT)) {ax=0;h=0;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=0;}//fprintf(stderr,"KEY_LEFT\n");}
|
||||||
|
if((keysu&KEY_RIGHT)) {ax=0;h=0;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=0;}//fprintf(stderr,"KEY_RIGHT\n");}
|
||||||
|
|
||||||
|
if((keysd&KEY_A)) {SDL_PrivateJoystickButton(joystick,0,SDL_PRESSED);prevbutton=KEY_A;}
|
||||||
|
if((keysd&KEY_B)) {SDL_PrivateJoystickButton(joystick,1,SDL_PRESSED);prevbutton=KEY_B;}
|
||||||
|
if((keysd&KEY_X)) {SDL_PrivateJoystickButton(joystick,2,SDL_PRESSED);prevbutton=KEY_X;}
|
||||||
|
if((keysd&KEY_Y)) {SDL_PrivateJoystickButton(joystick,3,SDL_PRESSED);prevbutton=KEY_Y;}
|
||||||
|
if((keysd&KEY_SELECT)) {SDL_PrivateJoystickButton(joystick,6,SDL_PRESSED);prevbutton=KEY_SELECT;}
|
||||||
|
if((keysd&KEY_START)) {SDL_PrivateJoystickButton(joystick,7,SDL_PRESSED);prevbutton=KEY_START;}
|
||||||
|
if((keysd&KEY_L)) {SDL_PrivateJoystickButton(joystick,4,SDL_PRESSED);prevbutton=KEY_L;}
|
||||||
|
if((keysd&KEY_R)) {SDL_PrivateJoystickButton(joystick,5,SDL_PRESSED);prevbutton=KEY_R;}
|
||||||
|
|
||||||
|
if((keysu&KEY_A)) {SDL_PrivateJoystickButton(joystick,0,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_B)) {SDL_PrivateJoystickButton(joystick,1,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_X)) {SDL_PrivateJoystickButton(joystick,2,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_Y)) {SDL_PrivateJoystickButton(joystick,3,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_SELECT)) {SDL_PrivateJoystickButton(joystick,6,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_START)) {SDL_PrivateJoystickButton(joystick,7,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_L)) {SDL_PrivateJoystickButton(joystick,4,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_R)) {SDL_PrivateJoystickButton(joystick,5,SDL_RELEASED);prevbutton=0;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to close a joystick after use */
|
||||||
|
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to perform any system-specific joystick related cleanup */
|
||||||
|
void SDL_SYS_JoystickQuit(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
|
@ -76,67 +76,58 @@ static char *GetJoystickName(int index, const char *szRegKey)
|
||||||
index (1-16) listed in the registry
|
index (1-16) listed in the registry
|
||||||
*/
|
*/
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
|
HKEY hTopKey;
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
DWORD regsize;
|
DWORD regsize;
|
||||||
LONG regresult;
|
LONG regresult;
|
||||||
unsigned char regkey[256];
|
char regkey[256];
|
||||||
unsigned char regvalue[256];
|
char regvalue[256];
|
||||||
unsigned char regname[256];
|
char regname[256];
|
||||||
|
|
||||||
SDL_snprintf((char *) regkey, SDL_arraysize(regkey), "%s\\%s\\%s",
|
SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s\\%s",
|
||||||
REGSTR_PATH_JOYCONFIG,
|
REGSTR_PATH_JOYCONFIG, szRegKey, REGSTR_KEY_JOYCURR);
|
||||||
szRegKey,
|
hTopKey = HKEY_LOCAL_MACHINE;
|
||||||
REGSTR_KEY_JOYCURR);
|
regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
|
||||||
regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
|
if (regresult != ERROR_SUCCESS) {
|
||||||
(LPTSTR) ®key, 0, KEY_READ, &hKey);
|
hTopKey = HKEY_CURRENT_USER;
|
||||||
if (regresult == ERROR_SUCCESS)
|
regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
|
||||||
{
|
}
|
||||||
/*
|
if (regresult != ERROR_SUCCESS) {
|
||||||
find the registry key name for the
|
return NULL;
|
||||||
joystick's properties
|
}
|
||||||
*/
|
|
||||||
|
/* find the registry key name for the joystick's properties */
|
||||||
regsize = sizeof(regname);
|
regsize = sizeof(regname);
|
||||||
SDL_snprintf((char *) regvalue, SDL_arraysize(regvalue),
|
SDL_snprintf(regvalue, SDL_arraysize(regvalue), "Joystick%d%s", index+1, REGSTR_VAL_JOYOEMNAME);
|
||||||
"Joystick%d%s", index+1,
|
regresult = RegQueryValueExA(hKey, regvalue, 0, 0, (LPBYTE)regname, ®size);
|
||||||
REGSTR_VAL_JOYOEMNAME);
|
|
||||||
regresult = RegQueryValueExA(hKey,
|
|
||||||
(char *) regvalue, 0, 0, (LPBYTE) ®name,
|
|
||||||
(LPDWORD) ®size);
|
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
if (regresult == ERROR_SUCCESS)
|
|
||||||
{
|
if (regresult != ERROR_SUCCESS) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* open that registry key */
|
/* open that registry key */
|
||||||
SDL_snprintf((char *) regkey, SDL_arraysize(regkey), "%s\\%s",
|
SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s", REGSTR_PATH_JOYOEM, regname);
|
||||||
REGSTR_PATH_JOYOEM, regname);
|
regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
|
||||||
regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
|
if (regresult != ERROR_SUCCESS) {
|
||||||
(char *) regkey, 0, KEY_READ, &hKey);
|
return NULL;
|
||||||
if (regresult == ERROR_SUCCESS)
|
}
|
||||||
{
|
|
||||||
/* find the size for the OEM name text */
|
/* find the size for the OEM name text */
|
||||||
regsize = sizeof(regvalue);
|
regsize = sizeof(regvalue);
|
||||||
regresult =
|
regresult = RegQueryValueExA(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, NULL, ®size);
|
||||||
RegQueryValueExA(hKey,
|
if (regresult == ERROR_SUCCESS) {
|
||||||
REGSTR_VAL_JOYOEMNAME,
|
/* allocate enough memory for the OEM name text ... */
|
||||||
0, 0, NULL,
|
|
||||||
(LPDWORD) ®size);
|
|
||||||
if (regresult == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
allocate enough memory
|
|
||||||
for the OEM name text ...
|
|
||||||
*/
|
|
||||||
name = (char *) SDL_malloc(regsize);
|
name = (char *) SDL_malloc(regsize);
|
||||||
|
if ( name ) {
|
||||||
/* ... and read it from the registry */
|
/* ... and read it from the registry */
|
||||||
regresult =
|
regresult = RegQueryValueExA(hKey,
|
||||||
RegQueryValueExA(hKey,
|
|
||||||
REGSTR_VAL_JOYOEMNAME, 0, 0,
|
REGSTR_VAL_JOYOEMNAME, 0, 0,
|
||||||
(LPBYTE) name,
|
(LPBYTE) name, ®size);
|
||||||
(LPDWORD) ®size);
|
}
|
||||||
|
}
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(name);
|
return(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +158,7 @@ int SDL_SYS_JoystickInit(void)
|
||||||
|
|
||||||
joyinfo.dwSize = sizeof(joyinfo);
|
joyinfo.dwSize = sizeof(joyinfo);
|
||||||
joyinfo.dwFlags = JOY_RETURNALL;
|
joyinfo.dwFlags = JOY_RETURNALL;
|
||||||
result = joyGetPosEx(SYS_JoystickID[i], &joyinfo);
|
result = joyGetPosEx(i, &joyinfo);
|
||||||
if ( result == JOYERR_NOERROR ) {
|
if ( result == JOYERR_NOERROR ) {
|
||||||
result = joyGetDevCaps(i, &joycaps, sizeof(joycaps));
|
result = joyGetDevCaps(i, &joycaps, sizeof(joycaps));
|
||||||
if ( result == JOYERR_NOERROR ) {
|
if ( result == JOYERR_NOERROR ) {
|
||||||
|
|
|
@ -31,40 +31,33 @@
|
||||||
|
|
||||||
#include "SDL_loadso.h"
|
#include "SDL_loadso.h"
|
||||||
|
|
||||||
void *SDL_LoadObject(const char *sofile)
|
void *
|
||||||
|
SDL_LoadObject(const char *sofile)
|
||||||
{
|
{
|
||||||
void *handle = NULL;
|
void *handle = NULL;
|
||||||
const char *loaderror = "Unknown error";
|
|
||||||
image_id library_id = load_add_on(sofile);
|
image_id library_id = load_add_on(sofile);
|
||||||
if ( library_id == B_ERROR ) {
|
if (library_id < 0) {
|
||||||
loaderror = "BeOS error";
|
SDL_SetError(strerror((int) library_id));
|
||||||
} else {
|
} else {
|
||||||
handle = (void *) (library_id);
|
handle = (void *) (library_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( handle == NULL ) {
|
|
||||||
SDL_SetError("Failed loading %s: %s", sofile, loaderror);
|
|
||||||
}
|
|
||||||
return (handle);
|
return (handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *SDL_LoadFunction(void *handle, const char *name)
|
void *
|
||||||
|
SDL_LoadFunction(void *handle, const char *name)
|
||||||
{
|
{
|
||||||
void *symbol = NULL;
|
void *sym = NULL;
|
||||||
const char *loaderror = "Unknown error";
|
|
||||||
image_id library_id = (image_id) handle;
|
image_id library_id = (image_id) handle;
|
||||||
if ( get_image_symbol(library_id,
|
status_t rc = get_image_symbol(library_id, name, B_SYMBOL_TYPE_TEXT, &sym);
|
||||||
name, B_SYMBOL_TYPE_TEXT, &symbol) != B_NO_ERROR ) {
|
if (rc != B_NO_ERROR) {
|
||||||
loaderror = "Symbol not found";
|
SDL_SetError(strerror(rc));
|
||||||
|
}
|
||||||
|
return (sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( symbol == NULL ) {
|
void
|
||||||
SDL_SetError("Failed loading %s: %s", name, loaderror);
|
SDL_UnloadObject(void *handle)
|
||||||
}
|
|
||||||
return(symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SDL_UnloadObject(void *handle)
|
|
||||||
{
|
{
|
||||||
image_id library_id;
|
image_id library_id;
|
||||||
if (handle != NULL) {
|
if (handle != NULL) {
|
||||||
|
@ -74,3 +67,6 @@ void SDL_UnloadObject(void *handle)
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* SDL_LOADSO_BEOS */
|
#endif /* SDL_LOADSO_BEOS */
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
||||||
|
|
|
@ -45,11 +45,12 @@ void *SDL_LoadFunction(void *handle, const char *name)
|
||||||
{
|
{
|
||||||
void *symbol = dlsym(handle, name);
|
void *symbol = dlsym(handle, name);
|
||||||
if ( symbol == NULL ) {
|
if ( symbol == NULL ) {
|
||||||
|
/* append an underscore for platforms that need that. */
|
||||||
size_t len = 1+SDL_strlen(name)+1;
|
size_t len = 1+SDL_strlen(name)+1;
|
||||||
char *_name = SDL_stack_alloc(char, len);
|
char *_name = SDL_stack_alloc(char, len);
|
||||||
_name[0] = '_';
|
_name[0] = '_';
|
||||||
SDL_strlcpy(&_name[1], name, len);
|
SDL_strlcpy(&_name[1], name, len);
|
||||||
symbol = dlsym(handle, name);
|
symbol = dlsym(handle, _name);
|
||||||
SDL_stack_free(_name);
|
SDL_stack_free(_name);
|
||||||
if ( symbol == NULL ) {
|
if ( symbol == NULL ) {
|
||||||
SDL_SetError("Failed loading %s: %s", name, (const char *)dlerror());
|
SDL_SetError("Failed loading %s: %s", name, (const char *)dlerror());
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
SDL - Simple DirectMedia Layer
|
SDL - Simple DirectMedia Layer
|
||||||
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
|
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public
|
modify it under the terms of the GNU Library General Public
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
Sam Lantinga
|
Sam Lantinga
|
||||||
slouken@libsdl.org
|
slouken@devolution.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -39,17 +39,6 @@
|
||||||
|
|
||||||
#include "SDL_error.h"
|
#include "SDL_error.h"
|
||||||
|
|
||||||
#ifndef EXPORT_C
|
|
||||||
# ifdef __VC32__
|
|
||||||
# define IMPORT_C __declspec(dllexport)
|
|
||||||
# define EXPORT_C __declspec(dllexport)
|
|
||||||
# endif
|
|
||||||
# ifdef __GCC32__
|
|
||||||
# define IMPORT_C
|
|
||||||
# define EXPORT_C __declspec(dllexport)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__WINS__)
|
#if defined(__WINS__)
|
||||||
#include <estw32.h>
|
#include <estw32.h>
|
||||||
IMPORT_C void RegisterWsExe(const TDesC &aName);
|
IMPORT_C void RegisterWsExe(const TDesC &aName);
|
||||||
|
@ -63,16 +52,33 @@ extern "C" void exit (int ret);
|
||||||
|
|
||||||
/* Epoc main function */
|
/* Epoc main function */
|
||||||
|
|
||||||
GLDEF_C TInt E32Main()
|
#ifdef __WINS__
|
||||||
|
|
||||||
|
|
||||||
|
void GetCmdLine(int& aArgc, char**& aArgv)
|
||||||
|
{
|
||||||
|
RChunk chunk;
|
||||||
|
|
||||||
|
if(chunk.OpenGlobal(RThread().Name(), ETrue) != KErrNone)
|
||||||
|
return;
|
||||||
|
|
||||||
|
TUint* ptr = (TUint*) chunk.Base();
|
||||||
|
if(ptr != NULL)
|
||||||
|
{
|
||||||
|
aArgc = (int) *(ptr); // count
|
||||||
|
aArgv = (char**) *(ptr + 1);
|
||||||
|
}
|
||||||
|
chunk.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
TInt E32Main()
|
||||||
{
|
{
|
||||||
/* Get the clean-up stack */
|
/* Get the clean-up stack */
|
||||||
CTrapCleanup* cleanup = CTrapCleanup::New();
|
CTrapCleanup* cleanup = CTrapCleanup::New();
|
||||||
|
|
||||||
#if defined(__WINS__)
|
|
||||||
/* arrange for access to Win32 stdin/stdout/stderr */
|
|
||||||
RWin32Stream::StartServer();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Arrange for multi-threaded operation */
|
/* Arrange for multi-threaded operation */
|
||||||
SpawnPosixServerThread();
|
SpawnPosixServerThread();
|
||||||
|
|
||||||
|
@ -80,25 +86,24 @@ GLDEF_C TInt E32Main()
|
||||||
int argc=0;
|
int argc=0;
|
||||||
char** argv=0;
|
char** argv=0;
|
||||||
char** envp=0;
|
char** envp=0;
|
||||||
|
|
||||||
|
#ifndef __WINS__
|
||||||
__crt0(argc,argv,envp);
|
__crt0(argc,argv,envp);
|
||||||
|
#else
|
||||||
#if defined(__WINS__)
|
GetCmdLine(argc, argv);
|
||||||
/* Cause the graphical Window Server to come into existence */
|
|
||||||
RSemaphore sem;
|
|
||||||
sem.CreateGlobal(_L("WsExeSem"),0);
|
|
||||||
RegisterWsExe(sem.FullName());
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Start the application! */
|
/* Start the application! */
|
||||||
|
|
||||||
/* Create stdlib */
|
/* Create stdlib */
|
||||||
_REENT;
|
_REENT;
|
||||||
|
|
||||||
/* Set process and thread priority */
|
/* Set process and thread priority and name */
|
||||||
RThread currentThread;
|
|
||||||
|
|
||||||
currentThread.Rename(_L("SdlProgram"));
|
RThread currentThread;
|
||||||
|
RProcess thisProcess;
|
||||||
|
TParse exeName;
|
||||||
|
exeName.Set(thisProcess.FileName(), NULL, NULL);
|
||||||
|
currentThread.Rename(exeName.Name());
|
||||||
currentThread.SetProcessPriority(EPriorityLow);
|
currentThread.SetProcessPriority(EPriorityLow);
|
||||||
currentThread.SetPriority(EPriorityMuchLess);
|
currentThread.SetPriority(EPriorityMuchLess);
|
||||||
|
|
||||||
|
@ -106,24 +111,42 @@ GLDEF_C TInt E32Main()
|
||||||
int ret = main(argc, argv, envp); /* !! process exits here if there is "exit()" in main! */
|
int ret = main(argc, argv, envp); /* !! process exits here if there is "exit()" in main! */
|
||||||
|
|
||||||
/* Call exit */
|
/* Call exit */
|
||||||
exit(ret); /* !! process exits here! */
|
//exit(ret); /* !! process exits here! */
|
||||||
|
//Markus: I do not understand above
|
||||||
|
//I commented it at let this function
|
||||||
|
//to return ret value - was it purpose
|
||||||
|
//that cleanup below is not called at all - why?
|
||||||
|
|
||||||
/* Free resources and return */
|
/* Free resources and return */
|
||||||
|
|
||||||
|
_cleanup(); //this is normally called at exit, I call it here, Markus
|
||||||
|
|
||||||
CloseSTDLIB();
|
CloseSTDLIB();
|
||||||
delete cleanup;
|
delete cleanup;
|
||||||
return(KErrNone);
|
#ifdef __WINS__
|
||||||
|
// User::Panic(_L("exit"), ret);
|
||||||
|
// RThread().Kill(ret); //Markus get rid of this thread
|
||||||
|
// RThread().RaiseException(EExcKill);
|
||||||
|
#endif
|
||||||
|
return ret;//Markus, or exit(ret); ??
|
||||||
|
//return(KErrNone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __WINS__
|
||||||
|
EXPORT_C TInt WinsMain()
|
||||||
|
{
|
||||||
|
return E32Main();
|
||||||
|
// return WinsMain(0, 0, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Epoc dll entry point */
|
/* Epoc dll entry point */
|
||||||
#if defined(__WINS__)
|
#if defined(__WINS__)
|
||||||
GLDEF_C TInt E32Dll(TDllReason)
|
GLDEF_C TInt E32Dll(TDllReason)
|
||||||
{
|
{
|
||||||
return(KErrNone);
|
return(KErrNone);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_C TInt WinsMain(TAny *)
|
|
||||||
{
|
|
||||||
E32Main();
|
|
||||||
return KErrNone;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
1035
src/main/symbian/EKA2/SDL_main.cpp
Normal file
1035
src/main/symbian/EKA2/SDL_main.cpp
Normal file
File diff suppressed because it is too large
Load diff
809
src/main/symbian/EKA2/sdlexe.cpp
Normal file
809
src/main/symbian/EKA2/sdlexe.cpp
Normal file
|
@ -0,0 +1,809 @@
|
||||||
|
// INCLUDES
|
||||||
|
#include <aknapp.h>
|
||||||
|
#include <aknappui.h>
|
||||||
|
#include <eikdoc.h>
|
||||||
|
#include <sdlepocapi.h>
|
||||||
|
#include <bautils.h>
|
||||||
|
#include <eikstart.h>
|
||||||
|
#include <badesca.h>
|
||||||
|
#include <bautils.h>
|
||||||
|
#include <apgcli.h>
|
||||||
|
#include <sdlmain.h>
|
||||||
|
#include <eikedwin.h>
|
||||||
|
#include <eiklabel.h>
|
||||||
|
#include <sdlexe.rsg>
|
||||||
|
#include <aknglobalmsgquery.h>
|
||||||
|
#include <apgwgnam.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// FORWARD DECLARATIONS
|
||||||
|
class CApaDocument;
|
||||||
|
|
||||||
|
|
||||||
|
//const TUid KSDLUID = { 0xF01F605E };
|
||||||
|
|
||||||
|
LOCAL_C void MakeCCmdLineL(const TDesC8& aParam, CDesC8Array& aArray)
|
||||||
|
{
|
||||||
|
|
||||||
|
const TChar dq('\"');
|
||||||
|
|
||||||
|
TLex8 lex(aParam);
|
||||||
|
TBool in = EFalse;
|
||||||
|
|
||||||
|
lex.SkipSpaceAndMark();
|
||||||
|
|
||||||
|
while(!lex.Eos())
|
||||||
|
{
|
||||||
|
TPtrC8 ptr;
|
||||||
|
if(in)
|
||||||
|
{
|
||||||
|
const TPtrC8 rem = lex.RemainderFromMark();
|
||||||
|
const TInt pos = rem.Locate(dq);
|
||||||
|
if(pos > 0)
|
||||||
|
{
|
||||||
|
lex.Inc(pos);
|
||||||
|
ptr.Set(lex.MarkedToken());
|
||||||
|
lex.SkipAndMark(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ptr.Set(rem);
|
||||||
|
}
|
||||||
|
in = EFalse;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ptr.Set(lex.NextToken());
|
||||||
|
const TInt pos = ptr.Locate(dq);
|
||||||
|
if(pos == 0)
|
||||||
|
{
|
||||||
|
lex.UnGetToMark();
|
||||||
|
lex.SkipAndMark(1);
|
||||||
|
in = ETrue;
|
||||||
|
continue; // back to in brace
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lex.SkipSpaceAndMark();
|
||||||
|
}
|
||||||
|
|
||||||
|
aArray.AppendL(ptr);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(TVirtualCursor) : public MOverlay
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TVirtualCursor();
|
||||||
|
void Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha);
|
||||||
|
void Move(TInt aX, TInt aY);
|
||||||
|
void MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const;
|
||||||
|
void Toggle();
|
||||||
|
TBool IsOn() const;
|
||||||
|
private:
|
||||||
|
void Draw(CBitmapContext& aGc, const TRect& aTargetRect, const TSize& aSize);
|
||||||
|
private:
|
||||||
|
TRect iRect;
|
||||||
|
TPoint iInc;
|
||||||
|
TPoint iPos;
|
||||||
|
TBool iIsOn;
|
||||||
|
CFbsBitmap* iCBmp;
|
||||||
|
CFbsBitmap* iAlpha;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
TVirtualCursor::TVirtualCursor() : iInc(0, 0), iIsOn(EFalse), iCBmp(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const TInt KMaxMove = 10;
|
||||||
|
|
||||||
|
void TVirtualCursor::Move(TInt aX, TInt aY)
|
||||||
|
{
|
||||||
|
if(aX > 0 && iInc.iX > 0)
|
||||||
|
++iInc.iX;
|
||||||
|
else if(aX < 0 && iInc.iX < 0)
|
||||||
|
--iInc.iX;
|
||||||
|
else
|
||||||
|
iInc.iX = aX;
|
||||||
|
|
||||||
|
if(aY > 0 && iInc.iY > 0)
|
||||||
|
++iInc.iY;
|
||||||
|
else if(aY < 0 && iInc.iY < 0)
|
||||||
|
--iInc.iY;
|
||||||
|
else
|
||||||
|
iInc.iY = aY;
|
||||||
|
|
||||||
|
iInc.iX = Min(KMaxMove, iInc.iX);
|
||||||
|
|
||||||
|
iInc.iX = Max(-KMaxMove, iInc.iX);
|
||||||
|
|
||||||
|
iInc.iY = Min(KMaxMove, iInc.iY);
|
||||||
|
|
||||||
|
iInc.iY =Max(-KMaxMove, iInc.iY);
|
||||||
|
|
||||||
|
const TPoint pos = iPos + iInc;
|
||||||
|
if(iRect.Contains(pos))
|
||||||
|
{
|
||||||
|
iPos = pos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iInc = TPoint(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TVirtualCursor::Toggle()
|
||||||
|
{
|
||||||
|
iIsOn = !iIsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TBool TVirtualCursor::IsOn() const
|
||||||
|
{
|
||||||
|
return iIsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TVirtualCursor::Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha)
|
||||||
|
{
|
||||||
|
iRect = aRect;
|
||||||
|
iCBmp = aBmp;
|
||||||
|
iAlpha = aAlpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TVirtualCursor::MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const
|
||||||
|
{
|
||||||
|
aEvent.SetType(EEventPointer),
|
||||||
|
aEvent.SetTimeNow();
|
||||||
|
TPointerEvent& pointer = *aEvent.Pointer();
|
||||||
|
pointer.iType = TPointerEvent::EButton1Down;
|
||||||
|
pointer.iPosition = iPos;
|
||||||
|
pointer.iParentPosition = aBasePos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TVirtualCursor::Draw(CBitmapContext& aGc, const TRect& /*aTargetRect*/, const TSize& /*aSize*/)
|
||||||
|
{
|
||||||
|
if(iIsOn && iCBmp != NULL)
|
||||||
|
{
|
||||||
|
const TRect rect(TPoint(0, 0), iCBmp->SizeInPixels());
|
||||||
|
aGc.AlphaBlendBitmaps(iPos, iCBmp, rect, iAlpha, TPoint(0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(TSdlClass)
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TSdlClass();
|
||||||
|
void SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags);
|
||||||
|
TInt SdlFlags() const;
|
||||||
|
const TMainFunc& Main() const;
|
||||||
|
void SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL);
|
||||||
|
TInt AppFlags() const;
|
||||||
|
void AppFlags(TInt aFlags);
|
||||||
|
private:
|
||||||
|
TMainFunc iFunc;
|
||||||
|
TInt iSdlFlags;
|
||||||
|
TInt iExeFlags;
|
||||||
|
MSDLMainObs* iObs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void TSdlClass::AppFlags(TInt aFlags)
|
||||||
|
{
|
||||||
|
iExeFlags |= aFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSdlClass::SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL)
|
||||||
|
{
|
||||||
|
if(iObs != NULL)
|
||||||
|
iObs->SDLMainEvent(aEvent, aParam, aSDL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TInt TSdlClass::AppFlags() const
|
||||||
|
{
|
||||||
|
return iExeFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSdlClass::SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags)
|
||||||
|
{
|
||||||
|
iFunc = aFunc;
|
||||||
|
iSdlFlags = aFlags;
|
||||||
|
iExeFlags = aExeFlags;
|
||||||
|
iObs = aObs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TMainFunc& TSdlClass::Main() const
|
||||||
|
{
|
||||||
|
return iFunc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TInt TSdlClass::SdlFlags() const
|
||||||
|
{
|
||||||
|
return iSdlFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TSdlClass::TSdlClass()
|
||||||
|
{
|
||||||
|
Mem::FillZ(this, sizeof(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
TSdlClass gSDLClass;
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CSDLApplication) : public CAknApplication
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSDLApplication();
|
||||||
|
private:
|
||||||
|
CApaDocument* CreateDocumentL();
|
||||||
|
TFileName ResourceFileName() const;
|
||||||
|
TUid AppDllUid() const;
|
||||||
|
void FindMeL();
|
||||||
|
TUid iUid;
|
||||||
|
};
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CSDLDocument) : public CEikDocument
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSDLDocument(CEikApplication& aApp);
|
||||||
|
private:
|
||||||
|
CEikAppUi* CreateAppUiL();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(MExitWait)
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void DoExit(TInt aErr) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CExitWait) : public CActive
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CExitWait(MExitWait& aWait);
|
||||||
|
~CExitWait();
|
||||||
|
private:
|
||||||
|
void RunL();
|
||||||
|
void DoCancel();
|
||||||
|
private:
|
||||||
|
MExitWait& iWait;
|
||||||
|
TRequestStatus* iStatusPtr;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CSDLWin) : public CCoeControl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void ConstructL(const TRect& aRect);
|
||||||
|
RWindow& GetWindow() const;
|
||||||
|
void SetNoDraw();
|
||||||
|
private:
|
||||||
|
void Draw(const TRect& aRect) const;
|
||||||
|
private:
|
||||||
|
TBool iNoDraw;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(CSDLAppUi) : public CAknAppUi, public MExitWait, MSDLObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
~CSDLAppUi();
|
||||||
|
private: // New functions
|
||||||
|
void ConstructL();
|
||||||
|
void HandleCommandL(TInt aCommand);
|
||||||
|
void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
|
||||||
|
void HandleResourceChangeL(TInt aType);
|
||||||
|
|
||||||
|
void DoExit(TInt aErr);
|
||||||
|
|
||||||
|
TInt SdlEvent(TInt aEvent, TInt aParam);
|
||||||
|
TInt SdlThreadEvent(TInt aEvent, TInt aParam);
|
||||||
|
|
||||||
|
void StartL();
|
||||||
|
static TBool StartL(TAny* aThis);
|
||||||
|
|
||||||
|
TBool ParamEditorL(TDes& aCheat);
|
||||||
|
|
||||||
|
TBool ProcessCommandParametersL(CApaCommandLine &aCommandLine);
|
||||||
|
|
||||||
|
void PrepareToExit();
|
||||||
|
void HandleConsoleWindowL();
|
||||||
|
void HandleConsoleWindow();
|
||||||
|
void HandleForegroundEventL(TBool aForeground);
|
||||||
|
|
||||||
|
static TBool IdleRequestL(TAny* aThis);
|
||||||
|
|
||||||
|
TBool HandleKeyL(const TWsEvent& aEvent);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
CExitWait* iWait;
|
||||||
|
CSDLWin* iSDLWin;
|
||||||
|
CSDL* iSdl;
|
||||||
|
CIdle* iStarter;
|
||||||
|
TBool iExitRequest;
|
||||||
|
CDesC8Array* iParams;
|
||||||
|
TInt iResOffset;
|
||||||
|
CIdle* iIdle;
|
||||||
|
TInt iStdOut;
|
||||||
|
TVirtualCursor iCursor;
|
||||||
|
CFbsBitmap* iCBmp;
|
||||||
|
CFbsBitmap* iAlpha;
|
||||||
|
// TTime iLastPress;
|
||||||
|
// CSDL::TOrientationMode iOrientation;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////7
|
||||||
|
|
||||||
|
CApaDocument* CSDLApplication::CreateDocumentL()
|
||||||
|
{
|
||||||
|
return new (ELeave) CSDLDocument(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
TUid CSDLApplication::AppDllUid() const
|
||||||
|
{
|
||||||
|
return iUid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CSDLApplication::CSDLApplication()
|
||||||
|
{
|
||||||
|
TRAPD(err, FindMeL());
|
||||||
|
ASSERT(err == KErrNone);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLApplication::FindMeL()
|
||||||
|
{
|
||||||
|
RApaLsSession apa;
|
||||||
|
User::LeaveIfError(apa.Connect());
|
||||||
|
CleanupClosePushL(apa);
|
||||||
|
User::LeaveIfError(apa.GetAllApps());
|
||||||
|
TFileName name = RProcess().FileName();
|
||||||
|
TApaAppInfo info;
|
||||||
|
while(apa.GetNextApp(info) == KErrNone)
|
||||||
|
{
|
||||||
|
if(info.iFullName.CompareF(name) == 0)
|
||||||
|
{
|
||||||
|
iUid = info.iUid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CleanupStack::PopAndDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
TFileName CSDLApplication::ResourceFileName() const
|
||||||
|
{
|
||||||
|
return KNullDesC();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CExitWait::CExitWait(MExitWait& aWait) : CActive(CActive::EPriorityStandard), iWait(aWait)
|
||||||
|
{
|
||||||
|
CActiveScheduler::Add(this);
|
||||||
|
SetActive();
|
||||||
|
iStatusPtr = &iStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
CExitWait::~CExitWait()
|
||||||
|
{
|
||||||
|
Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CExitWait::RunL()
|
||||||
|
{
|
||||||
|
if(iStatusPtr != NULL )
|
||||||
|
iWait.DoExit(iStatus.Int());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CExitWait::DoCancel()
|
||||||
|
{
|
||||||
|
if(iStatusPtr != NULL )
|
||||||
|
User::RequestComplete(iStatusPtr , KErrCancel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CSDLDocument::CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp)
|
||||||
|
{}
|
||||||
|
|
||||||
|
CEikAppUi* CSDLDocument::CreateAppUiL()
|
||||||
|
{
|
||||||
|
return new (ELeave) CSDLAppUi;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void CSDLWin:: ConstructL(const TRect& aRect)
|
||||||
|
{
|
||||||
|
CreateWindowL();
|
||||||
|
SetRect(aRect);
|
||||||
|
ActivateL();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RWindow& CSDLWin::GetWindow() const
|
||||||
|
{
|
||||||
|
return Window();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CSDLWin::Draw(const TRect& /*aRect*/) const
|
||||||
|
{
|
||||||
|
if(!iNoDraw)
|
||||||
|
{
|
||||||
|
CWindowGc& gc = SystemGc();
|
||||||
|
gc.SetPenStyle(CGraphicsContext::ESolidPen);
|
||||||
|
gc.SetPenColor(KRgbGray);
|
||||||
|
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
|
||||||
|
gc.SetBrushColor(0xaaaaaa);
|
||||||
|
gc.DrawRect(Rect());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLWin::SetNoDraw()
|
||||||
|
{
|
||||||
|
iNoDraw = ETrue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CSDLAppUi::~CSDLAppUi()
|
||||||
|
{
|
||||||
|
if(iIdle)
|
||||||
|
iIdle->Cancel();
|
||||||
|
delete iIdle;
|
||||||
|
if(iStarter != NULL)
|
||||||
|
iStarter->Cancel();
|
||||||
|
delete iStarter;
|
||||||
|
delete iWait;
|
||||||
|
delete iSdl;
|
||||||
|
delete iSDLWin;
|
||||||
|
delete iParams;
|
||||||
|
delete iCBmp;
|
||||||
|
delete iAlpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CSDLAppUi::ConstructL()
|
||||||
|
{
|
||||||
|
BaseConstructL(ENoAppResourceFile | ENoScreenFurniture);
|
||||||
|
|
||||||
|
|
||||||
|
RLibrary lib;
|
||||||
|
User::LeaveIfError(lib.Load(_L("sdlexe.dll")));
|
||||||
|
TFileName name = lib.FileName();
|
||||||
|
lib.Close();
|
||||||
|
name.Replace(3, name.Length() - 3, _L("resource\\apps\\sdlexe.rsc"));
|
||||||
|
BaflUtils::NearestLanguageFile(iEikonEnv->FsSession(), name);
|
||||||
|
iResOffset = iCoeEnv->AddResourceFileL(name);
|
||||||
|
|
||||||
|
name.Replace(name.Length() - 3, 3, _L("mbm"));
|
||||||
|
|
||||||
|
TEntry e;
|
||||||
|
const TInt err = iEikonEnv->FsSession().Entry(name, e);
|
||||||
|
|
||||||
|
iCBmp = iEikonEnv->CreateBitmapL(name, 0);
|
||||||
|
iAlpha = iEikonEnv->CreateBitmapL(name, 1);
|
||||||
|
|
||||||
|
iIdle = CIdle::NewL(CActive::EPriorityIdle);
|
||||||
|
|
||||||
|
iSDLWin = new (ELeave) CSDLWin;
|
||||||
|
iSDLWin->ConstructL(ApplicationRect());
|
||||||
|
|
||||||
|
iSdl = CSDL::NewL(gSDLClass.SdlFlags());
|
||||||
|
|
||||||
|
gSDLClass.SendEvent(MSDLMainObs::ESDLCreated, 0, iSdl);
|
||||||
|
|
||||||
|
iSdl->SetObserver(this);
|
||||||
|
iSdl->DisableKeyBlocking(*this);
|
||||||
|
iSdl->SetContainerWindowL(
|
||||||
|
iSDLWin->GetWindow(),
|
||||||
|
iEikonEnv->WsSession(),
|
||||||
|
*iEikonEnv->ScreenDevice());
|
||||||
|
iSdl->AppendOverlay(iCursor, 0);
|
||||||
|
|
||||||
|
iCursor.Set(TRect(TPoint(0, 0), iSDLWin->Size()), iCBmp, iAlpha);
|
||||||
|
|
||||||
|
iStarter = CIdle::NewL(CActive::EPriorityLow);
|
||||||
|
iStarter->Start(TCallBack(StartL, this));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TBool CSDLAppUi::StartL(TAny* aThis)
|
||||||
|
{
|
||||||
|
static_cast<CSDLAppUi*>(aThis)->StartL();
|
||||||
|
return EFalse;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CSDLAppUi::PrepareToExit()
|
||||||
|
{
|
||||||
|
CAknAppUiBase::PrepareToExit(); //aknappu::PrepareToExit crashes
|
||||||
|
iCoeEnv->DeleteResourceFile(iResOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
TBool CSDLAppUi::ProcessCommandParametersL(CApaCommandLine &aCommandLine)
|
||||||
|
{
|
||||||
|
const TPtrC8 cmdLine = aCommandLine.TailEnd();
|
||||||
|
iParams = new (ELeave) CDesC8ArrayFlat(8);
|
||||||
|
MakeCCmdLineL(cmdLine, *iParams);
|
||||||
|
return EFalse;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TBool CSDLAppUi::ParamEditorL(TDes& aCheat)
|
||||||
|
{
|
||||||
|
CAknTextQueryDialog* query = CAknTextQueryDialog::NewL(aCheat);
|
||||||
|
CleanupStack::PushL(query);
|
||||||
|
query->SetPromptL(_L("Enter parameters"));
|
||||||
|
CleanupStack::Pop();
|
||||||
|
return query->ExecuteLD(R_PARAMEDITOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::StartL()
|
||||||
|
{
|
||||||
|
if(gSDLClass.AppFlags() & SDLEnv::EParamQuery)
|
||||||
|
{
|
||||||
|
TBuf8<256> cmd;
|
||||||
|
RFile file;
|
||||||
|
TInt err = file.Open(iEikonEnv->FsSession(), _L("sdl_param.txt"),EFileRead);
|
||||||
|
if(err == KErrNone)
|
||||||
|
{
|
||||||
|
file.Read(cmd);
|
||||||
|
file.Close();
|
||||||
|
MakeCCmdLineL(cmd, *iParams);
|
||||||
|
}
|
||||||
|
if(err != KErrNone || gSDLClass.AppFlags() & (SDLEnv::EParamQueryDialog ^ SDLEnv::EParamQuery))
|
||||||
|
{
|
||||||
|
TBuf<256> buffer;
|
||||||
|
if(ParamEditorL(buffer))
|
||||||
|
{
|
||||||
|
cmd.Copy(buffer);
|
||||||
|
MakeCCmdLineL(cmd, *iParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iWait = new (ELeave) CExitWait(*this);
|
||||||
|
iSdl->CallMainL(gSDLClass.Main(), &iWait->iStatus, iParams, CSDL::ENoParamFlags, 0xA000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::HandleCommandL(TInt aCommand)
|
||||||
|
{
|
||||||
|
switch(aCommand)
|
||||||
|
{
|
||||||
|
case EAknSoftkeyBack:
|
||||||
|
case EAknSoftkeyExit:
|
||||||
|
case EAknCmdExit:
|
||||||
|
case EEikCmdExit:
|
||||||
|
gSDLClass.AppFlags(SDLEnv::EAllowConsoleView);
|
||||||
|
if(iWait == NULL || !iWait->IsActive() || iSdl == NULL)
|
||||||
|
{
|
||||||
|
Exit();
|
||||||
|
}
|
||||||
|
else if(!iExitRequest)
|
||||||
|
{
|
||||||
|
iExitRequest = ETrue; //trick how SDL can be closed!
|
||||||
|
iSdl->Suspend();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TBool CSDLAppUi::HandleKeyL(const TWsEvent& aEvent)
|
||||||
|
{
|
||||||
|
const TInt type = aEvent.Type();
|
||||||
|
if(!(type == EEventKey || type == EEventKeyUp || type == EEventKeyDown))
|
||||||
|
{
|
||||||
|
return ETrue;
|
||||||
|
}
|
||||||
|
const TKeyEvent& key = *aEvent.Key();
|
||||||
|
if((key.iScanCode == EStdKeyYes) && (gSDLClass.AppFlags() & SDLEnv::EVirtualMouse))
|
||||||
|
{
|
||||||
|
if(type == EEventKeyUp)
|
||||||
|
{
|
||||||
|
iCursor.Toggle();
|
||||||
|
iSdl->RedrawRequest();
|
||||||
|
}
|
||||||
|
return EFalse;
|
||||||
|
}
|
||||||
|
if(iCursor.IsOn())
|
||||||
|
{
|
||||||
|
switch(key.iScanCode)
|
||||||
|
{
|
||||||
|
case EStdKeyUpArrow:
|
||||||
|
iCursor.Move(0, -1);
|
||||||
|
break;
|
||||||
|
case EStdKeyDownArrow:
|
||||||
|
iCursor.Move(0, 1);
|
||||||
|
break;
|
||||||
|
case EStdKeyLeftArrow:
|
||||||
|
iCursor.Move(-1, 0);
|
||||||
|
break;
|
||||||
|
case EStdKeyRightArrow:
|
||||||
|
iCursor.Move(1, 0);
|
||||||
|
break;
|
||||||
|
case EStdKeyDevice3:
|
||||||
|
if(type == EEventKeyUp)
|
||||||
|
{
|
||||||
|
TWsEvent event;
|
||||||
|
iCursor.MakeEvent(event, iSDLWin->Position());
|
||||||
|
iSdl->AppendWsEvent(event);
|
||||||
|
}
|
||||||
|
return EFalse;
|
||||||
|
default:
|
||||||
|
return ETrue;
|
||||||
|
}
|
||||||
|
iSdl->RedrawRequest();
|
||||||
|
return EFalse;
|
||||||
|
}
|
||||||
|
return ETrue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
|
||||||
|
{
|
||||||
|
if(iSdl && iWait && HandleKeyL(aEvent))
|
||||||
|
iSdl->AppendWsEvent(aEvent);
|
||||||
|
CAknAppUi::HandleWsEventL(aEvent, aDestination);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::HandleResourceChangeL(TInt aType)
|
||||||
|
{
|
||||||
|
CAknAppUi::HandleResourceChangeL(aType);
|
||||||
|
if(aType == KEikDynamicLayoutVariantSwitch)
|
||||||
|
{
|
||||||
|
iSDLWin->SetRect(ApplicationRect());
|
||||||
|
iSdl->SetContainerWindowL(
|
||||||
|
iSDLWin->GetWindow(),
|
||||||
|
iEikonEnv->WsSession(),
|
||||||
|
*iEikonEnv->ScreenDevice());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CSDLAppUi::DoExit(TInt/*Err*/)
|
||||||
|
{
|
||||||
|
iExitRequest = ETrue;
|
||||||
|
Exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TInt CSDLAppUi::SdlThreadEvent(TInt aEvent, TInt /*aParam*/)
|
||||||
|
{
|
||||||
|
switch(aEvent)
|
||||||
|
{
|
||||||
|
case MSDLObserver::EEventResume:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventSuspend:
|
||||||
|
if(iExitRequest)
|
||||||
|
return MSDLObserver::ESuspendNoSuspend;
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventWindowReserved:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventWindowNotAvailable:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventScreenSizeChanged:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MSDLObserver::EParameterNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
TInt CSDLAppUi::SdlEvent(TInt aEvent, TInt /*aParam*/)
|
||||||
|
{
|
||||||
|
switch(aEvent)
|
||||||
|
{
|
||||||
|
case MSDLObserver::EEventResume:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventSuspend:
|
||||||
|
if(iExitRequest)
|
||||||
|
return MSDLObserver::ESuspendNoSuspend;
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventWindowReserved:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventWindowNotAvailable:
|
||||||
|
{
|
||||||
|
TRAP_IGNORE(HandleConsoleWindowL());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventScreenSizeChanged:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventKeyMapInit:
|
||||||
|
break;
|
||||||
|
case MSDLObserver::EEventMainExit:
|
||||||
|
if(iStdOut != 0)
|
||||||
|
{
|
||||||
|
gSDLClass.AppFlags(SDLEnv::EAllowConsoleView);
|
||||||
|
iEikonEnv->WsSession().SetWindowGroupOrdinalPosition(iStdOut, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MSDLObserver::EParameterNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::HandleForegroundEventL(TBool aForeground)
|
||||||
|
{
|
||||||
|
CAknAppUi::HandleForegroundEventL(aForeground);
|
||||||
|
if(!aForeground)
|
||||||
|
HandleConsoleWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::HandleConsoleWindow()
|
||||||
|
{
|
||||||
|
if(!iIdle->IsActive())
|
||||||
|
iIdle->Start(TCallBack(IdleRequestL, this));
|
||||||
|
}
|
||||||
|
|
||||||
|
TBool CSDLAppUi::IdleRequestL(TAny* aThis)
|
||||||
|
{
|
||||||
|
static_cast<CSDLAppUi*>(aThis)->HandleConsoleWindowL();
|
||||||
|
return EFalse;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSDLAppUi::HandleConsoleWindowL()
|
||||||
|
{
|
||||||
|
if(gSDLClass.AppFlags() & SDLEnv::EAllowConsoleView)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RWsSession& ses = iEikonEnv->WsSession();
|
||||||
|
const TInt focus = ses.GetFocusWindowGroup();
|
||||||
|
CApaWindowGroupName* name = CApaWindowGroupName::NewLC(ses, focus);
|
||||||
|
const TPtrC caption = name->Caption();
|
||||||
|
if(0 == caption.CompareF(_L("STDOUT")))
|
||||||
|
{
|
||||||
|
iStdOut = focus;
|
||||||
|
ses.SetWindowGroupOrdinalPosition(iEikonEnv->RootWin().Identifier(), 0);
|
||||||
|
}
|
||||||
|
CleanupStack::PopAndDestroy(); //name
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
CApaApplication* NewApplication()
|
||||||
|
{
|
||||||
|
return new CSDLApplication();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EXPORT_C TInt SDLEnv::SetMain(const TMainFunc& aFunc, TInt aSdlFlags, MSDLMainObs* aObs, TInt aSdlExeFlags)
|
||||||
|
{
|
||||||
|
gSDLClass.SetMain(aFunc, aSdlFlags, aObs, aSdlExeFlags);
|
||||||
|
return EikStart::RunApplication(NewApplication);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TInt SDLUiPrint(const TDesC8& /*aInfo*/)
|
||||||
|
{
|
||||||
|
return KErrNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
12
src/main/symbian/EKA2/sdllib.cpp
Normal file
12
src/main/symbian/EKA2/sdllib.cpp
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include<eikstart.h>
|
||||||
|
#include<sdlmain.h>
|
||||||
|
#include<sdlepocapi.h>
|
||||||
|
|
||||||
|
|
||||||
|
GLREF_C TInt E32Main()
|
||||||
|
{
|
||||||
|
return SDLEnv::SetMain(SDL_main, CSDL::EEnableFocusStop | CSDL::EAllowImageResize,
|
||||||
|
NULL, SDLEnv::EParamQuery | SDLEnv::EVirtualMouse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
62
src/main/symbian/EKA2/vectorbuffer.cpp
Normal file
62
src/main/symbian/EKA2/vectorbuffer.cpp
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
vectorbuffer.cpp
|
||||||
|
yet another circle buffer
|
||||||
|
|
||||||
|
Markus Mertama
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include"vectorbuffer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VectorPanic(TInt aErr, TInt aLine)
|
||||||
|
{
|
||||||
|
TBuf<64> b;
|
||||||
|
b.Format(_L("vector buffer at % d "), aLine);
|
||||||
|
User::Panic(b, aErr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TNodeBuffer::TNode::Terminator(TNodeBuffer::TNode* aNode)
|
||||||
|
{
|
||||||
|
Mem::Copy(iSucc, &aNode, sizeof(TNode*));
|
||||||
|
}
|
||||||
|
|
||||||
|
TInt TNodeBuffer::TNode::Size() const
|
||||||
|
{
|
||||||
|
return reinterpret_cast<const TUint8*>(iSucc) - Ptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
const TUint8* TNodeBuffer::TNode::Ptr() const
|
||||||
|
{
|
||||||
|
return reinterpret_cast<const TUint8*>(this) + sizeof(TNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
TNodeBuffer::TNode* TNodeBuffer::TNode::Empty(TUint8* aBuffer)
|
||||||
|
{
|
||||||
|
TNode* node = reinterpret_cast<TNode*>(aBuffer);
|
||||||
|
node->iSucc = node + 1;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
TNodeBuffer::TNode* TNodeBuffer::TNode::New(TNode* aPred, const TDesC8& aData)
|
||||||
|
{
|
||||||
|
TNode* node = aPred->Size() == 0 ? aPred : aPred->iSucc;
|
||||||
|
|
||||||
|
|
||||||
|
TUint8* start = reinterpret_cast<TUint8*>(node) + sizeof(TNode);
|
||||||
|
node->iSucc = reinterpret_cast<TNode*>(start + aData.Size());
|
||||||
|
node->iSucc->iSucc = NULL; //terminator
|
||||||
|
|
||||||
|
__ASSERT_DEBUG(node->Size() == aData.Size(), VECPANIC(KErrCorrupt));
|
||||||
|
|
||||||
|
Mem::Copy(start, aData.Ptr(), aData.Size());
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
240
src/main/symbian/EKA2/vectorbuffer.h
Normal file
240
src/main/symbian/EKA2/vectorbuffer.h
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
/*
|
||||||
|
vectorbuffer.cpp
|
||||||
|
yet another circle buffer
|
||||||
|
|
||||||
|
Markus Mertama
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __VECTORBUFFER_H__
|
||||||
|
#define __VECTORBUFFER_H__
|
||||||
|
|
||||||
|
#include<e32std.h>
|
||||||
|
#define VLOG(x)
|
||||||
|
#define VECPANIC(x) VectorPanic(x, __LINE__)
|
||||||
|
void VectorPanic(TInt, TInt);
|
||||||
|
|
||||||
|
|
||||||
|
//int DEBUG_INT;
|
||||||
|
|
||||||
|
NONSHARABLE_CLASS(TNodeBuffer)
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
protected:
|
||||||
|
NONSHARABLE_CLASS(TNode)
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static TNode* Empty(TUint8* iBuffer);
|
||||||
|
static TNode* New(TNode* aPrev, const TDesC8& aData);
|
||||||
|
const TUint8* Ptr() const;
|
||||||
|
TInt Size() const;
|
||||||
|
inline TNode* Succ();
|
||||||
|
static void SetSucc(TNode*& aNode);
|
||||||
|
void Terminator(TNode* aNode);
|
||||||
|
private:
|
||||||
|
TNode* iSucc;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
inline TNodeBuffer::TNode* TNodeBuffer::TNode::Succ()
|
||||||
|
{
|
||||||
|
return iSucc;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <TInt C>
|
||||||
|
NONSHARABLE_CLASS(TVectorBuffer) : public TNodeBuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TVectorBuffer();
|
||||||
|
TInt Append(const TDesC8& aData);
|
||||||
|
// TInt AppendOverwrite(const TDesC8& aData);
|
||||||
|
TPtrC8 Shift();
|
||||||
|
TPtrC8 operator[](TInt aIndex) const;
|
||||||
|
TInt Size() const;
|
||||||
|
private:
|
||||||
|
TInt GetRoom(TInt aSize) const;
|
||||||
|
TInt Unreserved() const;
|
||||||
|
private:
|
||||||
|
TNode* iTop;
|
||||||
|
TNode* iBottom;
|
||||||
|
TInt iSize;
|
||||||
|
TUint8 iBuffer[C];
|
||||||
|
};
|
||||||
|
|
||||||
|
template <TInt C>
|
||||||
|
TVectorBuffer<C>::TVectorBuffer() : iSize(0)
|
||||||
|
{
|
||||||
|
Mem::FillZ(iBuffer, C);
|
||||||
|
iTop = TNode::Empty(iBuffer); //these points to buffer
|
||||||
|
iBottom = TNode::Empty(iBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<TInt C >
|
||||||
|
TInt TVectorBuffer<C>::Unreserved() const
|
||||||
|
{
|
||||||
|
__ASSERT_DEBUG(iBottom < iBottom->Succ(), VECPANIC(KErrCorrupt));
|
||||||
|
const TInt bytesbetween =
|
||||||
|
reinterpret_cast<const TUint8*>(iBottom->Succ()) -
|
||||||
|
reinterpret_cast<const TUint8*>(iTop);
|
||||||
|
const TInt topsize = sizeof(TNode);
|
||||||
|
if(bytesbetween > 0) //bytesbetween is room between bottom and top
|
||||||
|
{ //therefore free room is subracted from free space
|
||||||
|
|
||||||
|
const TInt room = C - bytesbetween - topsize;
|
||||||
|
return room;
|
||||||
|
}
|
||||||
|
if(bytesbetween == 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(Size() > 0)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return C - topsize;
|
||||||
|
}
|
||||||
|
const TInt room = -bytesbetween - topsize; //free is space between pointers
|
||||||
|
return room;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <TInt C>
|
||||||
|
TInt TVectorBuffer<C>::GetRoom(TInt aSize) const
|
||||||
|
{
|
||||||
|
const TInt bytesnew = sizeof(TNode) + aSize;
|
||||||
|
const TInt room = Unreserved() - bytesnew;
|
||||||
|
return room;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <TInt C>
|
||||||
|
TInt TVectorBuffer<C>::Append(const TDesC8& aData) //ei ole ok!
|
||||||
|
{
|
||||||
|
const TInt len = aData.Length();
|
||||||
|
if(GetRoom(len) < 0)
|
||||||
|
{
|
||||||
|
return KErrOverflow;
|
||||||
|
}
|
||||||
|
if(iBottom->Succ()->Ptr() - iBuffer > (C - (len + TInt(sizeof(TNode)))))
|
||||||
|
{
|
||||||
|
VLOG("rc");
|
||||||
|
// RDebug::Print(_L("vector: append"));
|
||||||
|
TNode* p = TNode::Empty(iBuffer);
|
||||||
|
iBottom->Terminator(p);
|
||||||
|
iBottom = p;
|
||||||
|
return Append(aData);
|
||||||
|
// Append();
|
||||||
|
// iBottom = TNode::New(p, aData); //just append something into end
|
||||||
|
}
|
||||||
|
|
||||||
|
//DEBUG_INT++;
|
||||||
|
|
||||||
|
iBottom = TNode::New(iBottom, aData);
|
||||||
|
|
||||||
|
iSize += len;
|
||||||
|
return KErrNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
template <TInt C>
|
||||||
|
TInt TVectorBuffer<C>::AppendOverwrite(const TDesC8& aData) //ei ole ok!
|
||||||
|
{
|
||||||
|
while(Append(aData) == KErrOverflow)
|
||||||
|
{
|
||||||
|
if(iTop->Succ() == NULL)
|
||||||
|
{
|
||||||
|
return KErrUnderflow;
|
||||||
|
}
|
||||||
|
//Shift(); //data is lost
|
||||||
|
}
|
||||||
|
return KErrNone;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
template <TInt C>
|
||||||
|
TPtrC8 TVectorBuffer<C>::Shift()
|
||||||
|
{
|
||||||
|
__ASSERT_ALWAYS(iTop->Succ() != NULL, VECPANIC(KErrUnderflow)); //can never pass-by bottom
|
||||||
|
TNode* node = iTop;
|
||||||
|
iTop = iTop->Succ();
|
||||||
|
if(iTop > node)
|
||||||
|
{
|
||||||
|
// DEBUG_INT--;
|
||||||
|
iSize -= node->Size();
|
||||||
|
return TPtrC8(node->Ptr(), node->Size());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// RDebug::Print(_L("vector: shift"));
|
||||||
|
return Shift(); //this happens when buffer is terminated, and data lies in next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <TInt C>
|
||||||
|
TInt TVectorBuffer<C>::Size() const
|
||||||
|
{
|
||||||
|
return iSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <TInt C>
|
||||||
|
TPtrC8 TVectorBuffer<C>::operator[](TInt aIndex) const
|
||||||
|
{
|
||||||
|
TInt index = 0;
|
||||||
|
TNode* t = iTop->Size() > 0 ? iTop : iTop->Succ(); //eliminate terminator
|
||||||
|
while(index < aIndex)
|
||||||
|
{
|
||||||
|
TNode* nt = t->Succ();
|
||||||
|
if(nt < t)
|
||||||
|
{
|
||||||
|
nt = nt->Succ();
|
||||||
|
}
|
||||||
|
t = nt;
|
||||||
|
if(t->Size() > 0)
|
||||||
|
index++;
|
||||||
|
__ASSERT_ALWAYS(t->Succ() != NULL, VECPANIC(KErrUnderflow)); //can never pass-by bottom
|
||||||
|
}
|
||||||
|
return t->Ptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class T, TInt C>
|
||||||
|
NONSHARABLE_CLASS(TVector) : public TVectorBuffer<C * sizeof(T)>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TVector();
|
||||||
|
TInt Append(const T& aData);
|
||||||
|
const T& Shift();
|
||||||
|
TInt Size() const;
|
||||||
|
const T& operator[](TInt aIndex) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T, TInt C>
|
||||||
|
TVector<T, C>::TVector() : TVectorBuffer<C * sizeof(T)>()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, TInt C>
|
||||||
|
TInt TVector<T, C>::Append(const T& aData)
|
||||||
|
{
|
||||||
|
const TPckgC<T> data(aData);
|
||||||
|
return TVectorBuffer<C * sizeof(T)>::Append(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, TInt C>
|
||||||
|
const T& TVector<T, C>::Shift()
|
||||||
|
{
|
||||||
|
const TPtrC8 ptr = TVectorBuffer<C * sizeof(T)>::Shift();
|
||||||
|
return *(reinterpret_cast<const T*>(ptr.Ptr()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class T, TInt C>
|
||||||
|
TInt TVector<T, C>::Size() const
|
||||||
|
{
|
||||||
|
return TVectorBuffer<C * sizeof(T)>::Size() / sizeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, TInt C>
|
||||||
|
const T& TVector<T, C>::operator[](TInt aIndex) const
|
||||||
|
{
|
||||||
|
const TPtrC8 ptr = TVectorBuffer<C * sizeof(T)>::operator[](aIndex);
|
||||||
|
return *(reinterpret_cast<const T*>(ptr.Ptr()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -234,12 +234,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
|
||||||
char **argv;
|
char **argv;
|
||||||
int argc;
|
int argc;
|
||||||
char *cmdline;
|
char *cmdline;
|
||||||
DWORD pathlen;
|
|
||||||
#ifdef _WIN32_WCE
|
|
||||||
wchar_t path[MAX_PATH];
|
|
||||||
#else
|
|
||||||
char path[MAX_PATH];
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
wchar_t *bufp;
|
wchar_t *bufp;
|
||||||
int nLen;
|
int nLen;
|
||||||
|
@ -248,6 +242,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
|
||||||
size_t nLen;
|
size_t nLen;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_STDIO_REDIRECT
|
#ifndef NO_STDIO_REDIRECT
|
||||||
|
DWORD pathlen;
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
wchar_t path[MAX_PATH];
|
||||||
|
#else
|
||||||
|
char path[MAX_PATH];
|
||||||
|
#endif
|
||||||
FILE *newfp;
|
FILE *newfp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
39
src/main/win32/version.rc
Normal file
39
src/main/win32/version.rc
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
#include "afxres.h"
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION 1,2,12,0
|
||||||
|
PRODUCTVERSION 1,2,12,0
|
||||||
|
FILEFLAGSMASK 0x3fL
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
FILEOS 0x40004L
|
||||||
|
FILETYPE 0x2L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "\0"
|
||||||
|
VALUE "FileDescription", "SDL\0"
|
||||||
|
VALUE "FileVersion", "1, 2, 12, 0\0"
|
||||||
|
VALUE "InternalName", "SDL\0"
|
||||||
|
VALUE "LegalCopyright", "Copyright © 2007 Sam Lantinga\0"
|
||||||
|
VALUE "OriginalFilename", "SDL.dll\0"
|
||||||
|
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
||||||
|
VALUE "ProductVersion", "1, 2, 12, 0\0"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1200
|
||||||
|
END
|
||||||
|
END
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
#ifndef HAVE_GETENV
|
#ifndef HAVE_GETENV
|
||||||
|
|
||||||
#if defined(__WIN32__) && !defined(_WIN32_WCE)
|
#if defined(__WIN32__) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
|
@ -28,13 +28,27 @@
|
||||||
|
|
||||||
#ifdef HAVE_ICONV
|
#ifdef HAVE_ICONV
|
||||||
|
|
||||||
|
/* Depending on which standard the iconv() was implemented with,
|
||||||
|
iconv() may or may not use const char ** for the inbuf param.
|
||||||
|
If we get this wrong, it's just a warning, so no big deal.
|
||||||
|
*/
|
||||||
|
#if defined(_XGP6) || \
|
||||||
|
defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))
|
||||||
|
#define ICONV_INBUF_NONCONST
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
size_t SDL_iconv(SDL_iconv_t cd,
|
size_t SDL_iconv(SDL_iconv_t cd,
|
||||||
char **inbuf, size_t *inbytesleft,
|
const char **inbuf, size_t *inbytesleft,
|
||||||
char **outbuf, size_t *outbytesleft)
|
char **outbuf, size_t *outbytesleft)
|
||||||
{
|
{
|
||||||
size_t retCode = iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft);
|
size_t retCode;
|
||||||
|
#ifdef ICONV_INBUF_NONCONST
|
||||||
|
retCode = iconv(cd, (char **)inbuf, inbytesleft, outbuf, outbytesleft);
|
||||||
|
#else
|
||||||
|
retCode = iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft);
|
||||||
|
#endif
|
||||||
if ( retCode == (size_t)-1 ) {
|
if ( retCode == (size_t)-1 ) {
|
||||||
switch(errno) {
|
switch(errno) {
|
||||||
case E2BIG:
|
case E2BIG:
|
||||||
|
@ -95,7 +109,7 @@ static struct {
|
||||||
} encodings[] = {
|
} encodings[] = {
|
||||||
{ "ASCII", ENCODING_ASCII },
|
{ "ASCII", ENCODING_ASCII },
|
||||||
{ "US-ASCII", ENCODING_ASCII },
|
{ "US-ASCII", ENCODING_ASCII },
|
||||||
{ "LATIN1", ENCODING_LATIN1 },
|
{ "8859-1", ENCODING_LATIN1 },
|
||||||
{ "ISO-8859-1", ENCODING_LATIN1 },
|
{ "ISO-8859-1", ENCODING_LATIN1 },
|
||||||
{ "UTF8", ENCODING_UTF8 },
|
{ "UTF8", ENCODING_UTF8 },
|
||||||
{ "UTF-8", ENCODING_UTF8 },
|
{ "UTF-8", ENCODING_UTF8 },
|
||||||
|
@ -117,12 +131,54 @@ static struct {
|
||||||
{ "UCS-4", ENCODING_UCS4 },
|
{ "UCS-4", ENCODING_UCS4 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *getlocale(char *buffer, size_t bufsize)
|
||||||
|
{
|
||||||
|
const char *lang;
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
lang = SDL_getenv("LC_ALL");
|
||||||
|
if ( !lang ) {
|
||||||
|
lang = SDL_getenv("LC_CTYPE");
|
||||||
|
}
|
||||||
|
if ( !lang ) {
|
||||||
|
lang = SDL_getenv("LC_MESSAGES");
|
||||||
|
}
|
||||||
|
if ( !lang ) {
|
||||||
|
lang = SDL_getenv("LANG");
|
||||||
|
}
|
||||||
|
if ( !lang || !*lang || SDL_strcmp(lang, "C") == 0 ) {
|
||||||
|
lang = "ASCII";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We need to trim down strings like "en_US.UTF-8@blah" to "UTF-8" */
|
||||||
|
ptr = SDL_strchr(lang, '.');
|
||||||
|
if (ptr != NULL) {
|
||||||
|
lang = ptr + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_strlcpy(buffer, lang, bufsize);
|
||||||
|
ptr = SDL_strchr(buffer, '@');
|
||||||
|
if (ptr != NULL) {
|
||||||
|
*ptr = '\0'; /* chop end of string. */
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
SDL_iconv_t SDL_iconv_open(const char *tocode, const char *fromcode)
|
SDL_iconv_t SDL_iconv_open(const char *tocode, const char *fromcode)
|
||||||
{
|
{
|
||||||
int src_fmt = ENCODING_UNKNOWN;
|
int src_fmt = ENCODING_UNKNOWN;
|
||||||
int dst_fmt = ENCODING_UNKNOWN;
|
int dst_fmt = ENCODING_UNKNOWN;
|
||||||
int i;
|
int i;
|
||||||
|
char fromcode_buffer[64];
|
||||||
|
char tocode_buffer[64];
|
||||||
|
|
||||||
|
if ( !fromcode || !*fromcode ) {
|
||||||
|
fromcode = getlocale(fromcode_buffer, sizeof(fromcode_buffer));
|
||||||
|
}
|
||||||
|
if ( !tocode || !*tocode ) {
|
||||||
|
tocode = getlocale(tocode_buffer, sizeof(tocode_buffer));
|
||||||
|
}
|
||||||
for ( i = 0; i < SDL_arraysize(encodings); ++i ) {
|
for ( i = 0; i < SDL_arraysize(encodings); ++i ) {
|
||||||
if ( SDL_strcasecmp(fromcode, encodings[i].name) == 0 ) {
|
if ( SDL_strcasecmp(fromcode, encodings[i].name) == 0 ) {
|
||||||
src_fmt = encodings[i].format;
|
src_fmt = encodings[i].format;
|
||||||
|
@ -149,11 +205,12 @@ SDL_iconv_t SDL_iconv_open(const char *tocode, const char *fromcode)
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SDL_iconv(SDL_iconv_t cd,
|
size_t SDL_iconv(SDL_iconv_t cd,
|
||||||
char **inbuf, size_t *inbytesleft,
|
const char **inbuf, size_t *inbytesleft,
|
||||||
char **outbuf, size_t *outbytesleft)
|
char **outbuf, size_t *outbytesleft)
|
||||||
{
|
{
|
||||||
/* For simplicity, we'll convert everything to and from UCS-4 */
|
/* For simplicity, we'll convert everything to and from UCS-4 */
|
||||||
char *src, *dst;
|
const char *src;
|
||||||
|
char *dst;
|
||||||
size_t srclen, dstlen;
|
size_t srclen, dstlen;
|
||||||
Uint32 ch = 0;
|
Uint32 ch = 0;
|
||||||
size_t total;
|
size_t total;
|
||||||
|
@ -755,7 +812,7 @@ int SDL_iconv_close(SDL_iconv_t cd)
|
||||||
|
|
||||||
#endif /* !HAVE_ICONV */
|
#endif /* !HAVE_ICONV */
|
||||||
|
|
||||||
char *SDL_iconv_string(const char *tocode, const char *fromcode, char *inbuf, size_t inbytesleft)
|
char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft)
|
||||||
{
|
{
|
||||||
SDL_iconv_t cd;
|
SDL_iconv_t cd;
|
||||||
char *string;
|
char *string;
|
||||||
|
@ -765,6 +822,16 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, char *inbuf, si
|
||||||
size_t retCode = 0;
|
size_t retCode = 0;
|
||||||
|
|
||||||
cd = SDL_iconv_open(tocode, fromcode);
|
cd = SDL_iconv_open(tocode, fromcode);
|
||||||
|
if ( cd == (SDL_iconv_t)-1 ) {
|
||||||
|
/* See if we can recover here (fixes iconv on Solaris 11) */
|
||||||
|
if ( !tocode || !*tocode ) {
|
||||||
|
tocode = "UTF-8";
|
||||||
|
}
|
||||||
|
if ( !fromcode || !*fromcode ) {
|
||||||
|
tocode = "UTF-8";
|
||||||
|
}
|
||||||
|
cd = SDL_iconv_open(tocode, fromcode);
|
||||||
|
}
|
||||||
if ( cd == (SDL_iconv_t)-1 ) {
|
if ( cd == (SDL_iconv_t)-1 ) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3408,7 +3408,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
||||||
if (ss == 0) { /* First time through or recovery */
|
if (ss == 0) { /* First time through or recovery */
|
||||||
char* base = (char*)CALL_MORECORE(0);
|
char* base = (char*)CALL_MORECORE(0);
|
||||||
if (base != CMFAIL) {
|
if (base != CMFAIL) {
|
||||||
asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
|
asize = granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE);
|
||||||
/* Adjust to end on a page boundary */
|
/* Adjust to end on a page boundary */
|
||||||
if (!is_page_aligned(base))
|
if (!is_page_aligned(base))
|
||||||
asize += (page_align((size_t)base) - (size_t)base);
|
asize += (page_align((size_t)base) - (size_t)base);
|
||||||
|
@ -3422,7 +3422,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Subtract out existing available top space from MORECORE request. */
|
/* Subtract out existing available top space from MORECORE request. */
|
||||||
asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE);
|
asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE);
|
||||||
/* Use mem here only if it did continuously extend old space */
|
/* Use mem here only if it did continuously extend old space */
|
||||||
if (asize < HALF_MAX_SIZE_T &&
|
if (asize < HALF_MAX_SIZE_T &&
|
||||||
(br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) {
|
(br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) {
|
||||||
|
@ -3435,7 +3435,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
||||||
if (br != CMFAIL) { /* Try to use/extend the space we did get */
|
if (br != CMFAIL) { /* Try to use/extend the space we did get */
|
||||||
if (asize < HALF_MAX_SIZE_T &&
|
if (asize < HALF_MAX_SIZE_T &&
|
||||||
asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {
|
asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {
|
||||||
size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize);
|
size_t esize = granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE - asize);
|
||||||
if (esize < HALF_MAX_SIZE_T) {
|
if (esize < HALF_MAX_SIZE_T) {
|
||||||
char* end = (char*)CALL_MORECORE(esize);
|
char* end = (char*)CALL_MORECORE(esize);
|
||||||
if (end != CMFAIL)
|
if (end != CMFAIL)
|
||||||
|
@ -3459,7 +3459,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */
|
if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */
|
||||||
size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE;
|
size_t req = nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE;
|
||||||
size_t rsize = granularity_align(req);
|
size_t rsize = granularity_align(req);
|
||||||
if (rsize > nb) { /* Fail if wraps around zero */
|
if (rsize > nb) { /* Fail if wraps around zero */
|
||||||
char* mp = (char*)(CALL_MMAP(rsize));
|
char* mp = (char*)(CALL_MMAP(rsize));
|
||||||
|
@ -3472,7 +3472,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
|
if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
|
||||||
size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
|
size_t asize = granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE);
|
||||||
if (asize < HALF_MAX_SIZE_T) {
|
if (asize < HALF_MAX_SIZE_T) {
|
||||||
char* br = CMFAIL;
|
char* br = CMFAIL;
|
||||||
char* end = CMFAIL;
|
char* end = CMFAIL;
|
||||||
|
|
|
@ -45,7 +45,7 @@ static size_t SDL_ScanLong(const char *text, int radix, long *valuep)
|
||||||
}
|
}
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
int v;
|
int v;
|
||||||
if ( SDL_isdigit(*text) ) {
|
if ( SDL_isdigit((unsigned char) *text) ) {
|
||||||
v = *text - '0';
|
v = *text - '0';
|
||||||
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
||||||
v = 10 + (*text - 'A');
|
v = 10 + (*text - 'A');
|
||||||
|
@ -80,7 +80,7 @@ static size_t SDL_ScanUnsignedLong(const char *text, int radix, unsigned long *v
|
||||||
}
|
}
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
int v;
|
int v;
|
||||||
if ( SDL_isdigit(*text) ) {
|
if ( SDL_isdigit((unsigned char) *text) ) {
|
||||||
v = *text - '0';
|
v = *text - '0';
|
||||||
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
||||||
v = 10 + (*text - 'A');
|
v = 10 + (*text - 'A');
|
||||||
|
@ -111,7 +111,7 @@ static size_t SDL_ScanUintPtrT(const char *text, int radix, uintptr_t *valuep)
|
||||||
}
|
}
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
int v;
|
int v;
|
||||||
if ( SDL_isdigit(*text) ) {
|
if ( SDL_isdigit((unsigned char) *text) ) {
|
||||||
v = *text - '0';
|
v = *text - '0';
|
||||||
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
||||||
v = 10 + (*text - 'A');
|
v = 10 + (*text - 'A');
|
||||||
|
@ -148,7 +148,7 @@ static size_t SDL_ScanLongLong(const char *text, int radix, Sint64 *valuep)
|
||||||
}
|
}
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
int v;
|
int v;
|
||||||
if ( SDL_isdigit(*text) ) {
|
if ( SDL_isdigit((unsigned char) *text) ) {
|
||||||
v = *text - '0';
|
v = *text - '0';
|
||||||
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
||||||
v = 10 + (*text - 'A');
|
v = 10 + (*text - 'A');
|
||||||
|
@ -183,7 +183,7 @@ static size_t SDL_ScanUnsignedLongLong(const char *text, int radix, Uint64 *valu
|
||||||
}
|
}
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
int v;
|
int v;
|
||||||
if ( SDL_isdigit(*text) ) {
|
if ( SDL_isdigit((unsigned char) *text) ) {
|
||||||
v = *text - '0';
|
v = *text - '0';
|
||||||
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
} else if ( radix == 16 && SDL_isupperhex(*text) ) {
|
||||||
v = 10 + (*text - 'A');
|
v = 10 + (*text - 'A');
|
||||||
|
@ -221,7 +221,7 @@ static size_t SDL_ScanFloat(const char *text, double *valuep)
|
||||||
if ( *text == '.' ) {
|
if ( *text == '.' ) {
|
||||||
int mult = 10;
|
int mult = 10;
|
||||||
++text;
|
++text;
|
||||||
while ( SDL_isdigit(*text) ) {
|
while ( SDL_isdigit((unsigned char) *text) ) {
|
||||||
lvalue = *text - '0';
|
lvalue = *text - '0';
|
||||||
value += (double)lvalue / mult;
|
value += (double)lvalue / mult;
|
||||||
mult *= 10;
|
mult *= 10;
|
||||||
|
@ -289,8 +289,8 @@ void *SDL_revcpy(void *dst, const void *src, size_t len)
|
||||||
{
|
{
|
||||||
char *srcp = (char *)src;
|
char *srcp = (char *)src;
|
||||||
char *dstp = (char *)dst;
|
char *dstp = (char *)dst;
|
||||||
srcp += len;
|
srcp += len-1;
|
||||||
dstp += len;
|
dstp += len-1;
|
||||||
while ( len-- ) {
|
while ( len-- ) {
|
||||||
*dstp-- = *srcp--;
|
*dstp-- = *srcp--;
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ char *SDL_strupr(char *string)
|
||||||
{
|
{
|
||||||
char *bufp = string;
|
char *bufp = string;
|
||||||
while ( *bufp ) {
|
while ( *bufp ) {
|
||||||
*bufp = SDL_toupper(*bufp);
|
*bufp = SDL_toupper((unsigned char) *bufp);
|
||||||
++bufp;
|
++bufp;
|
||||||
}
|
}
|
||||||
return string;
|
return string;
|
||||||
|
@ -395,7 +395,7 @@ char *SDL_strlwr(char *string)
|
||||||
{
|
{
|
||||||
char *bufp = string;
|
char *bufp = string;
|
||||||
while ( *bufp ) {
|
while ( *bufp ) {
|
||||||
*bufp = SDL_tolower(*bufp);
|
*bufp = SDL_tolower((unsigned char) *bufp);
|
||||||
++bufp;
|
++bufp;
|
||||||
}
|
}
|
||||||
return string;
|
return string;
|
||||||
|
@ -699,8 +699,8 @@ int SDL_strcasecmp(const char *str1, const char *str2)
|
||||||
char a = 0;
|
char a = 0;
|
||||||
char b = 0;
|
char b = 0;
|
||||||
while ( *str1 && *str2 ) {
|
while ( *str1 && *str2 ) {
|
||||||
a = SDL_tolower(*str1);
|
a = SDL_tolower((unsigned char) *str1);
|
||||||
b = SDL_tolower(*str2);
|
b = SDL_tolower((unsigned char) *str2);
|
||||||
if ( a != b )
|
if ( a != b )
|
||||||
break;
|
break;
|
||||||
++str1;
|
++str1;
|
||||||
|
@ -716,8 +716,8 @@ int SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen)
|
||||||
char a = 0;
|
char a = 0;
|
||||||
char b = 0;
|
char b = 0;
|
||||||
while ( *str1 && *str2 && maxlen ) {
|
while ( *str1 && *str2 && maxlen ) {
|
||||||
a = SDL_tolower(*str1);
|
a = SDL_tolower((unsigned char) *str1);
|
||||||
b = SDL_tolower(*str2);
|
b = SDL_tolower((unsigned char) *str2);
|
||||||
if ( a != b )
|
if ( a != b )
|
||||||
break;
|
break;
|
||||||
++str1;
|
++str1;
|
||||||
|
@ -737,7 +737,7 @@ int SDL_sscanf(const char *text, const char *fmt, ...)
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
while ( *fmt ) {
|
while ( *fmt ) {
|
||||||
if ( *fmt == ' ' ) {
|
if ( *fmt == ' ' ) {
|
||||||
while ( SDL_isspace(*text) ) {
|
while ( SDL_isspace((unsigned char) *text) ) {
|
||||||
++text;
|
++text;
|
||||||
}
|
}
|
||||||
++fmt;
|
++fmt;
|
||||||
|
@ -788,7 +788,7 @@ int SDL_sscanf(const char *text, const char *fmt, ...)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ( SDL_isspace(*text) ) {
|
while ( SDL_isspace((unsigned char) *text) ) {
|
||||||
++text;
|
++text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,7 +821,7 @@ int SDL_sscanf(const char *text, const char *fmt, ...)
|
||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
if ( text[index] == '0' ) {
|
if ( text[index] == '0' ) {
|
||||||
if ( SDL_tolower(text[index+1]) == 'x' ) {
|
if ( SDL_tolower((unsigned char) text[index+1]) == 'x' ) {
|
||||||
radix = 16;
|
radix = 16;
|
||||||
} else {
|
} else {
|
||||||
radix = 8;
|
radix = 8;
|
||||||
|
@ -950,7 +950,7 @@ int SDL_sscanf(const char *text, const char *fmt, ...)
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
if ( suppress ) {
|
if ( suppress ) {
|
||||||
while ( !SDL_isspace(*text) ) {
|
while ( !SDL_isspace((unsigned char) *text) ) {
|
||||||
++text;
|
++text;
|
||||||
if ( count ) {
|
if ( count ) {
|
||||||
if ( --count == 0 ) {
|
if ( --count == 0 ) {
|
||||||
|
@ -960,7 +960,7 @@ int SDL_sscanf(const char *text, const char *fmt, ...)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char *valuep = va_arg(ap, char*);
|
char *valuep = va_arg(ap, char*);
|
||||||
while ( !SDL_isspace(*text) ) {
|
while ( !SDL_isspace((unsigned char) *text) ) {
|
||||||
*valuep++ = *text++;
|
*valuep++ = *text++;
|
||||||
if ( count ) {
|
if ( count ) {
|
||||||
if ( --count == 0 ) {
|
if ( --count == 0 ) {
|
||||||
|
|
|
@ -27,14 +27,10 @@
|
||||||
/* Need the definitions of SYS_ThreadHandle */
|
/* Need the definitions of SYS_ThreadHandle */
|
||||||
#if SDL_THREADS_DISABLED
|
#if SDL_THREADS_DISABLED
|
||||||
#include "generic/SDL_systhread_c.h"
|
#include "generic/SDL_systhread_c.h"
|
||||||
#elif SDL_THREAD_AMIGA
|
|
||||||
#include "amigaos/SDL_systhread_c.h"
|
|
||||||
#elif SDL_THREAD_BEOS
|
#elif SDL_THREAD_BEOS
|
||||||
#include "beos/SDL_systhread_c.h"
|
#include "beos/SDL_systhread_c.h"
|
||||||
#elif SDL_THREAD_DC
|
#elif SDL_THREAD_DC
|
||||||
#include "dc/SDL_systhread_c.h"
|
#include "dc/SDL_systhread_c.h"
|
||||||
#elif SDL_THREAD_EPOC
|
|
||||||
#include "epoc/SDL_systhread_c.h"
|
|
||||||
#elif SDL_THREAD_OS2
|
#elif SDL_THREAD_OS2
|
||||||
#include "os2/SDL_systhread_c.h"
|
#include "os2/SDL_systhread_c.h"
|
||||||
#elif SDL_THREAD_PTH
|
#elif SDL_THREAD_PTH
|
||||||
|
@ -45,6 +41,8 @@
|
||||||
#include "irix/SDL_systhread_c.h"
|
#include "irix/SDL_systhread_c.h"
|
||||||
#elif SDL_THREAD_WIN32
|
#elif SDL_THREAD_WIN32
|
||||||
#include "win32/SDL_systhread_c.h"
|
#include "win32/SDL_systhread_c.h"
|
||||||
|
#elif SDL_THREAD_SYMBIAN
|
||||||
|
#include "symbian/SDL_systhread_c.h"
|
||||||
#else
|
#else
|
||||||
#error Need thread implementation for this platform
|
#error Need thread implementation for this platform
|
||||||
#include "generic/SDL_systhread_c.h"
|
#include "generic/SDL_systhread_c.h"
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue