; MINI.ASM
; --------
; Minimalistic uFMOD usage example.

; Shows how to play an XM track in memory,
; including proper error handling.

; A precompiled version (not packed or whatever) is
; available in bin\

use32
org 0
db 'MENUET01'
dd 1
dd START         ; Entry point
dd uFMOD_IMG_END ; End of code and initialized data
dd MEMORY_END    ; End of uninitialized (BSS) data
dd STACK_B       ; Bottom of the stack
dd 0             ; Args
dd 0             ; Reserved

; uFMOD setup:
UF_FREQ  equ 48000  ; Set sampling rate to 48KHz  (22050, 44100, 48000)
UF_RAMP  equ STRONG ; Select STRONG interpolation (NONE, WEAK, STRONG)
UD_MODE  equ UNSAFE ; Select UNSAFE mode          (NORMAL, UNSAFE)
DEBUG    equ 0      ; Skip debug-board messages
NOLINKER equ 1      ; Select "no linker" mode

; uFMOD constants:
XM_MEMORY         = 1
XM_FILE           = 2
XM_NOLOOP         = 8
XM_SUSPENDED      = 16
uFMOD_MIN_VOL     = 0
uFMOD_MAX_VOL     = 25
uFMOD_DEFAULT_VOL = 25

; The XM track.
xm        file '..\ufmodlib\media\mini.xm'
xm_length = $ - xm

; Optimization:
; This header file is suitable for mini.xm track only!
; If you change the track, update the optimization header.
; (Use the standart eff.inc file for a general purpose player app.)
include '..\ufmodlib\media\mini.eff.inc'

; Include the GUI framework.
FRMWRK_CALLBACK_ON equ 1 ; Enable callback
include 'frmwrk.asm'

; UI text messages.
msg_txt   db "uFMOD ruleZ!"
msg_txt_l = $ - msg_txt
msg_cap   db "FASM",0
err_txt   db "Error"
err_txt_l = $ - err_txt
err_cap   db ":-(",0

START:
	; Start playback.
	push XM_MEMORY
	push xm_length
	push xm
	call _uFMOD_LoadSong

	; Stack fixing is required here, but in this simple
	; example leaving ESP as it is won't harm. In a real
	; application you should uncomment the following line:
	; add esp,12

	test eax,eax
	jz error

	; Wait for user input.
	push _uFMOD_WaveOut ; cbProc <- continue fetching data!
	push msg_txt_l      ; cbString
	push msg_txt        ; lpString
	push msg_cap        ; szCap
	call _MessageBoxCB
	; add esp,16

	; Stop playback.
	call _uFMOD_StopSong

r:      ; Exit.
	xor eax,eax
	dec eax
	int 40h

error:
	push 0              ; cbProc <- no callback
	push err_txt_l      ; cbString
	push err_txt        ; lpString
	push err_cap        ; szCap
	call _MessageBoxCB
	; add esp,16
	jmp r

	; Include the whole uFMOD sources here. (Right after
	; your main code to avoid naming conflicts, but still
	; inside your code section.)
	macro PUBLIC symbol {} ; hide all publics
	include '..\ufmodlib\src\fasm.asm'

align 4
	rb 1020
STACK_B dd ? ; Stack bottom
MEMORY_END:  ; End of uninitialized (BSS) data