#include <stddef.h>
#include <stdint.h>
#define SMACKTRACK1 0x02000 // Play audio track 1
#define SMACKTRACK2 0x04000 // Play audio track 2
#define SMACKTRACK3 0x08000 // Play audio track 3
#define SMACKTRACK4 0x10000 // Play audio track 4
#define SMACKTRACK5 0x20000 // Play audio track 5
#define SMACKTRACK6 0x40000 // Play audio track 6
#define SMACKTRACK7 0x80000 // Play audio track 7
#define SMACKTRACKS (SMACKTRACK1 | SMACKTRACK2 | SMACKTRACK3 | SMACKTRACK4 | SMACKTRACK5 | SMACKTRACK6 | SMACKTRACK7)
#define SMACKAUTOEXTRA 0xffffffff
typedef struct SmackTag {
unsigned long Version;
unsigned long Width;
unsigned long Height;
unsigned long Frames;
unsigned long MSPerFrame;
unsigned long SmackerType;
unsigned long LargestInTrack[7];
unsigned long tablesize;
unsigned long codesize;
unsigned long absize;
unsigned long detailsize;
unsigned long typesize;
unsigned long TrackType[7];
unsigned long extra;
unsigned long NewPalette;
unsigned char Palette[772];
unsigned long PalType;
unsigned long FrameNum;
unsigned long FrameSize;
unsigned long SndSize;
unsigned long LastRectx;
unsigned long LastRecty;
unsigned long LastRectw;
unsigned long LastRecth;
unsigned long OpenFlags;
unsigned long LeftOfs;
unsigned long TopOfs;
unsigned long ReadError;
unsigned long addr32;
// added by dethrace
void* smk_handle; // opaque pointer to the libsmacker instance
int audio_sample_rate;
int audio_frame_size_in_bytes; // TODO: consider using SndSize for storage instead?
void* audio_paged_buffer; // opaque pointer to a miniaudio ma_paged_audio_buffer struct
void* audio_paged_buffer_data; // opaque pointer to a miniaudio ma_paged_audio_buffer_data struct
void* audio_converter; // opaque pointerto a miniaudio ma_data_converter struct
void* audio_track; // opaque pointer to a miniaudio ma_sound struct
} Smack;
Smack* SmackOpen(const char* name, uint32_t flags, uint32_t extrabuf);
int SmackSoundUseDirectSound(void* dd); // NULL mean create instance (apparently)
void SmackToBuffer(Smack* smack, uint32_t left, uint32_t top, uint32_t pitch, uint32_t destheight, void* buf, uint32_t flags);
uint32_t SmackDoFrame(Smack* smack);
void SmackNextFrame(Smack* smack);
uint32_t SmackWait(Smack* smack);
void SmackClose(Smack* smack);