audio.h 3.88 KB
/*====================================================================
 * audio.h
 *
 * Synopsis:
 *
 * Copyright 1995, 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.
 *====================================================================*/

#ifndef __audio__
#define __audio__

#include <ultra64.h>
#include <libaudio.h>
#include <sched.h>

#define MAX_SYNTH_UPDATES       48
#define MAX_SEQP_EVENTS         48
#define MAX_SNDP_EVENTS		36
#define AUDIO_HEAP_SIZE         400000

#define MAX_SYNTH_VVOICES       20
#define MAX_SYNTH_PVOICES	20
#define MAX_SEQP_VOICES		20
#define MAX_SNDP_VOICES		12

#define EXTRA_SAMPLES           80
#define NUM_OUTPUT_BUFFERS      3      /* Need three of these */
#define OUTPUT_RATE             44100
#define QUIT_MSG                10

#define AUDIO_STACKSIZE         0x600
#define MAX_SEQ_LENGTH          30000

#define DMA_BUFFER_LENGTH       0x500  /* Larger buffers result in fewer DMA' but more  */
                                       /* memory being used.  */


#define NUM_ACMD_LISTS          2      /* two lists used by this example                */
#define MAX_RSP_CMDS            2000   /* max number of commands in any command list.   */
                                       /* Mainly dependent on sequences used            */

#define NUM_DMA_BUFFERS         40     /* max number of dma buffers needed.             */
                                       /* Mainly dependent on sequences and sfx's       */

#define NUM_DMA_MESSAGES        20     /* The maximum number of DMAs any one frame can  */
                                       /* have.                                         */

#define FRAME_LAG               1      /* The number of frames to keep a dma buffer.    */
                                       /* Increasing this number causes buffers to not  */
                                       /* be deleted as quickly. This results in fewer  */
                                       /* DMA's but you need more buffers.              */


#define MAX_AUDIO_MSGS          8

typedef union {    

    struct {
        short   type;
    } gen;
    
    struct {
        short type;
        struct AudioInfo_s *info;
    } done;
    
    OSScMsg      app;
    
} AudioMsg;

typedef struct AudioInfo_s {
    short       *data;                     /* Output data pointer */
    short       frameSamples;              /* # of samples synthesized in this frame     */
    OSScTask    task;                      /* scheduler structure */
    AudioMsg    msg;                       /* completion message */
} AudioInfo;

typedef struct {
    Acmd        *ACMDList[NUM_ACMD_LISTS];
    AudioInfo   *audioInfo[NUM_OUTPUT_BUFFERS];
    OSThread    thread;
    OSMesgQueue audioFrameMsgQ;
    OSMesg      audioFrameMsgBuf[MAX_AUDIO_MSGS];
    OSMesgQueue audioReplyMsgQ;
    OSMesg      audioReplyMsgBuf[MAX_AUDIO_MSGS];
    ALGlobals   g;
} AMAudioMgr;

typedef struct 
{
    ALLink      node;
    u32         startAddr;
    u32         lastFrame;
    char        *ptr;
} AMDMABuffer;

typedef struct 
{
    u8          initialized;
    AMDMABuffer   *firstUsed;
    AMDMABuffer   *firstFree;
} AMDMAState;



void     amCreateAudioMgr(ALSynConfig *c, OSPri priority);
void     AudioInit(void);

extern u64  audYieldBuf[];

#endif