''
'' $Id: Audio.bas,v 1.5 1994/03/16 10:54:43 alex Rel $
''
'' Simple audio.device example
''
'' Derived from RKM example (c) Copyright 1992 Commodore-Amiga, Inc.
''

DEFINT A-Z

'REM $INCLUDE Exec.bh
'REM $INCLUDE Graphics.bh
'REM $INCLUDE Audio.bc

REM $INCLUDE BLib/ExecSupport.bas

LIBRARY OPEN "exec.library", LIBRARY_MINIMUM&
LIBRARY OPEN "graphics.library", LIBRARY_MINIMUM&

'
'Ask the system if we are PAL or NTSC and set clock constant accordingly 
'
FUNCTION getAudioClock&
	STATIC GfxBase&, palflag

	getAudioClock& = -1&
	palflag = PAL&
	IF PEEKW(LIBRARY("graphics.library") + lib_Version) >= 39 THEN
		'V39 and above have an early-start independent PAL detection method

		palflag = REALLY_PAL&
	END IF
	IF PEEKW(LIBRARY("graphics.library") + DisplayFlags) AND palflag THEN
		getAudioClock& = 3546895&	'PAL clock
	ELSE
		getAudioClock& = 3579545&	'NTSC clock
	END IF
END FUNCTION

'
'Set up the audio I/O block for channel allocation
'
SUB allocateAudioChannels(BYVAL audioIO&, BYVAL audioMP&)
	STATIC ioreq&, whichannel&

	ioreq& = audioIO& + ioa_Request

	POKEL ioreq& + IORequestio_Message + mn_ReplyPort, audioMP&	' the address of a reply port
	POKEB ioreq& + IORequestio_Message + mn_Node + ln_Pri, 0	' neutral priority
	POKEW ioreq& + IORequestio_Command, ADCMD_ALLOCATE&		' allocate the channels
	POKEB ioreq& + IORequestio_Flags, ADIOF_NOWAIT&

	POKEW audioIO& + ioa_AllocKey, 0

	whichannel& = &h01020408	' channel allocation
	POKEL audioIO& + ioa_Data, VARPTR(whichannel&)
	POKEL audioIO& + ioa_Length, 4
END SUB


'
'Set up audio I/O block to play a sample using CMD_WRITE
'
SUB setupAudioPlay(BYVAL audioIO&, BYVAL audioMP&, _
  BYVAL waveptr&, BYVAL samples&, BYVAL frequency&, BYVAL samcyc&, _
  BYVAL duration&, BYVAL clock&)
	STATIC ioreq&, whichannel&

	'The io_Flags are set to ADIOF_PERVOL so we can set the
	'period (speed) and volume with the our sample;
	'ioa_Data points to the sample; ioa_Length gives the length
	'ioa_Cycles tells how many times to repeat the sample
	'If you want to play the sample at a given sampling rate,
	'set ioa_Period = clock/(given sampling rate)

	ioreq& = audioIO& + ioa_Request

	POKEL ioreq& + IORequestio_Message + mn_ReplyPort, audioMP&	' the address of a reply port
	POKEW ioreq& + IORequestio_Command, CMD_WRITE&
	POKEB ioreq& + IORequestio_Flags, ADIOF_PERVOL&

	POKEL audioIO& + ioa_Data, waveptr&
	POKEL audioIO& + ioa_Length, samples&

	POKEW audioIO& + ioa_Period, (clock& * samcyc&) \ (samples& * frequency&)
	POKEW audioIO& + ioa_Volume, 64
	POKEW audioIO& + ioa_Cycles, (frequency& * duration&) \ samcyc&
END SUB

SUB main
	STATIC clock&, waveptr&, audioIO&, audioMP&, device&, junk&

	clock& = getAudioClock&
	IF clock& <> -1 THEN
		'
		'Create an audio I/O block so we can send commands to the audio device
		'
		audioIO& = AllocMem(IOAudio_sizeof, MEMF_PUBLIC& OR MEMF_CLEAR&)
		IF audioIO& <> 0 THEN
			'
			'Create a reply port so the audio device can reply to our commands
			'
			audioMP& = CreatePort&(NULL&, 0)
			IF audioMP& <> 0 THEN
				allocateAudioChannels audioIO&,audioMP&
				device& = OpenDevice&(SADD("audio.device" + CHR$(0)), 0, audioIO&, 0)
				IF device& = 0 THEN
					'
					'Create a very simple audio sample in memory
					'
					waveptr& = AllocMem&(2, MEMF_CHIP& OR MEMF_PUBLIC&)
					IF waveptr& <> 0 THEN
						POKEB waveptr& + 0, 127
						POKEB waveptr& + 1, -127
						setupAudioPlay audioIO&, audioMP&, waveptr&, 2, 440, 1, 3, clock&
						BeginIO audioIO&
						junk& = WaitPort(audioMP&)
						junk& = GetMsg(audioMP&)
						FreeMem waveptr&, 2
					END IF
					CloseDevice audioIO&
				END IF
				DeletePort AudioMP&
			END IF
			FreeMem AudioIO&, IOAudio_sizeof
		END IF
	END IF
END SUB

main	' start the main program
END
