#Include "crt.bi"
#Include "squall.bi"

'-----------------------------------------------------------------------------
' Открыти файла
' на входе    :  filename - указатель на имя файла
' на выходе   :  хендлер файла, если значение рано -1 значит произошла ошибка
'-----------------------------------------------------------------------------
Function my_open Cdecl(filename As ZString Ptr) As UInteger
	printf(!"my_open(%s)\n", filename)
	Return fopen(filename, "rb")
End Function

'-----------------------------------------------------------------------------
' Чтение данных из файла
' на входе    :  handler  -  хендлер файла
'                buffer   -  указатель на буфер в который нужно читать данные
'                size     -  количество читаемых данных
' на выходе   :  количество прочитанных данных
'-----------------------------------------------------------------------------
Function my_read Cdecl(handler As UInteger, buffer As Any Ptr, size As Integer) As Integer
	printf(!"my_read(%d, 0x%X, %d)\n", handler, buffer, size)
	If fread(buffer, size, 1, Cast(FILE Ptr,handler)) Then
		Return size
	EndIf
	Return -1
End Function




'-----------------------------------------------------------------------------
' Позиционирование в файле
' на входе    :  handler  -  хендлер файла
'                position -  новая позиция в файле
'                mode     -  режим позиционирования
' на выходе   :  новая позиция в файле
'-----------------------------------------------------------------------------
Function my_seek Cdecl(handler As UInteger, position As Integer, mode As Integer) As Integer
	printf(!"my_seek(%d, %d, %d)\n", handler, position, mode)
	fseek(Cast(FILE Ptr, handler), position, mode)
	Return ftell(Cast(FILE Ptr ,handler))
End Function


'-----------------------------------------------------------------------------
' Закрыти открытого файла
' на входе    :  handler  -  хендлер файла
' на выходе   :  *
'-----------------------------------------------------------------------------
Sub my_close Cdecl(handler As UInteger)
	printf(!"my_close(%d)\n", handler)
	fclose(Cast(FILE Ptr,handler))
End Sub

'-----------------------------------------------------------------------------
' Выделение памяти
' на входе    :  size  - количество выделяемой памяти
' на выходе   :  указатель на выделенную память, если значение равно 0 значит
'                выделение памяти не состоялось
'-----------------------------------------------------------------------------
Function my_alloc Cdecl(size As UInteger) As Any Ptr

	printf(!"my_alloc(%d)\n", size)

	' проверка входных параметров
	If (size = 0) Then
		Return 0
	EndIf

	' выделение памяти
	Return malloc(size)
End Function

'-----------------------------------------------------------------------------
' Освобождение памяти
' на входе    :  ptr   - указатель на выделеннй блок памяти
' на выходе   :  *
'-----------------------------------------------------------------------------
Sub my_free Cdecl(mem As Any Ptr)

	printf(!"my_free(0x%X)\n", mem)
	' проверка параметров
	If (mem <> 0) Then
		free(mem)
	EndIf

End Sub

'-----------------------------------------------------------------------------
' Основной цикл
' на входе    :  ptr   - указатель на выделеннй блок памяти
' на выходе   :  *
'-----------------------------------------------------------------------------

Dim As Integer   key
Dim As Integer   sample

SQUALL_SetFileCallbacks(@my_open, @my_seek, @my_read, @my_close)
SQUALL_SetMemoryCallbacks(@my_alloc, @my_free)

If (SQUALL_Init(0) < 0) Then
	printf(!"error init squall!")
EndIf

sample = SQUALL_Sample_LoadFile("music.ogg", 0, 0)

SQUALL_Sample_Play(sample, 0, 0, 1)

' ожидание выхода
Do
	Sleep(10)
Loop Until MultiKey(1)

SQUALL_Free()

