/*
Copyright (C) 1994-1995 Apogee Software, Ltd.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
/**********************************************************************
   file:   MULTIVOC.H

   author: James R. Dose
   date:   December 20, 1993

   Public header for MULTIVOC.C

   (c) Copyright 1993 James R. Dose.  All Rights Reserved.
**********************************************************************/

#ifndef __MULTIVOC_H
#define __MULTIVOC_H

#ifndef UNREFERENCED_PARAMETER
# define UNREFERENCED_PARAMETER(x) x=x
#endif

#ifdef _MSC_VER
# define inline __inline
#endif

#if defined __POWERPC__ || defined GEKKO
static inline uint16_t SWAP16(uint16_t s)
{
    return (s >> 8) | (s << 8);
}
static inline uint32_t SWAP32(uint32_t s)
{
    return (s >> 24) | (s << 24) | ((s&0xff00) << 8) | ((s & 0xff0000) >> 8);
}
# define LITTLE16(s) SWAP16(s)
# define LITTLE32(s) SWAP32(s)
#else
# define LITTLE16
# define LITTLE32
#endif

#ifndef TRUE
# define TRUE  ( 1 == 1 )
#endif
#ifndef FALSE
# define FALSE ( !TRUE )
#endif

#ifndef min
# define min(x,y) ((x) < (y) ? (x) : (y))
#endif
#ifndef max
# define max(x,y) ((x) > (y) ? (x) : (y))
#endif

#if defined(_MSC_VER)
# define strcasecmp _stricmp
# define strncasecmp _strnicmp
#elif defined(__QNX__)
# define strcasecmp stricmp
# define strncasecmp strnicmp
#endif

typedef enum
{
   Unknown,
   Raw,
   VOC,
   DemandFeed,
   WAV,
   Vorbis,
   FLAC,
} wavedata;

#define MV_MINVOICEHANDLE  1

extern int32_t MV_ErrorCode;

enum MV_Errors
   {
   MV_Warning = -2,
   MV_Error   = -1,
   MV_Ok      = 0,
   MV_UnsupportedCard,
   MV_NotInstalled,
   MV_DriverError,
   MV_NoVoices,
   MV_NoMem,
   MV_VoiceNotFound,
   MV_InvalidVOCFile,
   MV_InvalidWAVFile,
   MV_InvalidVorbisFile,
   MV_InvalidFLACFile,
   MV_InvalidMixMode,
   MV_NullRecordFunction
   };

extern void (*MV_Printf)(const char *fmt, ...);
const char *MV_ErrorString( int32_t ErrorNumber );
int32_t   MV_VoicePlaying( int32_t handle );
int32_t   MV_KillAllVoices( void );
int32_t   MV_Kill( int32_t handle );
int32_t   MV_VoicesPlaying( void );
int32_t   MV_VoiceAvailable( int32_t priority );
int32_t   MV_SetPitch( int32_t handle, int32_t pitchoffset );
int32_t   MV_SetFrequency( int32_t handle, int32_t frequency );
int32_t   MV_PauseVoice( int32_t handle, int32_t pause );
int32_t   MV_EndLooping( int32_t handle );
int32_t   MV_SetPan( int32_t handle, int32_t vol, int32_t left, int32_t right );
int32_t   MV_Pan3D( int32_t handle, int32_t angle, int32_t distance );
void  MV_SetReverb( int32_t reverb );
void  MV_SetFastReverb( int32_t reverb );
int32_t   MV_GetMaxReverbDelay( void );
int32_t   MV_GetReverbDelay( void );
void  MV_SetReverbDelay( int32_t delay );
//int32_t   MV_SetMixMode( int32_t numchannels, int32_t samplebits );
//int32_t   MV_StartPlayback( void );
//void  MV_StopPlayback( void );
int32_t   MV_StartDemandFeedPlayback( void ( *function )( char **ptr, uint32_t *length ),
         int32_t rate, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right,
         int32_t priority, uint32_t callbackval );
int32_t   MV_PlayRaw( char *ptr, uint32_t length,
         char *loopstart, char *loopend, unsigned rate, int32_t pitchoffset,
         int32_t vol, int32_t left, int32_t right, int32_t priority,
         uint32_t callbackval );
int32_t   MV_PlayWAV3D( char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance,
         int32_t priority, uint32_t callbackval );
int32_t   MV_PlayWAV( char *ptr, uint32_t length, int32_t loopstart, int32_t loopend,
         int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
         uint32_t callbackval );
int32_t   MV_PlayVOC3D( char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance,
         int32_t priority, uint32_t callbackval );
int32_t   MV_PlayVOC( char *ptr, uint32_t length, int32_t loopstart, int32_t loopend,
         int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
         uint32_t callbackval );
int32_t   MV_PlayVorbis3D( char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance,
                    int32_t priority, uint32_t callbackval );
int32_t   MV_PlayVorbis( char *ptr, uint32_t length, int32_t loopstart, int32_t loopend,
                        int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
                        uint32_t callbackval );
int32_t   MV_PlayFLAC3D( char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance,
                    int32_t priority, uint32_t callbackval );
int32_t   MV_PlayFLAC( char *ptr, uint32_t length, int32_t loopstart, int32_t loopend,
                        int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
                        uint32_t callbackval );
//void  MV_CreateVolumeTable( int32_t index, int32_t volume, int32_t MaxVolume );
void  MV_SetVolume( int32_t volume );
int32_t   MV_GetVolume( void );
void  MV_SetCallBack( void ( *function )( uint32_t ) );
void  MV_SetReverseStereo( int32_t setting );
int32_t   MV_GetReverseStereo( void );
int32_t   MV_Init( int32_t soundcard, int32_t MixRate, int32_t Voices, int32_t numchannels,
         int32_t samplebits, void * initdata );
int32_t   MV_Shutdown( void );
int32_t MV_SetVoiceCallback(int32_t handle, uint32_t callbackval);
void MV_SetPrintf(void (*function)(const char *fmt, ...));

#endif
