#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);