view sidlib.h @ 226:c32015f4969e

Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib prefix used otherwise. Add new function sidlib_read_sid_file_alloc() which allocates the PSID header struct, instead of sidlib_read_sid_file() which just reads into the given struct.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 03 Jan 2020 10:38:18 +0200
parents 4bec78f45188
children 2b3d5d49086d
line wrap: on
line source

/*
 * SIDInfoLib - Way too simplistic PSID/RSID file library
 * Programmed and designed by Matti 'ccr' Hämäläinen <ccr@tnsp.org>
 * (C) Copyright 2014-2019 Tecnic Software productions (TNSP)
 */
#ifndef SIDLIB_H
#define SIDLIB_H 1

#include "th_util.h"
#include "th_ioctx.h"
#include "th_crypto.h"
#include "th_datastruct.h"


#ifdef __cplusplus
extern "C" {
#endif


//
// Some constants
//
#define SIDLIB_PSID_MAGIC_LEN    4
#define SIDLIB_PSID_STR_LEN      32
#define SIDLIB_PSID_BUFFER_SIZE  (1024 * 16)


enum
{
    // Player flags
    PSF_PLAYER_TYPE   = 0x01, // 0 = built-in, 1 = Compute! SIDPlayer MUS
    PSF_PLAYSID_TUNE  = 0x02, // 0 = Real C64-compatible, 1 = PlaySID specific (v2NG)

    // Video standard used (v2NG+)
    PSF_CLOCK_UNKNOWN = 0x00,
    PSF_CLOCK_PAL     = 0x01,
    PSF_CLOCK_NTSC    = 0x02,
    PSF_CLOCK_ANY     = 0x03,
    PSF_CLOCK_MASK    = 0x03,

    // SID model (v2NG+)
    PSF_MODEL_UNKNOWN = 0x00,
    PSF_MODEL_MOS6581 = 0x01,
    PSF_MODEL_MOS8580 = 0x02,
    PSF_MODEL_ANY     = 0x03,
    PSF_MODEL_MASK    = 0x03,
};


//
// Structures
//
typedef struct
{
    th_llist_t node;

    th_md5hash_t    hash;       // MD5 hash-digest
    int             nlengths;   // Number of lengths
    int             *lengths;   // Lengths in seconds
} SIDLibSLDBNode;


typedef struct
{
    SIDLibSLDBNode  *nodes, **pindex;
    size_t nnodes;
} SIDLibSLDB;


typedef struct
{
    char magic[SIDLIB_PSID_MAGIC_LEN + 1]; // "PSID" / "RSID" magic identifier
    uint16_t
        version,         // Version number
        dataOffset,      // Start of actual c64 data in file
        loadAddress,     // Loading address
        initAddress,     // Initialization address
        playAddress,     // Play one frame
        nSongs,          // Number of subsongs
        startSong;       // Default starting song
    uint32_t speed;      // Speed
    char *sidName;       // Descriptive text-fields, ASCIIZ
    char *sidAuthor;
    char *sidCopyright;

    // PSIDv2+ data
    uint16_t flags;      // Flags
    uint8_t  startPage, pageLength;
    uint8_t  sid2Addr, sid3Addr;

    // Extra data
    BOOL isRSID;
    size_t dataSize;     // Total size of data - header
    th_md5hash_t hash;   // Songlength database hash

    SIDLibSLDBNode *lengths; // Songlength information node pointer
    BOOL allocated; // TRUE if structure has been allocated

} SIDLibPSIDHeader;


//
// Functions
//
int              sidlib_read_sid_file(th_ioctx *ctx, SIDLibPSIDHeader *psid, const BOOL newSLDB);
int              sidlib_read_sid_file_alloc(th_ioctx *ctx, SIDLibPSIDHeader **ppsid, const BOOL newSLDB);
void             sidlib_free_sid_file(SIDLibPSIDHeader *psid);

const char *     sidlib_get_sid_clock_str(const int flags);
const char *     sidlib_get_sid_model_str(const int flags);

SIDLibSLDB *     sidlib_sldb_new(void);
int              sidlib_sldb_read(th_ioctx *ctx, SIDLibSLDB *dbh);
int              sidlib_sldb_build_index(SIDLibSLDB *dbh);
void             sidlib_sldb_free(SIDLibSLDB *dbh);
SIDLibSLDBNode * sidlib_sldb_get_by_hash(SIDLibSLDB *dbh, th_md5hash_t hash);

int              sidlib_sldb_read_bin(th_ioctx *ctx, SIDLibSLDB *dbh);
int              sidlib_sldb_write_bin(th_ioctx *ctx, const SIDLibSLDB *dbh);


#ifdef __cplusplus
}
#endif
#endif // SIDLIB_H