123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /** EMULib Emulation Library *********************************/
- /** **/
- /** Sound.h **/
- /** **/
- /** This file defines standard sound generation API and **/
- /** functions needed to log soundtrack into a MIDI file. **/
- /** See Sound.c and the sound drivers for the code. **/
- /** **/
- /** Copyright (C) Marat Fayzullin 1996-2007 **/
- /** You are not allowed to distribute this software **/
- /** commercially. Please, notify me, if you make any **/
- /** changes to this file. **/
- /*************************************************************/
- /*
- * $LastChangedDate$
- * $Author$
- * $HeadURL$
- * $Revision$
- */
- #ifndef SOUND_H
- #define SOUND_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* SetSound() arguments: */
- #define SND_MELODIC 0 /* Melodic sound (default) */
- #define SND_RECTANGLE 0 /* Rectangular wave */
- #define SND_QS_DU0 5
- #define SND_QS_DU1 6
- #define SND_QS_DU2 7
- #define SND_QS_DU3 8
- #define SND_TRIANGLE 1 /* Triangular wave (1/2 rect.)*/
- #define SND_NOISE 2 /* White noise */
- #define SND_PERIODIC 3 /* Periodic noise (not im-ed) */
- #define SND_WAVE 4 /* Wave sound set by SetWave()*/
- #define SND_MIDI 0x100 /* MIDI instrument (ORable) */
- /* Drum() arguments: */
- #define DRM_CLICK 0 /* Click (default) */
- #define DRM_MIDI 0x100 /* MIDI drum (ORable) */
- /* MIDI characteristics: */
- #define MIDI_CHANNELS 16 /* Number of MIDI channels */
- #define MIDI_MINFREQ 9 /* Min MIDI frequency (Hz) */
- #define MIDI_MAXFREQ 12285 /* Max MIDI frequency (Hz) */
- #define MIDI_DIVISIONS 1000 /* Number of ticks per second */
- /* MIDILogging() arguments: */
- #define MIDI_OFF 0 /* Turn MIDI logging off */
- #define MIDI_ON 1 /* Turn MIDI logging on */
- #define MIDI_TOGGLE 2 /* Toggle MIDI logging */
- #define MIDI_QUERY 3 /* Query MIDI logging status */
- /** TrashSound() *********************************************/
- /** Shut down sound driver. Each driver implements its own **/
- /** TrashSound() function. **/
- /*************************************************************/
- void TrashSound(void);
- /** Sound() **************************************************/
- /** Generate sound of given frequency (Hz) and volume **/
- /** (0..255) via given channel. Setting Freq=0 or Volume=0 **/
- /** turns sound off. **/
- /*************************************************************/
- void Sound(int Channel,int Freq,int Volume);
- /** Drum() ***************************************************/
- /** Hit a drum of given type with given force (0..255). **/
- /** MIDI drums can be used by ORing their numbers with **/
- /** SND_MIDI. **/
- /*************************************************************/
- void Drum(int Type,int Force);
- /** SetSound() ***********************************************/
- /** Set sound type at a given channel. MIDI instruments can **/
- /** be set directly by ORing their numbers with SND_MIDI. **/
- /*************************************************************/
- void SetSound(int Channel,int NewType);
- /** SetChannels() ********************************************/
- /** Set master volume (0..255) and switch channels on/off. **/
- /** Each channel N has corresponding bit 2^N in Switch. Set **/
- /** or reset this bit to turn the channel on or off. **/
- /*************************************************************/
- void SetChannels(int Volume,int Switch);
- /** SetWave() ************************************************/
- /** Set waveform for a given channel. The channel will be **/
- /** marked with sound type SND_WAVE. Set Rate=0 if you want **/
- /** waveform to be an instrument or set it to the waveform **/
- /** own playback rate. **/
- /*************************************************************/
- void SetWave(int Channel,signed char *Data,int Length,int Rate);
- /** GetWave() ************************************************/
- /** Get current read position for the buffer set with the **/
- /** SetWave() call. Returns 0 if no buffer has been set, or **/
- /** if there is no playrate set (i.e. wave is instrument). **/
- /*************************************************************/
- const signed char *GetWave(int Channel);
- /** InitMIDI() ***********************************************/
- /** Initialize soundtrack logging into MIDI file FileName. **/
- /** Repeated calls to InitMIDI() will close current MIDI **/
- /** file and continue logging into a new one. **/
- /*************************************************************/
- void InitMIDI(const char *FileName);
- /** TrashMIDI() **********************************************/
- /** Finish logging soundtrack and close the MIDI file. **/
- /*************************************************************/
- void TrashMIDI(void);
- /** MIDILogging() ********************************************/
- /** Turn soundtrack logging on/off and return its current **/
- /** status. Possible values of Switch are MIDI_OFF (turn **/
- /** logging off), MIDI_ON (turn logging on), MIDI_TOGGLE **/
- /** (toggle logging), and MIDI_QUERY (just return current **/
- /** state of logging). **/
- /*************************************************************/
- int MIDILogging(int Switch);
- /** MIDITicks() **********************************************/
- /** Log N 1ms MIDI ticks. **/
- /*************************************************************/
- void MIDITicks(int N);
- //#ifdef UNIX
- #define SND_CHANNELS 4 /* Number of channels */
- #define SND_SAMPLESIZE 256 /* Max. SetWave() sample size */
- #define SND_BUFSIZE 256 /* Buffer size, <= 2^SND_BITS */
- #define SND_BITS 8 /* Number of bits in a fragment */
- #define SND_BUFFERS 64 /* Number of fragments, >= 2 */
- /* Bigger value results in better behaviour on loaded */
- /* but output gets more delayed. */
- /** InitSound() **********************************************/
- /** Initialize Unix sound driver with given synthesis rate. **/
- /** Returns Rate on success, 0 otherwise. Pass Rate=0 to **/
- /** skip initialization and be silent. Pass Verbose!=0 to **/
- /** see initialization messages. **/
- /*************************************************************/
- int InitSound(int Rate,int Verbose);
- /** StopSound() **********************************************/
- /** Temporarily suspend sound. **/
- /*************************************************************/
- void StopSound(void);
- /** ResumeSound() ********************************************/
- /** Resume sound after StopSound(). **/
- /*************************************************************/
- void ResumeSound(void);
- //#endif /* UNIX */
- #ifdef MSDOS
- #define SND_CHANNELS 16 /* Number of sound channels */
- #define OPL_CHANNELS 7 /* Number of Adlib channels */
- #define SND_SAMPLESIZE 256 /* Max. SetWave() sample size */
- #define SND_BUFSIZE 512 /* Buffer size for DMA */
- #define SND_MAXDELAY 10 /* Maximal sound delay 1/n s */
- /** InitSound() **********************************************/
- /** Initialize sound. Returns Rate on success, 0 otherwise. **/
- /** Rate=0 to skip initialization (will be silent). **/
- /*************************************************************/
- int InitSound(unsigned int Rate,unsigned int Latency);
- #endif /* MSDOS */
- #ifdef WINDOWS
- #define SND_CHANNELS 16 /* Number of channels */
- #define SND_SAMPLESIZE 256 /* Max. SetWave() sample size */
- #define SND_BUFSIZE 512 /* Size of a wave buffer */
- #define SND_BUFFERS 32 /* Number of wave buffers */
- #include <Windows.h>
- /** InitSound() **********************************************/
- /** Initialize Windows sound driver with given synthesis **/
- /** rate. Returns Rate on success, 0 otherwise. Pass Rate=0 **/
- /** to skip initialization and be silent. Pass Rate=1 to **/
- /** use MIDI (midiOut). Pass Rate=8192..44100 to use wave **/
- /** synthesis (waveOut). Number of wave synthesis buffers **/
- /** must be in 2..SND_BUFFERS range. **/
- /*************************************************************/
- unsigned int InitSound(unsigned int Rate,unsigned int Delay);
- #endif /* WINDOWS */
- #if 0
-
- #ifndef MSDOS
- #ifndef WINDOWS
- #ifndef UNIX
- #define SND_CHANNELS MIDI_CHANNELS /* Default number */
- #endif
- #endif
- #endif
- /** InitSound() **********************************************/
- /** Initialize Series60 sound driver with given synthesis **/
- /** rate. Returns Rate on success, 0 otherwise. Pass Rate=0 **/
- /** to skip initialization and be silent. **/
- /*************************************************************/
- unsigned int InitSound(unsigned int Rate,unsigned int Delay);
- #endif
- /** RenderAudio() ********************************************/
- /** Render given number of melodic sound samples. Returns **/
- /** number of samples actually rendered. **/
- /*************************************************************/
- unsigned int RenderAudio(unsigned int Samples);
- /** SndDriver ************************************************/
- /** Each sound driver should fill this structure with **/
- /** pointers to hardware-dependent handlers. This has to be **/
- /** done inside the InitSound() function. **/
- /*************************************************************/
- struct SndDriverStruct
- {
- void (*SetSound)(int Channel,int NewType);
- void (*Drum)(int Type,int Force);
- void (*SetChannels)(int Volume,int Switch);
- void (*Sound)(int Channel,int NewFreq,int NewVolume);
- void (*SetWave)(int Channel,signed char *Data,int Length,int Freq);
- const signed char *(*GetWave)(int Channel);
- };
- extern struct SndDriverStruct SndDriver;
- #ifdef __cplusplus
- }
- #endif
- #endif /* SOUND_H */
|