#ifndef _FSong_H
#define _FSong_H

#include "TimTypes.h"
#include "kernel.h"

const _kernel_oserror* Songs_Init(GlobHdr* g, void* pw);
const _kernel_oserror* Songs_Finalize(GlobHdr* g, void* pw);
const _kernel_oserror* ISong_Lister(_kernel_swi_regs* r, ISong* s);
void Songs_UnloadAll(GlobHdr* g);

const _kernel_oserror* Song_GetSongHeader(const GlobHdr* g, uint32_t id, ISong** ppSong);

const _kernel_oserror* Module_SaveConfig(GlobHdr* g, const char* pfilename);
const _kernel_oserror* Module_LoadConfig(GlobHdr* g, const char* pfilename);
const _kernel_oserror* swi_Configure(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Configure_Songs(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Load(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Unload(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_New(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Load2(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Decompress(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* swi_Song_Play(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Pause(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Stop(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Position(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Volume(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Status(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Configure(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_PlayRange(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* swi_Song_Info(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_Texts(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_InitialSettings(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Channel_InitialSettings(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_PlayInfo(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_SectionInfo(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* swi_Pattern_Info(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Row_Info(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* swi_Sample_Info(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Sample_Misc(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Sample_Loops(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Sample_Vibrato(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* swi_Instrument_Vibrato(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_Info(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_Volume(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_Panning(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_Filter(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_VolumeEnvelope(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_PanningEnvelope(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_PitchEnvelope(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Instrument_FilterEnvelope(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* swi_Song_SongParams(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_ChannelParams(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Song_VChannelParams(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Channel_Status(GlobHdr* g, _kernel_swi_regs* r);
const _kernel_oserror* swi_Channel_Variable(GlobHdr* g, _kernel_swi_regs* r);

const _kernel_oserror* Sample_GetHeader(const ISong* pSong, unsigned int nr, const Sample** ppSample);
const _kernel_oserror* Instrument_GetHeader(const ISong* pSong, unsigned int nr, const Instrument** ppInst);

#endif
