#ifndef DCASTAWAY_SOUND_H #define DCASTAWAY_SOUND_H #include "dcastaway.h" #ifndef NO_SOUND #include #include #include #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define MUSIC_VOLUME 64 #ifdef DINGOO #define SOUND_FREQ 16000 #else #define SOUND_FREQ 22050 //22050 //11025 //22050 #endif #define SOUND_BUFFER_SIZE 1024 void Sound_Reset(void); void Sound_ClearMixBuffer(void); void Audio_EnableAudio(bool bEnable); enum { FREQ_11Khz, FREQ_22Khz, FREQ_44Khz }; #define MIXBUFFER_SIZE 1024 //8192 #define SCREEN_START_CYCLE 96 /* Cycle first normal pixel appears on */ #define SCANLINES_PER_FRAME 313 /* Number of scan lines per frame */ #define CYCLES_PER_LINE 512 /* Cycles per horiztonal line scan */ #define CYCLES_VBL_IN (SCREEN_START_HBL*CYCLES_PER_LINE) /* ((28+64)*CYCLES_PER_LINE) */ #define CYCLES_PER_FRAME (SCANLINES_PER_FRAME*CYCLES_PER_LINE) /* Cycles per VBL @ 50fps = 160256 */ #define CYCLES_PER_SEC (CYCLES_PER_FRAME*50) /* Cycles per second */ #define CYCLES_ENDLINE (64+320+88+40) /* DE(Display Enable) */ #define CYCLES_HBL (CYCLES_PER_LINE+96) /* Cycles for first HBL - very inaccurate on ST */ #define CYCLES_DEBUGGER 3000 /* Check debugger every 'x' cycles */ enum { PSG_REG_CHANNEL_A_FINE, // 0x0000 PSG_REG_CHANNEL_A_COARSE, // 0x0001 PSG_REG_CHANNEL_B_FINE, // 0x0010 PSG_REG_CHANNEL_B_COARSE, // 0x0011 PSG_REG_CHANNEL_C_FINE, // 0x0100 PSG_REG_CHANNEL_C_COARSE, // 0x0101 PSG_REG_NOISE_GENERATOR, // 0x0110 PSG_REG_MIXER_CONTROL, // 0x0111 PSG_REG_CHANNEL_A_AMP, // 0x1000 PSG_REG_CHANNEL_B_AMP, // 0x1001 PSG_REG_CHANNEL_C_AMP, // 0x1010 PSG_REG_ENV_FINE, // 0x1011 PSG_REG_ENV_COARSE, // 0x1100 PSG_REG_ENV_SHAPE, // 0x1101 PSG_REG_IO_PORTA, // 0x1110 PSG_REG_IO_PORTB // 0x1111 }; #define NUM_PSG_SOUND_REGISTERS 14 // Number of register, not including IO ports extern bool bSoundWorking; /* Is sound OK */ extern volatile bool bPlayingBuffer; /* Is playing buffer? */ extern int OutputAudioFreqIndex; /* Playback rate (11Khz,22Khz or 44Khz) */ extern int SoundBufferSize; /* Size of sound buffer */ extern int CompleteSndBufIdx; /* Replay-index into MixBuffer */ extern int SoundPlayBackFrequencies[]; extern bool bWriteEnvelopeFreq,bWriteChannelAAmp,bWriteChannelBAmp,bWriteChannelCAmp; extern bool bEnvelopeFreqFlag; extern char MixBuffer[MIXBUFFER_SIZE]; extern int SoundCycles; extern int nGeneratedSamples; static __inline__ int Misc_LimitInt(int Value, int MinRange, int MaxRange) { if (ValueMaxRange) Value = MaxRange; return(Value); } #define Memory_Clear(A,B) (memset(A,0,B)) #define Audio_Lock() #define Audio_Unlock() void Sound_UpdateFromCallBack16(short *pBuffer, int len); void Sound_Update_VBL(void); void Sound_UpdateFromAudioCallBack(void); void Sound_Init(void); void Sound_Update(void); void audio_init(void); void audio_stop(void); void audio_init_music(void); void audio_play_wait(void); void audio_play_click(void); void audio_play_file(void); void audio_play_main(void); void audio_play_error(void); void audio_play_goodbye(void); void audio_play_save(void); #else /* NO SOUND */ #define Sound_Update_VBL() #define Sound_Update() #define audio_init_music() #define audio_play_wait() #define audio_play_click() #define audio_play_file() #define audio_play_main() #define audio_play_error() #define audio_play_goodbye() #define audio_play_save() #define audio_init() #define audio_stop() #endif #endif