home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
001-099
/
ff055.lzh
/
SoundExample
/
SoundExample.c
< prev
Wrap
C/C++ Source or Header
|
1987-03-01
|
6KB
|
179 lines
/*
* manx.aztec/amiga #530, from jgoodnow, 4568 chars, Fri Feb 6 02:48:41 1987
*
* Well, here is the double buffered sound example working with 16 bit
* ints, small code and small data. Note the Disable/Enable bracketing
* around the BeginIO() call in the interrupt routine. Without them,
* it crashes pretty reliably. Took a while to find that....
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/interrupts.h>
#include <exec/errors.h>
#include <hardware/custom.h>
#include <libraries/dos.h>
#include <devices/audio.h>
#define BUFSIZE 250L
#define STP2 10
#define STSIZE (1<<STP2)
#define STSTEP (2*3.141593/STSIZE)
#define XMOUSEREG (*((BYTE *)0xdff00b))
#define YMOUSEREG (-(*(BYTE *)0xdff00a))
extern struct MsgPort *CreatePort();
extern struct Library *OpenLibrary();
extern void *AllocMem();
extern struct IOAudio *GetMsg();
UBYTE allocationMap[]={1,8,2,4};
struct Library *MathBase=0;
struct MsgPort *allocPort=0;
struct IOAudio *allocIOB=0;
struct Device *device=0;
struct Interrupt *interrupt=0;
struct MsgPort *soundPort=0;
BYTE *buffer[2]={0};
struct IOAudio *soundIOB[2]={0};
int newBuffer();
UBYTE sineTable[STSIZE];
ULONG angle=0;
ULONG frequency=0x2000000;
BYTE lastYMouse;
main()
{
int i;
FLOAT sine=0.0;
FLOAT cosine=1.0;
if((MathBase=OpenLibrary("mathffp.library",0L))==0)
cleanup("Cannot open math library");
for(i=0;i<STSIZE; ++i) {
sineTable[i]=127*sine+0.5;
sine += STSTEP * (cosine -= STSTEP * sine);
}
lastYMouse=YMOUSEREG;
if((allocPort=CreatePort("sound example",0L))==0)
cleanup("Cannot create reply port");
if((allocIOB=AllocMem((long)sizeof(struct IOAudio),
MEMF_PUBLIC|MEMF_CLEAR))==0)
cleanup("Out of memory");
allocIOB->ioa_Request.io_Message.mn_Node.ln_Pri=-40;
allocIOB->ioa_Request.io_Message.mn_ReplyPort=allocPort;
allocIOB->ioa_Data=allocationMap;
allocIOB->ioa_Length=sizeof(allocationMap);
switch(OpenDevice(AUDIONAME,0L,allocIOB,0L)) {
case IOERR_OPENFAIL:
cleanup("Cannot open audio device");
case ADIOERR_ALLOCFAILED:
cleanup("Cannot allocate audio channel");
}
device=allocIOB->ioa_Request.io_Device;
if((interrupt=AllocMem((long)sizeof(struct Interrupt),
MEMF_CLEAR|MEMF_PUBLIC))==0)
cleanup("Out of memory");
interrupt->is_Code=(VOID(*)())newBuffer;
if((soundPort=AllocMem((long)sizeof(struct MsgPort),
MEMF_CLEAR|MEMF_CHIP))==0)
cleanup("Out of memory");
soundPort->mp_Flags=PA_SOFTINT;
soundPort->mp_SigTask=(struct Task *)interrupt;
soundPort->mp_Node.ln_Type=NT_MSGPORT;
NewList(&soundPort->mp_MsgList);
for (i=0; i<2; ++i) {
if((buffer[i]=AllocMem(BUFSIZE,MEMF_CHIP))==0)
cleanup("Out of Memory");
if((soundIOB[i]=AllocMem((LONG) sizeof(struct IOAudio),
MEMF_PUBLIC|MEMF_CLEAR))==0)
cleanup("Out of memory");
soundIOB[i]->ioa_Request.io_Message.mn_ReplyPort=soundPort;
soundIOB[i]->ioa_Request.io_Device=device;
soundIOB[i]->ioa_Request.io_Unit=allocIOB->ioa_Request.io_Unit;
soundIOB[i]->ioa_Request.io_Command=CMD_WRITE;
soundIOB[i]->ioa_Request.io_Flags=ADIOF_PERVOL;
soundIOB[i]->ioa_AllocKey=allocIOB->ioa_AllocKey;
soundIOB[i]->ioa_Data=(UBYTE *)buffer[i];
soundIOB[i]->ioa_Length=BUFSIZE;
soundIOB[i]->ioa_Period=200;
soundIOB[i]->ioa_Volume=64;
soundIOB[i]->ioa_Cycles=1;
ReplyMsg(soundIOB[i]);
}
printf("Press ctrl-c to stop\n");
Wait(SIGBREAKF_CTRL_C);
cleanup("");
} /* end main */
/************************************/
cleanup(mes)
TEXT *mes;
{
int i;
printf(mes);
printf("\n");
if(device!=0)
CloseDevice(allocIOB);
for(i=0; i<2; ++i) {
if(soundIOB[i])
FreeMem(soundIOB[i],(LONG)sizeof(struct IOAudio));
if(buffer[i])
FreeMem(buffer[i],BUFSIZE);
}
if(soundPort)
FreeMem(soundPort,(LONG)sizeof(struct MsgPort));
if(interrupt)
FreeMem(interrupt,(LONG) sizeof(struct Interrupt));
if(allocIOB)
FreeMem(allocIOB,(LONG)sizeof(struct IOAudio));
if(allocPort)
DeletePort(allocPort,(LONG)sizeof(struct MsgPort));
if (MathBase)
CloseLibrary(MathBase);
exit(0);
}
newBuffer()
{
int i;
struct IOAudio *ioa;
BYTE *buffer;
BYTE mouseChange,curYMouse;
ULONG newFreq;
#asm
movem.l d2/d3/a4,-(sp)
#endasm
geta4();
ioa=GetMsg(soundPort);
if (ioa && ioa->ioa_Request.io_Error==0) {
curYMouse=YMOUSEREG;
mouseChange=curYMouse-lastYMouse;
lastYMouse=curYMouse;
newFreq=frequency+mouseChange*(frequency>>6);
if(newFreq>0x800000 && newFreq <0x40000000)
frequency=newFreq;
buffer=(BYTE *)ioa->ioa_Data;
for(i=0; i<BUFSIZE; ++i)
*buffer++=sineTable[(angle+=frequency)>>(32-STP2)];
Disable();
BeginIO(ioa);
Enable();
}
;
#asm
movem.l (sp)+,d2/d3/a4
#endasm
}