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:
Do the classic configure, with --disable-shared --enable-static and:
Tos version (should run everywhere):
--disable-audio --disable-threads
Tos does not support threads, so can not support audio, maybe in a future
version audio support will be added via interrupts.
--disable-threads
Tos does not support threads.
MiNT version (maybe Magic, only for multitasking OS):
--disable-pthreads --enable-pth
......@@ -50,11 +49,11 @@ Mouse (XBIOS, GEM, Ikbd)
Video (XBIOS (Fullscreen), GEM (Windowed and Fullscreen))
Timer (VBL vector)
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:
Audio support (TOS)
CDROM support (Metados, /dev/cdrom)
Threads support (TOS)
- Driver combinations:
Video Kbd Mouse Timer Jstick Joypads
......@@ -69,15 +68,20 @@ to report this type event.
==============================================================================
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
Set to 'ikbd' to force IKBD 6301 keyboard driver
Set to 'gemdos' to force gemdos 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:
Use any of these strings in the environment variable to enable or
disable a joystick:
......@@ -151,7 +155,19 @@ Joypad driver:
Available if _MCH cookie is STE or Falcon.
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>
......
......@@ -435,6 +435,24 @@ CheckDiskAudio()
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
# NASM is available from: http://nasm.octium.net/
CheckNASM()
......@@ -2380,13 +2398,17 @@ case "$target" in
CheckAtariBiosEvent
CheckAtariXbiosVideo
CheckAtariGemVideo
CheckAtariAudio
CheckPTH
# Set up files for the main() stub
COPY_ARCH_SRC(src/main, linux, SDL_main.c)
# Set up files for the audio library
if test x$enable_audio = xyes; then
AUDIO_SUBDIRS="$AUDIO_SUBDIRS sun"
AUDIO_DRIVERS="$AUDIO_DRIVERS sun/libaudio_sun.la"
if test x$enable_threads = xyes -a x$enable_pth = xyes; then
if test x$enable_audio = xyes; then
CFLAGS="$CFLAGS -DSUNAUDIO_SUPPORT"
AUDIO_SUBDIRS="$AUDIO_SUBDIRS sun"
AUDIO_DRIVERS="$AUDIO_DRIVERS sun/libaudio_sun.la"
fi
fi
# Set up files for the joystick library
if test x$enable_joystick = xyes; then
......@@ -2575,6 +2597,7 @@ src/audio/ums/Makefile
src/audio/windib/Makefile
src/audio/windx5/Makefile
src/audio/disk/Makefile
src/audio/mint/Makefile
src/video/Makefile
src/video/XFree86/Makefile
src/video/XFree86/extensions/Makefile
......
......@@ -5,7 +5,8 @@ noinst_LTLIBRARIES = libaudio.la
# Define which subdirectories need to be built
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@
......
......@@ -83,6 +83,9 @@ static AudioBootStrap *bootstrap[] = {
#ifdef ENABLE_AHI
&AHI_bootstrap,
#endif
#ifdef MINTAUDIO_SUPPORT
&MINTAUDIO_bootstrap,
#endif
#ifdef DISKAUD_SUPPORT
&DISKAUD_bootstrap,
#endif
......@@ -377,6 +380,9 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
#ifdef macintosh
/* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */
#else
#if defined(__MINT__) && !defined(ENABLE_THREADS)
/* Uses interrupt driven audio, without thread */
#else
/* Create a semaphore for locking the sound buffers */
audio->mixer_lock = SDL_CreateMutex();
......@@ -385,7 +391,8 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
SDL_CloseAudio();
return(-1);
}
#endif
#endif /* __MINT__ */
#endif /* macintosh */
/* Calculate the silence and size of the audio specification */
SDL_CalculateAudioSpec(desired);
......
......@@ -147,6 +147,9 @@ extern AudioBootStrap SNDMGR_bootstrap;
#ifdef ENABLE_AHI
extern AudioBootStrap AHI_bootstrap;
#endif
#ifdef MINTAUDIO_SUPPORT
extern AudioBootStrap MINTAUDIO_bootstrap;
#endif
#ifdef DISKAUD_SUPPORT
extern AudioBootStrap DISKAUD_bootstrap;
#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