wavtab.c++ 2.57 KB
//====================================================================
// wavtab.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 <assert.h>
#include "libbank.h"

ICWavTab::ICWavTab()
{
    compact = FALSE; /* default value */
}

void ICWavTab::Append(ICObject *o)
{
    objList.Append(o);
}

void ICWavTab::Print()
{
    Node *obj;
    
    for (obj = objList.head; obj != 0; obj = obj->next) {
        ICObject *ptr = (ICObject *)obj->data;
        ptr->Print();
    }
}

void ICWavTab::Write(FILE *f)
{
    Node *obj;
    
    for (obj = objList.head; obj != 0; obj = obj->next) {
        ICObject *ptr = (ICObject *)obj->data;
        ptr->Write(f);        
    }
}

void ICWavTab::LayOutFile()
{
    Node        *node = objList.head;
    Node        *prev = (Node*)&objList.head;
    int         curOffset = 0;
    ICObject    *obj;
    ICSoundFile *sndFileobj;
    ICWave      *waveObj;
    
    if(compact)
    {
        while(node !=0)
        {
            sndFileobj = (ICSoundFile *)node->data;

            waveObj = sndFileobj->GetWaveTable();
            
            if(waveObj->GetUsedFlag())
            {
                curOffset = sndFileobj->LayOut(curOffset);
                prev = node;
                node = node->next;
            }
            else
            {
                delete sndFileobj;                         // delete object attached
                node = objList.Remove(node, prev);  // remove from list & delete
            }
        }
    }
    else
    {
        while(node != 0)
        {
            obj = (ICObject *)node->data;
            curOffset = obj->LayOut(curOffset);
            node = node->next;
        }
    }
}

void ICWavTab::AssembleFile()
{
    Node *obj = objList.head;
    
    for (obj = objList.head; obj != 0; obj = obj->next) {
        ((ICObject *)obj->data)->Assemble();
    }
}