AEBank.c++ 2.68 KB
/*****************************************************************************
 *  File:  AEBank.c++ 
 *
 *  AEBank Class Implementations
 *
 ****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "Assets.h"
#include "Mgrs.h"

/*****************************************************************************
 *
 *   Initialization Routines
 * 
 ****************************************************************************/
AEBank::AEBank()
{
    instList = new RefList;
    assert(instList);
    classType = AL_BANK_CLASS;
    sampleRate = 44100; // default to something reasonable
    flags = 0;
    percussion = 0;
    theU64Dev->AllocHdwr(this,AL_BANK_CLASS);
    
}

AEBank::~AEBank()
{
    Node   *node, *next;
    AEInst *inst;

    node = instList->head;
    while(node)
    {
        inst = (AEInst*)node->data;
        inst->RemoveReference(this);
        next = node->next;
        delete node;
        node = next;
    }
    
    delete instList;
    
    if(percussion)
        percussion->RemoveReference(this);
    
    theU64Dev->DeallocHdwr(this);
}

/*****************************************************************************
 *
 *    Asset's Methods
 *
 ****************************************************************************/

void AEBank::AddInstrument(AEInst *inst)
{
    instList->Append(inst);
    inst->AddReference(this);
}

void AEBank::RemoveInstrument(AEInst *inst)
{
    instList->RemoveByData(inst);
    inst->RemoveReference(this);
}

void AEBank::SetPercussion(AEInst *perc)
{
    if(percussion)
        percussion->RemoveReference(this);
    perc->AddReference(this);
    percussion = perc;
}

void AEBank::SetSampleRate(int sampleRate)
{
    sampleRate = sampleRate;
}

void AEBank::SetFlags(int f)
{
    flags = f;
}

AEInst* AEBank::GetPercussion(void)
{
    return percussion;
}

int AEBank::GetSampleRate(void)
{
    return sampleRate;
}

int AEBank::GetFlags(void)
{
    return flags;
}

int AEBank::GetNumInsts(void)
{
    return instList->count;
}
    
AssetPair* AEBank::GetInstruments(int *numInsts)
{
    int        c = 0;
    AssetPair  *assets;
    Node       *node;
    AEInst     *inst;

    if(instList->count == 0)
        return 0;
    
    assets = (AssetPair*)malloc(sizeof(AssetPair) * instList->count);
    if(!assets)
    {
        fprintf(stderr,"Failure allocating memory for instrument list\n");
        return 0;
    }
    
    node = instList->head;
    
    while(node)
    {
        inst = (AEInst*)node->data;
        assets[c].asset = inst;
        assets[c].name = inst->GetName();
        c++;
        node = node->next;
    }
    
    *numInsts = c;
    return assets;
    
}