Commit 35d6bbe9 authored by Sam Lantinga's avatar Sam Lantinga

Added Atari audio support (thanks Patrice!)

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40399
parent dee1deeb
...@@ -10,9 +10,8 @@ I. Building the Simple DirectMedia Layer libraries: ...@@ -10,9 +10,8 @@ I. Building the Simple DirectMedia Layer libraries:
Do the classic configure, with --disable-shared --enable-static and: Do the classic configure, with --disable-shared --enable-static and:
Tos version (should run everywhere): Tos version (should run everywhere):
--disable-audio --disable-threads --disable-threads
Tos does not support threads, so can not support audio, maybe in a future Tos does not support threads.
version audio support will be added via interrupts.
MiNT version (maybe Magic, only for multitasking OS): MiNT version (maybe Magic, only for multitasking OS):
--disable-pthreads --enable-pth --disable-pthreads --enable-pth
...@@ -50,11 +49,11 @@ Mouse (XBIOS, GEM, Ikbd) ...@@ -50,11 +49,11 @@ Mouse (XBIOS, GEM, Ikbd)
Video (XBIOS (Fullscreen), GEM (Windowed and Fullscreen)) Video (XBIOS (Fullscreen), GEM (Windowed and Fullscreen))
Timer (VBL vector) Timer (VBL vector)
Joystick and joypad support (Ikbd, Hardware) Joystick and joypad support (Ikbd, Hardware)
Audio support (Hardware, XBIOS, GSXB, /dev/audio if threads enabled)
Threads support (Multitasking OS only via GNU pth library)
- What is missing: - What is missing:
Audio support (TOS)
CDROM support (Metados, /dev/cdrom) CDROM support (Metados, /dev/cdrom)
Threads support (TOS)
- Driver combinations: - Driver combinations:
Video Kbd Mouse Timer Jstick Joypads Video Kbd Mouse Timer Jstick Joypads
...@@ -69,15 +68,20 @@ to report this type event. ...@@ -69,15 +68,20 @@ to report this type event.
============================================================================== ==============================================================================
V. Environment variables: V. Environment variables:
SDL_VIDEODRIVER:
Set to 'xbios' to force xbios video driver
Set to 'gem' to force gem video driver
SDL_AUDIODRIVER:
Set to 'mint' to force Atari audio driver
Set to 'audio' to force Sun /dev/audio audio driver
Set to 'disk' to force disk-writing audio driver
SDL_ATARI_EVENTSDRIVER SDL_ATARI_EVENTSDRIVER
Set to 'ikbd' to force IKBD 6301 keyboard driver Set to 'ikbd' to force IKBD 6301 keyboard driver
Set to 'gemdos' to force gemdos keyboard driver Set to 'gemdos' to force gemdos keyboard driver
Set to 'bios' to force bios keyboard driver Set to 'bios' to force bios keyboard driver
SDL_VIDEODRIVER:
Set to 'xbios' to force xbios video driver
Set to 'gem' to force gem video driver
SDL_JOYSTICK_ATARI: SDL_JOYSTICK_ATARI:
Use any of these strings in the environment variable to enable or Use any of these strings in the environment variable to enable or
disable a joystick: disable a joystick:
...@@ -151,7 +155,19 @@ Joypad driver: ...@@ -151,7 +155,19 @@ Joypad driver:
Available if _MCH cookie is STE or Falcon. Available if _MCH cookie is STE or Falcon.
VBL timer driver: VBL timer driver:
Available all machines (I think). Available on all machines (I think).
Audio driver:
Cookie _SND is used to detect supported audio capabilities
STE, Mega STE, TT:
8 bits DMA (hardware access)
Falcon, machines with GSXB driver:
Xbios functions
Other machines:
Not supported
-- --
Patrice Mandin <pmandin@caramail.com> Patrice Mandin <pmandin@caramail.com>
......
...@@ -435,6 +435,24 @@ CheckDiskAudio() ...@@ -435,6 +435,24 @@ CheckDiskAudio()
fi fi
} }
dnl Set up the Atari Audio driver
CheckAtariAudio()
{
AC_ARG_ENABLE(mintaudio,
[ --enable-mintaudio support Atari audio driver [default=yes]],
, enable_mintaudio=yes)
if test x$enable_audio = xyes -a x$enable_mintaudio = xyes; then
mintaudio=no
AC_CHECK_HEADER(mint/falcon.h, have_mint_falcon_hdr=yes)
if test x$have_mint_falcon_hdr = xyes; then
mintaudio=yes
CFLAGS="$CFLAGS -DMINTAUDIO_SUPPORT"
AUDIO_SUBDIRS="$AUDIO_SUBDIRS mint"
AUDIO_DRIVERS="$AUDIO_DRIVERS mint/libaudio_mintaudio.la"
fi
fi
}
dnl See if we can use x86 assembly blitters dnl See if we can use x86 assembly blitters
# NASM is available from: http://nasm.octium.net/ # NASM is available from: http://nasm.octium.net/
CheckNASM() CheckNASM()
...@@ -2380,14 +2398,18 @@ case "$target" in ...@@ -2380,14 +2398,18 @@ case "$target" in
CheckAtariBiosEvent CheckAtariBiosEvent
CheckAtariXbiosVideo CheckAtariXbiosVideo
CheckAtariGemVideo CheckAtariGemVideo
CheckAtariAudio
CheckPTH CheckPTH
# Set up files for the main() stub # Set up files for the main() stub
COPY_ARCH_SRC(src/main, linux, SDL_main.c) COPY_ARCH_SRC(src/main, linux, SDL_main.c)
# Set up files for the audio library # Set up files for the audio library
if test x$enable_threads = xyes -a x$enable_pth = xyes; then
if test x$enable_audio = xyes; then if test x$enable_audio = xyes; then
CFLAGS="$CFLAGS -DSUNAUDIO_SUPPORT"
AUDIO_SUBDIRS="$AUDIO_SUBDIRS sun" AUDIO_SUBDIRS="$AUDIO_SUBDIRS sun"
AUDIO_DRIVERS="$AUDIO_DRIVERS sun/libaudio_sun.la" AUDIO_DRIVERS="$AUDIO_DRIVERS sun/libaudio_sun.la"
fi fi
fi
# Set up files for the joystick library # Set up files for the joystick library
if test x$enable_joystick = xyes; then if test x$enable_joystick = xyes; then
JOYSTICK_SUBDIRS="$JOYSTICK_SUBDIRS mint" JOYSTICK_SUBDIRS="$JOYSTICK_SUBDIRS mint"
...@@ -2575,6 +2597,7 @@ src/audio/ums/Makefile ...@@ -2575,6 +2597,7 @@ src/audio/ums/Makefile
src/audio/windib/Makefile src/audio/windib/Makefile
src/audio/windx5/Makefile src/audio/windx5/Makefile
src/audio/disk/Makefile src/audio/disk/Makefile
src/audio/mint/Makefile
src/video/Makefile src/video/Makefile
src/video/XFree86/Makefile src/video/XFree86/Makefile
src/video/XFree86/extensions/Makefile src/video/XFree86/extensions/Makefile
......
...@@ -5,7 +5,8 @@ noinst_LTLIBRARIES = libaudio.la ...@@ -5,7 +5,8 @@ noinst_LTLIBRARIES = libaudio.la
# Define which subdirectories need to be built # Define which subdirectories need to be built
SUBDIRS = @AUDIO_SUBDIRS@ SUBDIRS = @AUDIO_SUBDIRS@
DIST_SUBDIRS = alsa arts baudio dma dmedia dsp esd macrom nas nto openbsd paudio sun ums windib windx5 disk DIST_SUBDIRS = alsa arts baudio dma dmedia dsp esd macrom nas nto openbsd \
paudio sun ums windib windx5 disk mint
DRIVERS = @AUDIO_DRIVERS@ DRIVERS = @AUDIO_DRIVERS@
......
...@@ -83,6 +83,9 @@ static AudioBootStrap *bootstrap[] = { ...@@ -83,6 +83,9 @@ static AudioBootStrap *bootstrap[] = {
#ifdef ENABLE_AHI #ifdef ENABLE_AHI
&AHI_bootstrap, &AHI_bootstrap,
#endif #endif
#ifdef MINTAUDIO_SUPPORT
&MINTAUDIO_bootstrap,
#endif
#ifdef DISKAUD_SUPPORT #ifdef DISKAUD_SUPPORT
&DISKAUD_bootstrap, &DISKAUD_bootstrap,
#endif #endif
...@@ -377,6 +380,9 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) ...@@ -377,6 +380,9 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
#ifdef macintosh #ifdef macintosh
/* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */ /* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */
#else
#if defined(__MINT__) && !defined(ENABLE_THREADS)
/* Uses interrupt driven audio, without thread */
#else #else
/* Create a semaphore for locking the sound buffers */ /* Create a semaphore for locking the sound buffers */
audio->mixer_lock = SDL_CreateMutex(); audio->mixer_lock = SDL_CreateMutex();
...@@ -385,7 +391,8 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) ...@@ -385,7 +391,8 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
SDL_CloseAudio(); SDL_CloseAudio();
return(-1); return(-1);
} }
#endif #endif /* __MINT__ */
#endif /* macintosh */
/* Calculate the silence and size of the audio specification */ /* Calculate the silence and size of the audio specification */
SDL_CalculateAudioSpec(desired); SDL_CalculateAudioSpec(desired);
......
...@@ -147,6 +147,9 @@ extern AudioBootStrap SNDMGR_bootstrap; ...@@ -147,6 +147,9 @@ extern AudioBootStrap SNDMGR_bootstrap;
#ifdef ENABLE_AHI #ifdef ENABLE_AHI
extern AudioBootStrap AHI_bootstrap; extern AudioBootStrap AHI_bootstrap;
#endif #endif
#ifdef MINTAUDIO_SUPPORT
extern AudioBootStrap MINTAUDIO_bootstrap;
#endif
#ifdef DISKAUD_SUPPORT #ifdef DISKAUD_SUPPORT
extern AudioBootStrap DISKAUD_bootstrap; extern AudioBootStrap DISKAUD_bootstrap;
#endif #endif
......
Makefile.in
Makefile
.libs
*.o
*.lo
*.la
## Makefile.am for SDL using Xbios/Dma/whatever available audio functions
noinst_LTLIBRARIES = libaudio_mintaudio.la
libaudio_mintaudio_la_SOURCES = $(SRCS)
# The SDL audio driver sources
SRCS = SDL_mintaudio.c \
SDL_mintaudio.h \
SDL_mintaudiointerrupt.S \
SDL_mintaudiointerrupt_s.h \
SDL_mintaudiodma.h \
SDL_mintaudiogsxb.h
This diff is collapsed.
/*
* MiNT audio driver
*
* Patrice Mandin
*/
#ifndef _SDL_mintaudio_h
#define _SDL_mintaudio_h
#include "SDL_sysaudio.h"
/* Hidden "this" pointer for the audio functions */
#define _THIS SDL_AudioDevice *this
#endif /* _SDL_mintaudio_h */
/*
* STE/TT 8 bits audio dma registers
*
* Patrice Mandin
*/
#ifndef _SDL_mintdma_h
#define _SDL_mintdma_h
#define DMAAUDIO_IO_BASE (0xffff8900)
struct DMAAUDIO_IO_S {
unsigned char int_ctrl;
unsigned char control;
unsigned char dummy1;
unsigned char start_high;
unsigned char dummy2;
unsigned char start_mid;
unsigned char dummy3;
unsigned char start_low;
unsigned char dummy4;
unsigned char cur_high;
unsigned char dummy5;
unsigned char cur_mid;
unsigned char dummy6;
unsigned char cur_low;
unsigned char dummy7;
unsigned char end_high;
unsigned char dummy8;
unsigned char end_mid;
unsigned char dummy9;
unsigned char end_low;
unsigned char dummy10[12];
unsigned char track_select; /* CODEC only */
unsigned char mode;
};
#define DMAAUDIO_IO ((*(volatile struct DMAAUDIO_IO_S *)DMAAUDIO_IO_BASE))
#endif /* _SDL_mintdma_h */
/*
* GSXB audio definitions
*
* Patrice Mandin
*/
#ifndef _SDL_mintgsxb_h
#define _SDL_mintgsxb_h
#include <mint/falcon.h> /* for trap_14_xxx macros */
/* GSXB Cookie */
#define C_GSXB 0x47535842L
/* Bit 5 in cookie _SND */
#define SND_GSXB (1<<5)
/* NSoundcmd modes */
#define SETRATE 7 /* Set sample rate */
#define SET8BITFORMAT 8 /* 8 bits format */
#define SET16BITFORMAT 9 /* 16 bits format */
#define SET24BITFORMAT 10 /* 24 bits format */
#define SET32BITFORMAT 11 /* 32 bits format */
#define LTATTEN_MASTER 12 /* Attenuation */
#define RTATTEN_MASTER 13
#define LTATTEN_MICIN 14
#define RTATTEN_MICIN 15
#define LTATTEN_FMGEN 16
#define RTATTEN_FMGEN 17
#define LTATTEN_LINEIN 18
#define RTATTEN_LINEIN 19
#define LTATTEN_CDIN 20
#define RTATTEN_CDIN 21
#define LTATTEN_VIDIN 22
#define RTATTEN_VIDIN 23
#define LTATTEN_AUXIN 24
#define RTATTEN_AUXIN 25
/* Setmode modes */
#define MONO16 3
#define STEREO24 4
#define STEREO32 5
#define MONO24 6
#define MONO32 7
/* Sndstatus modes */
#define SND_QUERYFORMATS 2
#define SND_QUERYMIXERS 3
#define SND_QUERYSOURCES 4
#define SND_QUERYDUPLEX 5
#define SND_QUERY8BIT 8
#define SND_QUERY16BIT 9
#define SND_QUERY24BIT 10
#define SND_QUERY32BIT 11
#define SND_FORMAT8 (1<<0)
#define SND_FORMAT16 (1<<1)
#define SND_FORMAT24 (1<<2)
#define SND_FORMAT32 (1<<3)
#define SND_FORMATSIGNED (1<<0)
#define SND_FORMATUNSIGNED (1<<1)
#define SND_FORMATBIGENDIAN (1<<2)
#define SND_FORMATLITTLEENDIAN (1<<3)
/* Devconnect prescalers */
#define CLK_44K 1
#define CLK_22K 3
#define CLK_11K 7
/* Extra xbios functions */
#define NSoundcmd(mode,data,data2) \
(long)trap_14_wwl((short)130,(short)(mode),(short)(data),(long)(data2))
#define NSetinterrupt(src_inter,cause,inth_addr) \
(long)trap_14_wwwl((short)135,(short)(src_inter),(short)(cause), \
(long)(inth_addr))
#endif /* _SDL_mintgsxb_h */
/*
* Audio interrupt routines
*
* Patrice Mandin
*/
.text
.globl _SDL_MintAudio_Callback
.globl _SDL_MintAudio_IntDma
.globl _SDL_MintAudio_IntXbios
.globl _SDL_MintAudio_IntGsxb
.globl _SDL_MintAudio_mutex
.globl _SDL_MintAudio_audiobuf
.globl _SDL_MintAudio_numbuf
.globl _SDL_MintAudio_audiosize
/*
How it works:
- Audio is playing buffer #0 (resp. #1)
- We must calculate a sample in buffer #1 (resp. #0)
so we first call the callback to do it
- Then we swap the buffers
*/
/*--- DMA 8 bits interrupt vector ---*/
.text
_SDL_MintAudio_IntDma:
/* Check if we are not already running */
tstw _SDL_MintAudio_mutex
bnes intdma_end
notw _SDL_MintAudio_mutex
/* Reenable interrupts */
movew #0x2300,sr
/* Swap buffers */
moveml d0-d1/a0-a1,sp@-
movel _SDL_MintAudio_numbuf,d0
movel _SDL_MintAudio_audiobuf,d1
eorl #1,d0
beqs intdma_buffer0
movel _SDL_MintAudio_audiobuf+4,d1
intdma_buffer0:
movel d0,_SDL_MintAudio_numbuf
/* Callback */
movel d1,sp@-
jsr _SDL_MintAudio_Callback
movel sp@+,d1
/* Modify DMA addresses */
lea 0xffff8900:w,a0
moveb d1,a0@(0x07) /* Start address */
rorl #8,d1
moveb d1,a0@(0x05)
rorl #8,d1
moveb d1,a0@(0x03)
swap d1
addl _SDL_MintAudio_audiosize,d1
moveb d1,a0@(0x13) /* End address */
rorl #8,d1
moveb d1,a0@(0x11)
rorl #8,d1
moveb d1,a0@(0x0f)
moveml sp@+,d0-d1/a0-a1
clrw _SDL_MintAudio_mutex
intdma_end:
bclr #5,0xfffffa0f:w
rte
/*--- Xbios interrupt vector ---*/
.text
_SDL_MintAudio_IntXbios:
/* Check if we are not already running */
tstw _SDL_MintAudio_mutex
bnes intxbios_end
notw _SDL_MintAudio_mutex
/* Reenable interrupts */
movew #0x2300,sr
/* Swap buffers */
moveml d0-d2/a0-a2,sp@-
movel _SDL_MintAudio_numbuf,d0
movel _SDL_MintAudio_audiobuf,a0
eorl #1,d0
beqs intxbios_buffer0
movel _SDL_MintAudio_audiobuf+4,a0
intxbios_buffer0:
movel d0,_SDL_MintAudio_numbuf
/* Callback */
moveml a0,sp@-
jsr _SDL_MintAudio_Callback
moveml sp@+,a0
/* Setbuffer xbios function */
movel _SDL_MintAudio_audiosize,d1
lea a0@(0,d1:l),a1
movel a1,sp@-
movel a0,sp@-
clrw sp@-
movew #131,sp@-
trap #14
lea sp@(12),sp
moveml sp@+,d0-d2/a0-a2
clrw _SDL_MintAudio_mutex
intxbios_end:
bclr #5,0xfffffa0f:w
rte
/*--- GSXB interrupt vector ---*/
.text
_SDL_MintAudio_IntGsxb:
/* Check if we are not already running */
tstw _SDL_MintAudio_mutex
bnes intgsxb_end
notw _SDL_MintAudio_mutex
/* Swap buffers */
moveml d0-d2/a0-a2,sp@-
movel _SDL_MintAudio_numbuf,d0
movel _SDL_MintAudio_audiobuf,a0
eorl #1,d0
beqs intgsxb_buffer0
movel _SDL_MintAudio_audiobuf+4,a0
intgsxb_buffer0:
movel d0,_SDL_MintAudio_numbuf
/* Callback */
moveml a0,sp@-
jsr _SDL_MintAudio_Callback
moveml sp@+,a0
/* Setbuffer xbios function */
movel _SDL_MintAudio_audiosize,d1
lea a0@(0,d1:l),a1
movel a1,sp@-
movel a0,sp@-
clrw sp@-
movew #131,sp@-
trap #14
lea sp@(12),sp
moveml sp@+,d0-d2/a0-a2
clrw _SDL_MintAudio_mutex
intgsxb_end:
rts
/*--- Common variables ---*/
.data
.even
.comm _SDL_MintAudio_mutex,4
.even
.comm _SDL_MintAudio_audiobuf,8
.even
.comm _SDL_MintAudio_numbuf,4
.even
.comm _SDL_MintAudio_audiosize,4
/*
* Audio interrupt
*
* Patrice Mandin
*/
#ifndef _SDL_MINTAUDIOINTERRUPT_S_H_
#define _SDL_MINTAUDIOINTERRUPT_S_H_
#include "SDL_types.h"
/* Variables */
extern void *SDL_MintAudio_audiobuf[2]; /* Pointers to buffers */
extern long SDL_MintAudio_audiosize; /* Length of audio buffer */
extern long SDL_MintAudio_numbuf; /* Buffer to play */
extern long SDL_MintAudio_mutex;
/* Functions */
void SDL_MintAudio_IntDma(void);
void SDL_MintAudio_IntXbios(void);
void SDL_MintAudio_IntGsxb(void);
#endif /* _SDL_MINTAUDIOINTERRUPT_S_H_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment