//-------------------------------------------------------------------------------------------------------
// VST Plug-Ins SDK
// Version 2.4      $Date: 2006/02/09 11:05:51 $
//
// Category     : VST 2.x Interfaces
// Filename     : vstfxstore.h
// Created by   : Steinberg Media Technologies
// Description  : Definition of Program (fxp) and Bank (fxb) structures
//
// © 2006, Steinberg Media Technologies, All Rights Reserved
//-------------------------------------------------------------------------------------------------------

#ifndef __vstfxstore__
#define __vstfxstore__

#ifndef __aeffect__
#include "aeffect.h"
#endif

//-------------------------------------------------------------------------------------------------------
/** Root chunk identifier for Programs (fxp) and Banks (fxb). */
#define cMagic              'CcnK'

/** Regular Program (fxp) identifier. */
#define fMagic              'FxCk'

/** Regular Bank (fxb) identifier. */
#define bankMagic           'FxBk'

/** Program (fxp) identifier for opaque chunk data. */
#define chunkPresetMagic    'FPCh'

/** Bank (fxb) identifier for opaque chunk data. */
#define chunkBankMagic      'FBCh'

/*
    Note: The C data structures below are for illustration only. You can not read/write them directly.
    The byte order on disk of fxp and fxb files is Big Endian. You have to swap integer
    and floating-point values on Little Endian platforms (Windows, MacIntel)!
*/

//-------------------------------------------------------------------------------------------------------
/** Program (fxp) structure. */
//-------------------------------------------------------------------------------------------------------
struct fxProgram
{
//-------------------------------------------------------------------------------------------------------
    VstInt32 chunkMagic;        ///< 'CcnK'
    VstInt32 byteSize;          ///< size of this chunk, excl. magic + byteSize

    VstInt32 fxMagic;           ///< 'FxCk' (regular) or 'FPCh' (opaque chunk)
    VstInt32 version;           ///< format version (currently 1)
    VstInt32 fxID;              ///< fx unique ID
    VstInt32 fxVersion;         ///< fx version

    VstInt32 numParams;         ///< number of parameters
    char prgName[28];           ///< program name (null-terminated ASCII string)

    union
    {
        float params[1];        ///< variable sized array with parameter values
        struct
        {
            VstInt32 size;      ///< size of program data
            char chunk[1];      ///< variable sized array with opaque program data
        } data;                 ///< program chunk data
    } content;                  ///< program content depending on fxMagic
//-------------------------------------------------------------------------------------------------------
};

//-------------------------------------------------------------------------------------------------------
/** Bank (fxb) structure. */
//-------------------------------------------------------------------------------------------------------
struct fxBank
{
//-------------------------------------------------------------------------------------------------------
    VstInt32 chunkMagic;        ///< 'CcnK'
    VstInt32 byteSize;          ///< size of this chunk, excl. magic + byteSize

    VstInt32 fxMagic;           ///< 'FxBk' (regular) or 'FBCh' (opaque chunk)
    VstInt32 version;           ///< format version (1 or 2)
    VstInt32 fxID;              ///< fx unique ID
    VstInt32 fxVersion;         ///< fx version

    VstInt32 numPrograms;       ///< number of programs

#if VST_2_4_EXTENSIONS
    VstInt32 currentProgram;    ///< version 2: current program number
    char future[124];           ///< reserved, should be zero
#else
    char future[128];           ///< reserved, should be zero
#endif

    union
    {
        fxProgram programs[1];  ///< variable number of programs
        struct
        {
            VstInt32 size;      ///< size of bank data
            char chunk[1];      ///< variable sized array with opaque bank data
        } data;                 ///< bank chunk data
    } content;                  ///< bank content depending on fxMagic
//-------------------------------------------------------------------------------------------------------
};

#endif // __vstfxstore__
