my emailadress : stefan.goehler@gmx.de my homepage : www.crossfire-designs.de SOUNDLIB.TXT Readme file for soundlib.pas Made on August 31th 1997 Last changes made on 7th of August 2001 some shortcuts and other things: i.e. = in example sb16 means sb16 and higher LICENSE AGREEMENT Copyright agreement, changes reserved All these statements apply, if not explicitely stated different, on ANY unit delivered with this package. 1st You can use my units entired in your own programs. Ripping any code off or using parts (unimportant if modified or original) of this package somewhere else, e.g. in other packages, is not allowed without my permission. Exceptions: þ If you wrote any code for the package yourself (meaning not modified code), you are allowed to use this special kind of code yourself and without my permission (just because it's your work, not mine) þ You can get a license for parts of this package or the whole package, the respective author(s) of such a part will get a donation from you 2nd This package is Freeware, as long as the product which uses it, is Freeware. You can use it freely in any kind of software which uses this and any of the other delivered units with these restrictions: þ You need to state the name of the package and also the names of the authors who did their hard work in this product on an often seen place of your product (intro/extro etc.). þ THE COMMERCIAL USE IS NOT FREE. You have to contact me if you use this package in any kind of commercial software, you need to get a license for it 3rd You are allowed to do modifications on my units. If they are useful, please let me know what you've done and give me the modifications. Modifications concerning the existence and/or modification of any copyright/author/name statements are generally not allowed. You are not allowed to publish modified units, you may only use them in your own productions (where these sources aren't published). Version publications are restricted to my person (Stefan Goehler). Additionally, you aren't allowed to charge any money for the units or any derivates of them, except you put them on some kind of shareware/freeware/sourcecode collection media. 4th If not different stated, you aren't allowed use or spread any of the delivered units single, you have to spread the package with all files. Spreading units single is only allowed if I gave you my permission or the unit is yours and is not special licensed (see chapter 1). If you don't agree with these statements, please erase this sofware. If you don't understand a part, feel free to contact me. A short description of the proggys you get with this unit: SOUNDEMO.PAS : A short, simple example how to play a soundfile -give the file to play as parameter 1 (VOC or WAV) SOUNDEM2.PAS : A more complex program to show how to use the features of the soundlib -give the file to play as parameter 1 (VOC or WAV) SOUNDEM3.PAS : A simple recorder. It records to the file TEST.WAV with CD-Quality until you press a key. This program records from your CD-ROM drive. So start the playback of a cd first. That program is only runable on an SB16! SOUNDEM4.PAS : This program was originally not for public release, so it's more difficult to understand it. This program records with 8bit, 44100 Hz Stereo into the memory and shows the recorded realtime with a scope and a vumeter. The Number below shows how often the displayinterrupt has been called a second. It should be around 70 times. If this is not so, your PC isn't very fast. If the recorded volume is too high for a good record, the program shows "overload". Please note that you need the file vesa256.zip too to compile soundem4.pas. This file is availible on my homepage. Also the file bk.obj is needed, which you should get with this unit. That's the backgroundpic of the scope. SOUNDEM6.PAS : This is a frequency analyzer, which uses the Fast Fourier Transformation. The file _fft.pas is written by Bas van Gaalen. MIXFILES.PAS : This is a small example how to mix files. This may help you in your own games. Just press buttons 1..4. No warranty for the running under TP ver 6.0! At least soundemo.pas works, but no warranty for the other files. Hi there! Here the overview about the functions provided by soundlib: >> function initblaster : byte; This is the first function you have to call. It initializes the sound- blaster and the variables for it's usage. It returns zero if there is a soundblaster beginning from version 2.0. If it returns nonzero, you are able to find the fitting error string in the sb_errorstr-constant. >> initrecord(p : tmemp;buffersize,frequency : word;flags : word); This unit initializes recording from the soundblaster. The P-variable is the pointer where to write the data to (you have to get this pointer via getmem). BUFFERSIZE is the size of the doublebuffer. FREQUENCY is the samplerate to record. FLAGS includes, like also in other procedures, some information about the format to use. You are able to use the following constants: snd_mono snd_8bit snd_nonsigned ( Unsigned data values, all versions ) snd_stereo snd_16bit snd_signed ( Signed data values, >= SB16 ) If you want to initialize a typical 16 bit recording, you just use this as parameter: snd_stereo+snd_16bit+snd_signed >> procedure initplay(datanum: byte;p : tmemp;buffersize,frequency : word;flags : word); This unit initializes playback from the soundblaster. DATANUM describes the datablock (i.e. samplingrate) in the variable PLAY. The P-variable is the pointer where to write the data to (you have to get this pointer via getmem). BUFFERSIZE is the size of the doublebuffer. FREQUENCY is the samplerate to record. For flags see the last lines in initrecord part. !!! Attention:-Don't use buffersizes > 32 KB! This could hang the PC or could result that the playback scratches very bad. -Yes, this unit could be able to record and play at the same time on a SB16, but it can't till now. If that would be so, you were only able to do that with a different resolution. Creative doesn't documentate how to find out if the interrupt was called by playback or recording. If anyone knows how to find that out, please email me!!! >> procedure exitplay; Stop playback if you have used initplay therefore. >> procedure exitrecord; Stop recording if you have used initrecord therefore. >> procedure pauserecord(pause : boolean); Pause (true) or continue (false) recording. >> procedure pauseplay(pause : boolean); Pause (true) or continue (false) the actual playing file. >> procedure startplay(datanum : byte); Start playback of a file which you have opened via opensound, openwav or openvoc. >> procedure stopplay; Stop playback of the actual playing file. >> procedure setplaypos(datanum : byte;pos : longint); Seek to a position in a file which you have opened via open****. You can only change the position if you actually play the file or if you have paused it. >> function setoutput(output : byte;left,right : boolean) : boolean; Set the channels where you want to hear the output: -CD -MIKE -LINEIN This function returns false if you haven't used this attributes or the blaster is not a sb16. >> function setinput(input,channel : byte;left,right : boolean) : boolean; This function is a little bit more complicated. INPUT stands for -MIKE -CD -LINEIN -MIDI (only sb16) CHANNEL is 1 for left and 2 for right. You can set the input i.e. on the left channel for left _and_ right. Also that for the right channel. Why this? If you record in mono, you must set the left channel to left and right - otherwise you record only from the left channel. >> function getinput(input,channel : byte;var left,right : boolean) : boolean; Like above, but you get back the inputsettings >> function setgain(out : boolean;left,right : byte) : boolean; With this function you can manipulate the amplification of the sb16 amplifier. The maximum value for LEFT and RIGHT is 3 (4x amplification). The minimum value is zero (1x amplification). Set OUT to true, if you want to change the amplification for the output otherwise set it to false to change the input amplification. >> function getgain(out : boolean;var left,right : byte) : boolean; Like above, but returns the values for left and right >> function setmemsize(size : word) : boolean; Set the buffersize of the doublebuffer. You can't use sizes higher than 16107 bytes. >> procedure pauserecord(pause : boolean); Pause recording. >> procedure pauseplay(pause : boolean); Pause playback. >> procedure startplay; Start playback if you have used OPENSOUND, OPENWAV or OPENVOC. >> procedure stopplay; {stop playback if you used open****} Stop playback if you have used OPENSOUND, OPENWAV or OPENVOC. >> function getactpos : longint; Gives back the actual position of the file. This function is not accurate at the end (last 2 blocks) of the file, but very accurate while normal playback, because it gives not only the fileposition, but the _real_ position (the playback position of the soundblaster is also calculated). >> procedure setplaypos(pos : longint);{set fileposition of playback file - only if you used open****} Set a new position in the playback file. Use it only while the file is playing or paused! >> function setvolume(what,left,right : byte) : boolean; Set the volume of following parts: master = master volume voice = voice volume midi = midi/FM volume cd = CD volume linein = line_in volume mike = microphone volume speaker = PC Speaker volume treble = treble intensity bass = bass intensity The function returns false if the volume couldn't be setted (that's when the current soundblaster doesn't support this volumesetting) >> function getvolume(what : byte;var left,right : byte) : boolean; Like SETVOLUME, but you get back the volumes from the blaster. >> function openvoc(datanum : byte;filename : string;buffersize : word) : boolean; Open VOCfile. This function returns false if there was an error opening this file (file not found, format not supported) >> function openwav(datanum : byte;filename : string;buffersize : word) : boolean; Open WAVfile. This function returns false if there was an error opening this file (file not found, format not supported) >> function opensound(datanum : byte;s : string) : boolean; Open a VOC or a WAVfile. The program detects that at the fileending (.VOC or .WAV). >> procedure closesound(datanum : byte); Close the file opened with OPENSOUND, OPENVOC or OPENWAV and stop playback. Why is there the variable DATANUM?? Well, you are able to open 20 files at the same time. I think, that's a very good thing if you wanna program multimedia-programs or something in this way. Here a very short and simple program how to use that: ------ uses crt,soundlib; begin initblaster; {Init soundblaster} if opensound(0,paramstr(1)) then begin {Open parameter 1 file as file 0} opensound(1,paramstr(2)); {Open parameter 2 file as file 1} startplay(0); {start playback of file 0} repeat until (keypressed)or(play.stopped); {Until key pressed or file reached its end} startplay(1); {start playback of file 1} repeat until (keypressed)or(play.stopped); {Until key pressed or file reached its end} if keypressed then readkey; closesound(0); {close file 0} closesound(1); {close file 1} end; end. ------ If you wanna test the functions with a lower version of the soundblaster, set the variable blaster.version i.e. to sbpro after you called initblaster. Please note that the sb16 emulates soundblasters lower than sbpro not correctly at all - i.e. it doesn't play stereo in Sb Pro mode. Try the soundlib with a dumped file from a audiocd and you will hear how good the soundlib is - real CD-QUALITY*!!! * on a sb16 - on other sb's you'll hear the maximum availible quality Some additional information: The mixer settings will be automaticly saved when you call initblaster and will be restored when you exit the program. If you wanna make a mixer utility that needs to let the new settings in the mixer, set the variable autorestore to false! If you want to play soundfiles with a memory-manager like EMM386, then you should tell this manager to reserve some memory for the DMA-Buffer! This is really needed!!! If you make some public software don't forget to mention this in your readme! How to make that with EMM386? Add to the line in the CONFIG.SYS where EMM386 is called the parameter D=xx. XX stands for a number between 16 and 256. This is the size in KB. My unit uses up to 32 KB DMA-Buffer, so you should the the size to at least 32 KB! If this doesn't help, try to add a simple "RAM" to that line. If you run this program under Windows 95 in compatible(16 bit) Harddisk mode, it maybe won't run fully. There's a variable called surround. If you set it to true, and you play in stereo, you'll get surround sound. Maybe you think it sounds not very good. That's a thing that you have to decide youyrself. Well, write me if you think, that this advancement is not very good, or you know how to improve it. It's also better to use surround only on amplifiers which support surround sound - I tested this out - it sounds better with those amplifiers. How to get now surround sound with your equipment? Well, I have found a little manual in the readme of the Cubic Player how to manage that: This sounds pretty nice if you have a stereo non-wavetable soundcard. Just buy 1,2 or 3 additional speakers and connect them as showed below: Stereo + L - - R + +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ I I I I I I I I +----+ +-----+-----+ +-----+ I I I I I I I I I I I I - I I I I M-Speaker I I I I + I I I I I I I I + - ----+---- - + I I L-Speaker R-Speaker I I I I I +---+ +-------------+ +------+ I I I I + - - + S1-Speaker S2-Speaker Thanks to Michael Erdmann for this diagram. (we cannot be made liable for burning equipment, etc.) I've tried it... it sounds pretty good! To my person: My name is Stefan G”hler -I'm 21 years old -I'm living in Germany near Rostock -I'm 1.73 m tall -My shoe size is 42 -.... :-> Have fun with my unit! If there's anything that I don't know about it (I mean bugs or additions from you), please email me. Stefan G”hler