bnkf.c 3.55 KB
/*====================================================================
 * bnkf.c
 *
 * Copyright 1993, Silicon Graphics, Inc.
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
 * Inc.; the contents of this file may not be disclosed to third
 * parties, copied or duplicated in any form, in whole or in part,
 * without the prior written permission of Silicon Graphics, Inc.
 *
 * RESTRICTED RIGHTS LEGEND:
 * Use, duplication or disclosure by the Government is subject to
 * restrictions as set forth in subdivision (c)(1)(ii) of the Rights
 * in Technical Data and Computer Software clause at DFARS
 * 252.227-7013, and/or in similar or successor clauses in the FAR,
 * DOD or NASA FAR Supplement. Unpublished - rights reserved under the
 * Copyright Laws of the United States.
 *====================================================================*/

#include <libaudio.h>

/*
 * ### when the file format settles down a little, I'll remove these
 * ### for efficiency.
 */
static  void _bnkfPatchBank(ALBank *bank, int offset, int table);
static  void _bnkfPatchInst(ALInstrument *i, int offset, int table);
static  void _bnkfPatchSound(ALSound *s, int offset, int table);
static  void _bnkfPatchWaveTable(ALWaveTable *w, int offset, int table);

void alSeqFileNew(ALSeqFile *file)
{
    int offset = (int) file;
    int i;
    
    /* ### check the revision in debug libraries */

    /*
     * patch the file so that offsets are pointers
     */
    for (i = 0; i < file->seqCount; i++) {
        file->seqArray[i].offset = (char *)((char *)file->seqArray[i].offset + offset);
    }
}

void alBnkfNew(ALBankFile *file, char *table)
{
    int offset = (int) file;
    int woffset = (int) table;
    
    int i,j,k;
    
    /* ### check the revision in debug libraries */

    /*
     * patch the file so that offsets are pointers
     */
    for (i = 0; i < file->bankCount; i++) {
        file->bankArray[i] = (ALBank *)((char *)file->bankArray[i] + offset);
        _bnkfPatchBank(file->bankArray[i], offset, woffset);
    }
}

void _bnkfPatchBank(ALBank *bank, int offset, int table) 
{
    int i;
    
    if (bank->flags)
        return;

    bank->flags = 1;
    
    for (i = 0; i < bank->progCount; i++) {
        bank->progArray[i] = (ALInstrument *)((char *)bank->progArray[i] +
                                              offset);
        _bnkfPatchInst(bank->progArray[i], offset, table);
    }
}

void _bnkfPatchInst(ALInstrument *inst, int offset, int table)
{
    int i;

    if (inst->flags)
        return;

    inst->flags = 1;
    
    for (i = 0; i < inst->soundCount; i++) {
        inst->soundArray[i] = (ALSound *)((char *)inst->soundArray[i] +
                                          offset);
        _bnkfPatchSound(inst->soundArray[i], offset, table);

    }
}

void _bnkfPatchSound(ALSound *s, int offset, int table)
{
    int i;
    
    if (s->flags)
        return;

    s->flags = 1;
    
    s->envelope  = (ALEnvelope *)((char *)s->envelope + offset);
    s->keyMap    = (ALKeyMap *)((char *)s->keyMap + offset);

    for (i = 0; i < s->waveCount; i++) {
        s->wavetable[i] = (ALWaveTable *)((char *)s->wavetable[i] +
                                          offset);
        _bnkfPatchWaveTable(s->wavetable[i], offset, table);
    }    
}

void _bnkfPatchWaveTable(ALWaveTable *w, int offset, int table)
{
    if (w->flags)
        return;

    w->flags = 1;
    
    w->base += table;
    w->book  = (ALADPCMBook *)((char *)w->book + offset);
    if (w->loop) {
        w->loop = (ALADPCMloop *)((char *)w->loop + offset);
    }        
}