/*      DMA.H
 *
 * DMA handling routines
 *
 * $Id: dma.h,v 1.1 1996/05/22 20:49:33 pekangas Exp $
 *
 * Copyright 1996 Petteri Kangaslampi and Jarno Paananen
 *
 * This file is part of the MIDAS Sound System, and may only be
 * used, modified and distributed under the terms of the MIDAS
 * Sound System license, LICENSE.TXT. By continuing to use,
 * modify or distribute this file you indicate that you have
 * read the license and understand and accept it fully.
*/


#ifndef __DMA_H
#define __DMA_H



/****************************************************************************\
*       struct dmaBuffer
*       ----------------
* Description:  DMA playing buffer
\****************************************************************************/

typedef struct
{
#ifdef __16__
    unsigned    bufferSeg;              /* DMA buffer segment (offset is
                                           zero) */
#endif
#ifdef __PROTMODE__
    unsigned    dosSeg;                 /* DMA buffer DOS segment */
    unsigned    dpmiSel;                /* DMA buffer DPMI selector */
#endif
    ulong       startAddr;              /* buffer physical start address */
    unsigned    bufferLen;              /* DMA buffer length in bytes */
    void        *memBlk;                /* internal, used for unallocating */
    int         channel;                /* channel on which the buffer is
                                           being played or -1 */
#if defined(__PROTMODE__) && !defined(__FLATMODE__)
    void far    *dataPtr;               /* pointer to DMA buffer data */
#else
    void        *dataPtr;               /* pointer to DMA buffer data *//*!!*/
#endif
} dmaBuffer;




/****************************************************************************\
*       struct dmaChannel
*       -----------------
* Description:  DMA channel data used by DMA functions.
\****************************************************************************/

typedef struct
{
    unsigned    number;                 /* DMA channel number */
    unsigned    bit;                    /* DMA channel bit for registers */
    unsigned    baseAddr;               /* base address port */
    unsigned    wordCount;              /* word count port */
    unsigned    request;                /* request port */
    unsigned    singleMask;             /* mask port */
    unsigned    mode;                   /* mode port */
    unsigned    clearFF;                /* clear flip-flop port */
    unsigned    page;                   /* page port */
} dmaChannel;



#ifdef __cplusplus
extern "C" {
#endif



/****************************************************************************\
*
* Function:     int dmaAllocBuffer(unsigned size, dmaBuffer *buf);
*
* Description:  Allocates a DMA buffer (totally inside a 64K physical page)
*
* Input:        unsigned size           size of buffer in bytes
*               dmaBuffer *buf          pointer to DMA buffer information
*
* Returns:      MIDAS error code. DMA buffer information is written to *buf.
*
\****************************************************************************/

int CALLING dmaAllocBuffer(unsigned size, dmaBuffer *buf);




/****************************************************************************\
*
* Function:     int dmaFreeBuffer(dmaBuffer *buf);
*
* Description:  Deallocates an allocated DMA buffer
*
* Input:        dmaBuffer *buf          pointer to DMA buffer information
*
* Returns:      MIDAS error code
*
\****************************************************************************/

int CALLING dmaFreeBuffer(dmaBuffer *buf);




/****************************************************************************\
*
* Function:     int dmaPlayBuffer(dmaBuffer *buf, unsigned channel,
*                   unsigned autoInit);
*
* Description:  Plays a DMA buffer
*
* Input:        dmaBuffer *buf          pointer to DMA buffer information
*               unsigned channel        DMA channel number
*               unsigned autoInit       1 if autoinitializing DMA is used, 0
*                                       if not
*
* Returns:      MIDAS error code
*
\****************************************************************************/

int CALLING dmaPlayBuffer(dmaBuffer *buf, unsigned channel,
    unsigned autoInit);




/****************************************************************************\
*
* Function:     int dmaStop(unsigned channel);
*
* Description:  Stops DMA playing
*
* Input:        unsigned channel        DMA channel number
*
* Returns:      MIDAS error code
*
\****************************************************************************/

int CALLING dmaStop(unsigned channel);




/****************************************************************************\
*
* Function:     int dmaGetPos(dmaBuffer *buf, unsigned *pos);
*
* Description:  Reads the DMA playing position
*
* Input:        dmaBuffer *buf          pointer to DMA buffer information
*               unsigned *pos           pointer to playing position
*
* Returns:      MIDAS error code. DMA playing position from the beginning
*               of the buffer, in bytes, is written to *pos.
*
\****************************************************************************/

int CALLING dmaGetPos(dmaBuffer *buf, unsigned *pos);




#ifdef __cplusplus
}
#endif




/****************************************************************************\
*       enum dmaFunctIDs
*       ----------------
* Description:  ID numbers for DMA handling functions
\****************************************************************************/

enum dmaFunctIDs
{
    ID_dmaAllocBuffer = ID_dma,
    ID_dmaFreeBuffer,
    ID_dmaPlayBuffer,
    ID_dmaStop,
    ID_dmaGetPos
};


#endif


/*
 * $Log: dma.h,v $
 * Revision 1.1  1996/05/22 20:49:33  pekangas
 * Initial revision
 *
*/