ࡱ;   v !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuwxz{|}~Root Entry  !"#$%&'()*+,-./012345678:;<=BCDEFGHIJKLMNRTUVW ®`VTextStarWriter 5.0TASK,0,102,0,100,1,2370;3075;100;2280;1680;10950;6075;0;0SBX sb Z Standard StarBASICSBX ARSBX AR SBX AR2c%bqq>p3 ObjBFFFE8A7.)䰱aK4)* SfxDocumentInfo Bruce Forsberg 1ESW5HDR.0G 1?!Numbering SymbolsBullet Symbols 405567101 410021101 410429101 414846101 204450111 210934111 212437111 233847111 240724111 279913111 284529111Outline0 # Rp  n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7R  n+.starbats/ n+.starbats/6 n+.starbats/Q n+.starbats/l n+.starbats/ n+.starbats/ n+.starbats/ n+.starbats/ n+.starbats/ n+.starbats/ Rp  n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp  n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp  n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp  n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp  n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp   n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp   n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp   n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7Rp   n#. n" Wn#. n#. n#.  n#. Gn#. n#. n#. n#. 7ZBruce Forsberg G 1? uK Info 0 Info 1 Info 2 Info 3 18cE(Q<44Standard LIBIMBEDDED LIBIMBEDDEDSWG, A<  #$%&'()*./0123456789:;<=>?@ABCDGHK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFQRSTU0 '9@ starbats helveticaXX!'B@d d @d Bs XXX"X,' @X'@$X+'$@DX'(_@8. q . %... . . %. XX!X-X@@'18@ddddddnXX!A'2*@%dxddxdXX7S;@KX8S<@oX9S=@XR'D@XSj*OP$' '(. . p. @ . . . . . P. . . !. $. `'. 0*. -. /. 2. p5. @8. ;. =. @. 6')2 }Numbering SymbolsNumbering SymbolsBullet SymbolsBullet Symbols''OLEOLE@;7S<8S=9S>> StandardStandard@HeaderStandardHeader@('HeadingStandard Text body@''2A'DR'  Text bodyStandard Text body2A'Contents HeadingHeadingContents Heading@''1@' IndexStandardIndex@ Contents 1Index Contents 1@('1@' Heading 1Heading Text body'' SubtitleHeading Text body' '$+'(Member Function listStandardMember Function list('1@'FooterStandardFooter@('N>#S!{Oh+'0 h t 81@I @@#C@Fad,@u$Bruce ForsbergBruce Forsberg .)䰱Drawing StarDraw 5.0SW5HDR.0G 1?!O Frameformat ZeichenformatTextformatvorlageStandardHeader Heading Text body Contents Heading Index Contents 1  Heading 1(SubtitleMember Function listFooterNumbering SymbolsBullet Symbols OLERoot 18 Object1 19Standard  Illustration Table TextDrawingY .Y .Y .Y .q  GeneralGenerald#,##0.00#,##0.00System #,##0.00 CCC#,##0.00 CCC#,##0.--;[RED]-#,##0.-- #,##0.---#,##0.--RED$ DD/MM/YYYYDD/MM/YYYY def/System%DD/MM/YYDD/MM/YY def/System& DD MMMM YYYYDD MMMM  YYYYSystem'D MMM YYD MMM YY def/System. [HH]:MM:SS.00 [HH ]:MM:SS .003MM/DD/YYYY HH:MM:SS MM/DD/YYYY HH :MM:SS COLORCOLORCOLORCOLORK D MMM YYYYD MMM YYYY def/SystemL D MMMM YYYYD MMMM  YYYY def/SystemM NND MMM YYNND MMM YY def/SystemN NND MMMM YYYYNND MMMM  YYYY def/SystemONNNND MMMM YYYYNNNND MMMM  YYYY def/SystemP D. MMM. YYYYD. MMM. YYYYDIN 5008 (EN 28601)Q D. MMMM YYYYD. MMMM  YYYYDIN 5008 (EN 28601)RMM-DDMM-DDDIN 5008 (EN 28601)SYY-MM-DDYY-MM-DDDIN 5008 (EN 28601)T YYYY-MM-DDYYYY-MM-DDDIN 5008 (EN 28601)UWWWWBTlbPp 2$99 S8AP.AAPdddAPddA}Prs HeaderSaAPddALPNCT: Audio Library Programmers ManualSA @Az Prp FooterS^APddAIPN@T7 Page SA @A0SAAP.AAPdddAPddZSW5HDR.0G 1?C(506b(Build:3179)(SV506)]DAddress bookaddress!O Frameformat ZeichenformatTextformatvorlageStandardHeader Heading Text body Contents Heading Index Contents 1  Heading 1(SubtitleMember Function listFooterNumbering SymbolsBullet Symbols OLERoot 18 Object1 19Standard  Illustration Table TextDrawingd=. CM1 4 5*j standard.dicY .Y .Y .Y .yxTable of Contents <#> <#> <#> <#> <#> <#> <#> <#> <#> <#>  6FN3T T%Table of ContentsK T INTRODUCTION 2T BASE CLASSES 4T DATA CLASS 9T WORKER CLASSES 11T UTILITY CLASSES 15T) AUDIO FILE FORMATS 18K TSA PT i T T iT_ INTRODUCTIONSA @A8  A8 A8 d T3S(Ad A A @Tc1. IntroductionS2A PAd A A @A0T3S(Ad A A @TThe audio library is designed to ease the development of audio applications for Linux and other UNIX platforms. It is designed in C++ and is fully object oriented. It is written in the hope that it will lead to world class audio applications for both personal and professional use for the Linux platform. It has been designed to be used similar to how a kid would play with building blocks. Each block represents a certain audio function (i.e. audio meter, reading audio file, audio editing, etc.). By connecting these blocks (called objects) together in a chain one is able to form a complex audio function rather simply for their application.S(Ad A A @T3S(Ad A A @TThis chaining concept offers immense capability to extend the library in the future. All the audio data is contained in an object and is passed from object to object down the chain. This makes it easy to add objects in the future. In fact it is hoped that Universities and Colleges will become interested in this platform and use it for audio research. Donating filters and what ever back to the library for all to use.S=AtimesAd A A @THS=AtimesAd A A @TsThis library is modeled after a library developed by SGITM called the Image Vision library. It eases the development of image applications and offers chaining as well. Unfortunately it is only available on SGITM platforms. After having used it for over 2 years I have come to appreciate how a complex library can ease the development for users of the library. S(Ad A A @A88::eA8:eTThe idea for this library came from my love of Old Time Radio (OTR) and my favorite computer platform, Linux. It is becoming popular in the world of OTR to save ones shows that they collect digitally with their computer and archive on burnable CD-ROM's. I looked for software for Linux to do the complex audio tasks that are needed to perform this and found that there were a lot of small applications out there but none that did it all. In fact many of the small applications were duplicating the same work over and over again. It became obvious that what was needed was a common library that all can use to develop the audio application of their choice. S(Ad A A @T=S2A PAd A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @Tj BASE CLASSESS(Ad A A @A8  A8 d Tc2. Base ClassesS2A PAd A A @A0TSA @TBase Class IntroductionSVAP<dddWAd A A @A @ 4055671013 TkSVAPWdddWAd A A @A @ 4055671013 !T-The power in this library is contained in the base classes which worker classes can obtain just by deriving from them. You do not need to be concerned about these classes unless you are writing your own derived classes. Here are the key base classes:S(Ad A A @T3S(Ad A A @Tr aflibFileSVAPdddAd A A @A @ 4100211013Ts aflibChainSVAPdddAd A A @A @ 4100211013Ts aflibAudioSVAPdddAd A A @A @ 4100211013TiSVAPdddAd A A @A @ 4100211013 TThe aflibFile class is the class upon which all audio file formats and devices are based. For a full discussion of this class see the chapter on Audio File Formats.S(Ad A A @A8  T3S(Ad A A @T{:The aflibChain class is the class that contains the information that links audio objects together in a chain. It stores the chain member functions, provides member functions to add and remove parents from an object in a chain, and provides callbacks to notify derived objects when the state of a chain has changed.S(Ad A A @A8 T3S(Ad A A @T8The aflibAudio is the key base class. It is derived from aflibChain which contains the chain information for an audio chain. It provides the logic to navigate through the audio chain based on information stored in the chain base class. It also provides member functions that would be common to all audio objects.S(Ad A A @A8 A8 9CT3S(Ad A A @TBase Class Member FunctionsSVAP<dddWAd A A @A @ 4104291013 T3S(Ad A A @T saflibAudio::enable - This member function enables or disables an audio object. This provides the ability to disable an audio object without removing it from the chain. For instance if one has an audio object that is a filter and wishes to disable it then calling this member function with FALSE will cause this object to be bypassed when data is pulled through the chain.SA PT  Tw laflibAudio::getEnable - This member function will get the current enable/disable state of this audio object.T  T aflibAudio::setAudioConfig - This member function will store the audio configuration of an audio object. It stores an aflibConfig object.T  Tz oaflibAudio::getAudioConfig - This member function gets the audio configuration information for an audio object.T  Ti ^aflibChain::getParents - This member function will return all the parents for an audio object.T  TJ ?aflibChain::addParent - This member function allows one to add a parent of an audio object. This is useful when one wants to insert an audio object into a chain after the chain is built. This is useful for the aflibAudioRecorder object. One creates this object with a constructor with no parent audio object. This way it can be used to store timer recorder information for an application. Once an application is ready to use the recorder object it simply inserts it into a chain at the appropriate place by calling this function and removeParent on the correct audio objects.T  Tm baflibChain::removeParent - This member function allows one to remove a parent from an audio chain.T  T aflibChain::dumpChain - This member function is useful for debugging. It will dump the current audio chain information if FALSE is passed in. If TRUE or no parameter is used then the information will be dumped if the environment variable AFLIB_DUMP_CHAIN is set. If the environment variable AFLIB_DUMP_CHAIN is set then chain information will be output whenever the chain is altered since this function is called internally as well.T3S(Ad A A @TDeriving From Base ClassSVAP<dddWAd A A @A @ 4148461013 T3S(Ad A A @TUIf one wishes to add an audio object to this library then one needs to derive from the aflibAudio base class. When one does this it inherits functionality from the aflibAudio and aflibChain classes. To be able to be used in a chain one must design the class obeying certain rules. This section will provide you with the information you need.S(Ad A A @T3S(Ad A A @TWe must first understand how a chain holds together. Below is a portion of code that illustrates how a simple audio chain works.S(Ad A A @T=S2Ad A  A A @Tz= input = new aflibAudioFile(AFLIB_MPEG_TYPE, "test.mp3",S2Ad A  A A @Ta$ &input_config, &status);S2Ad A  A A @T> S2Ad A  A A @Ti, spec = new aflibAudioSpectrum(*input);S2Ad A  A A @T=S2Ad A  A A @TF output = new aflibAudioFile(*spec, AFLIB_DEV_TYPE, "/dev/audio",S2Ad A  A A @T^! &input_config, &status);S2Ad A  A A @T=S2Ad A  A A @Tn1This creates an audio chain that looks like this:S2Ad A  A A @T=S2Ad A  A A @TS2Ad A  A A @l:SAP#SA%PNO ObjBFFFE8A7A  PA  PA  PAPAP*A PA PAPX T=S2Ad A  A A @T=S2Ad A  A A @T=S2Ad A  A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @TIn order to process data through the chain one would loop on the process member function on the last element in the chain. Like this:S(Ad A A @T3S(Ad A A @To( aflibStatus status = AFLIB_SUCCESS;S<Ad A  A  A A @TGS<Ad A  A  A A @Tk$ while (status == AFLIB_SUCCESS)S<Ad A  A  A A @TL {S<Ad A  A  A A @T~7 output->process(status, position, PLAY_DELTA);S<Ad A  A  A A @TM } S<Ad A  A  A A @TGS<Ad A  A  A A @TReferring to the diagram above this will call each process member function down the chain until the end of the chain is reached. When it is reached then each audio object's process function will call the compute_segment member function to actually process what ever needs to be processed on the data. These will be called in order up the chain until the output audio object is reached. SA @A8A8d A8 bhTSA @TWhen you create a derived class these two member functions listed above are the keys. The process member function is implemented in the aflibAudio base class. It implements the case where there is only one parent. If your class will have more than one parent then you will need to override this function with your own implementation. Look at the aflibAudioEdit class as an example. It is possible in the future as more derived classes are added that the aflibAudio base class will be modified to handle multiple parents. The second function, compute_segment, is a pure virtual in the base class and must be implemented in the derived class. This is the function that will perform the work for your derived class.SA @TSA @THFor the compute_segment function you will be passed a reference to the aflibData object. This represents a segment of audio data in which you are to operate. You will also be passed a position. This is the start position of this audio data. If no real processing is done then the derived class should just return AFLIB_SUCCESS. SA @A8HA8Hd TSA @TThere is one other function to use and of course that is the constructor. There are two constructors for the aflibAudio class. The first one contains no parameters. It should be used at the start of a chain when there is no parent aflibAudio object. The second constructor contains an aflibAudio object. This should be called with the parent for this object. It is up to you which one to implement if not both.S(Ad A A @A8 A8 'T5 S(Ad A A @T=S2A PAd A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @TU DATA CLASSS(Ad A A @A8  T3S(Ad A A @T3S(Ad A A @Ta3. Data ClassS2A PAd A A @A0T3S(Ad A A @TData Class IntroductionSVAP<dddWAd A A @A @ 2109341113 T3S(Ad A A @TThe aflibData is the data class that holds a segment of audio data. Most times applications will never see this class. It is passed by the base class aflibAudio to each object in the chain to have the object process the data. Its object is to simply hide the details of the audio data from the audio objects. This allows us to hide the details such as Little Endian / Big Endian and data size from all other objects.S(Ad A A @T3S(Ad A A @TData Class Member FunctionsSVAP<dddWAd A A @A @ 2124371113 T3S(Ad A A @T aflibData::setSample - This member function allows us to set one data item into the object. This is the prefered method of storing data in the object from a worker object. See getSample for more information.T  TI >aflibData::getSample - This member function retrieves one sample data from the data object. For worker classes that need to operate on the data this is the prefered method of data access. Data is returned as an int no matter what size it is. Math can be done as ints by the worker class and then stored back as an int.T- "aflibData::getDataPointer - This member function allows one to actually access the data pointer itself for those who must access the raw data. The use of this member function is discouraged. Those who do access data this way are responsible for everything that goes with accessing raw data.T  T |aflibData::getMinMax - This member function retieves the minimum and maximum range that the data type for this data can be. T  T aflibData::getTotalLength - This returns the total length of memory that was allocated. This allows those who use the data pointer access method to check to make sure they do not overrun the data buffer.T  Ts haflibData::getLength - This returns the number of samples. It is independent of the number of channels. T  Tb WaflibData::getConfig - Gets the current configuration of the audio data is this object.T  T aflibData::setConfig - This sets the current audio configuration. This will free any memory that was allocated in this object and reallocate new memory to hold the data according to the information given in the config object.T   T=S2A PAd A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @TYWORKER CLASSESS(Ad A A @A8 T3S(Ad A A @T3S(Ad A A @Te4. Worker ClassesS2A PAd A A @A0T3S(Ad A A @TO4.1Worker Class IntroductionS(Ad A A @T3S(Ad A A @T|AWorker classes are classes that are derived from aflibAudio. They work on the audio data and are the objects that are used by an application. The aflibAudioFile is a class that allows the aflibFile base class to be used as part of a chain. This is what implements the audio file formats and audio devices. It will not be covered in this chapter but will be covered in a later chapter. This is normally used at the start or end of a chain. The other classes perform some operation on the audio data on the chain. All of these classes are derived from the aflibAudio base class. SA @A8A8d TSA @TwaflibAudioEditSVAPdddAd A A @A @ 4100211013T{aflibAudioRecorderSVAPdddAd A A @A @ 4100211013T{aflibAudioSpectrumSVAPdddAd A A @A @ 4100211013TwaflibAudioFileSVAPdddAd A A @A @ 4100211013T3S(Ad A A @TWorker Class Member FunctionsSVAP<dddWAd A A @A @ 2338471113 T3S(Ad A A @T aflibAudioEdit::addSegment - With these member functions one can add an audio segment to be edited by this class. One can either use sample positions sepcified as long long or use seconds specified as doubles. You can specify exactly where in the output space to insert this segment. In fact all this class really does is remap input space to output space. The segments mearly tell what inputs are mapped to the output when. This class does no mixing so no overlap is allowed. This must be done by other worker classes, not yet implemented, and added as an input to this class. This class also supports multiple inputs so you need to specify the input as well.T  T4 )aflibAudioEdit::removeSegment - These functions will remove an audio segment from the output. One can either specify sample positions or seconds. One can also specify an audio segment by number. Audio segment numbers can be obtained by calling getNumberOfSegments and getSegment. Before removing one should always call these since segment numbers can change. For instance when one adds a segment in the middle of an existing segment, internally the software breaks the existing segment into two segments and then adds the new segment as a third segment.T  T taflibAudioEdit::getNumberOfSegments - This will return the total number of segments currently defined in this class.T  TU JaflibAudioEdit::getSegment - These functions return the data on a segment.T  T/ $aflibAudioEdit::getUndoRedoStatus - T@ 5aflibAudioEdit::performUndoRedo - Not Yet ImplementedT  T aflibAudioRecorder::addRecordItem - This member function allows one to add an item to objects list of items to be recorded. Timer recording is started by the start date and time specified. One can stop recording one of two ways. One can specify a date and time to stop or one can specify a file size. If one does not care about file sizes then simply pass -1 for max file size and each file size. Recording will continue until the stop time is reached. This class will also create the aflibAudioFile derived object internally to write to the file. One can also specify overlapping times. One could for instance record to a mp3 for 2 hours and during that same time record for 5 minutes a wav file. There are two file limits. The max file limit can be used to specify a total maximum file usage. This is useful if you only have 1 GB free on your record partition. You could then specify 950M and then this limit is reached recording will stop. This value only applies for one record item. The second, each file limit, allows one to write to multiple files. Each file not exceeding the each file limit. This is useful for portable mp3 players that have a limit of 32 or 64 M. If you want to record a long talk show then you would simply set a file limit of 31M. This would cause your file to be written until 31M is reached. Then a new file will be started with the same name except _ added before the file extenstion. The number will start at 1 and go as high as needed. For this case the max file limit will apply to all files added together. In order to do timer recording one should call the process member function of this object. This object will do nothing until the start time is reached for an item. T  T |aflibAudioRecorder::removeRecordItem - This will remove an item that was previously added. Once an item has finished as above it will not be removed automatticaly. It is up the user to remove it with a call to this function. If a record item was stopped by a file size limit being reached then the stop time will be modified in the item to reflect the time that recording stopped.T  T waflibAudioRecorder::getNumberOfRecordItems - This function will return the total number of items that have been added. T  T& aflibAudioRecorder::getRecordItem - This will get the data for an item that was previously added. Users of this class should let this object keep track of all items. One can then use this function along with getNumberOfRecordItems to update any user inferface that application may have. Users will find it to their advantage to create an instance of this class with the default constructor of no arguments. This can then be used as a data holder. When you are ready to use it just use the addParent member function to attach it to a chain.T  T aflibAudioSpectrum::setParameters - This function will set parameters necessary in order to perform the spectrum analysis. It allows the user to set the number of samples to be returned for the spectrum callback. It also determines the the size of the FFT that is done for both the spectrum and power meter callbacks. The number of samples must be a power of 2 upto 512. Another words, valid values are: 2, 4, 8, 16, 32, 64, 128, 256, 512. It also allows the user to set the number of times the callback functions will get called a second. There are limits to how large this value can be. It also depends on the sample rate of the audio stream. Good values would be 10 or less. If an invalid number of samples is set then FALSE will be returned.T4 )aflibAudioSpectrum::setPowerMeterCallback - This function allows one to register a callback function in your application to be called when power meter data has been computed. The callback will be called based on the responses per second that was set in the setParamters call. The user must register a function that receives a pointer to an array of doubles: "func(double * val);" The value passed will be in decibels. There will be a value for each channel that was defined in setParameters. In order to turn off the callback pass NULL to this function.T  T aflibAudioSpectrum::setAudioSpectrumCallback - This function allows one to register a callback function in your application to be called when audio spectrum data has been computed. It will be called based on the responses per second that was set in the setParamters call. The user must register a function that receives an int and a double array: "func(int array_size, *double array);" The first value passed will be the size of the array passed in for each channel. If for instance two channels were set then the size of the array would be two times the array size set in setParameters. The first number of samples will be for channel 1 the next sequence for channel 2 etc. The array values passed will be in decibels. When func is called users should copy the data if they wish to save it as the memory will go out of scope when func is exitted. In order to turn off the callback pass NULL to this function.T  T3S(Ad A A @T=S2A PAd A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @TZUTILITY CLASSESS(Ad A A @A8 T3S(Ad A A @T3S(Ad A A @TN5 Utility ClassesS2A PAd A A @T3S(Ad A A @TUtility Classes IntroductionSVAP<dddWAd A A @A @ 2407241113 T3S(Ad A A @TThere are several classes that are not derived from aflibAudio and thus can't be used as part of an audio chain but are needed none the less. These serve a variaty of functions. S(Ad A A @TSA @TqaflibFFTSVAPdddAd A A @A @ 4100211013Tu aflibEnvFileSVAPdddAd A A @A @ 4100211013 Tv aflibDateTimeSVAPdddAd A A @A @ 4100211013 TiSVAPdddAd A A @A @ 4100211013 T Utility Classes Member FunctionsSVAP<dddWAd A A @A @ 2799131113 T3S(Ad A A @T% aflibFFT::fft_double - This member function performs an FFT on input data. Both the input and output data will be in doubles. It will perform either a forward or inverse FFT depending how InverseTransform is set. If set to FALSE then forward FFT will be performed, TRUE and a inverse FFT will be performed. The number of samples (NumSamples) must be a power of 2. The ImagIn pointer can be NULL if there are no imaginary values. The user is responsable for passing in pointers for RealOut and ImagOut containing arrays of the proper size.T  T aflibEnvFile::aflibEnvFile - There are two different constructors for this class. The default constructor will create a .aflib directory in the users home directory. It will then place a aflibenv file in this directory. By using the other constructor users can specify a different file to use as well as another directory to use. If the user specifies another directory they must give the full path name. T  T aflibEnvFile::readValueFromFile - This member function will allow one to read a currently stored value from the env file for a particular key passed in.T  T taflibEnvFile::writeValueToFile - This function will allow one to store a value to the env file for a particular key.T  T aflibDateTime::aflibDateTime - There are two constructors for this class. The default will do nothing. The other will allow the user to set all members in this class. This class defines a date and time in the system.T  TV KaflibDateTime::get & set - Member functions exist to get and set each item.T  T }aflibDateTime::setCurrentTime - This member function will set all date and time fields to the current computer date and time.T  T aflibDateTime::operator < - The less than operator is implemented for this class so that one can test if this date and time if before or after another supplied date and time.T  T aflibDateTime::operator << - The output operator is implemented for this class so that one can print the date and time that is stored in this class.T=S2A PAd A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T3S(Ad A A @T]AUDIO FILE FORMATSS(Ad A A @A8 T3S(Ad A A @TAudio File FormatsS`AP<dddWA PAd A A @A @ 2044501113 T3S(Ad A A @TAudio File Formats IntroductionSVAP<dddWAd A A @A @ 2845291113 T3S(Ad A A @TCNot yet written.S(Ad A A @T3S(Ad A A @T3S(Ad A A @T5 S(Ad A A @T3S(Ad A A @T3S(Ad A A @T7 S(Ad A A @JGeneric PrinterSGENPRT PostScriptDRtRtd,,lprlprSGENPRT7 Uk#d#7V88.?$.AUq 6P)Uq (q H@q °Uq 52?Bq B q kq {Bxq xq Bq B q Bq B$q B1 q -U9q (q F@q B.AUq 6p)Uq (q H@q VUq 52?Bq  B q  Bq  B'q  B4q  BAq BNq B[q Bhq Bu q B q B q B q B q Bq Bq Bq Bq -U9q (q F@q %….AUq 6P)Uq (q H@q ¢Uq 52?Bq Bq B#q hB q B q ABq  Bq N!B4q u " -U9q (q F@q С%.AUq 6p)Uq (q H@q *Uq 52?Bq #Bq $B,q %BBq &BXq 'Bnq (@Bq )ABq *BBq +CB q ,DB q -EB q .FB q /GBq 0HB4q 1I-U9q (q F@q % .AUq 6P)Uq (q H@q WUq 52?Bq 2JBq 3KB#q E<5 4LB0q EW 5MB=q '6PBdq 7QBqq 8RB~ q 9SB q :TB q EV ;UB q <WBq =XBq 4>\Bq ?]B q 4@aBAq AbBNq E<5 BcB[q CdBhq ADiB!q EjB"q FlB$q GmB%q HoB'q IpB)q JrB+q KsB+,q LuBE.q MvBR/q Nx-U9q (q F@q M%eN.AUq 6p)Uq (q H@q Uq 52?Bq NN~BNq OB[q PBu q QB q [RBq SBq E<5 TBq UBq 4VB8q WBEq XB_q YBgq ZBoq [Bwq \B q ]B!q ^B"q _B#q `B$q aB%q bB&q c-B'q d-U9q (q F@q Д3%F.AUq 6P)Uq (q H@q Uq 52?Bq eBq fBq gBq hBq iBq jBq kBq lBq mBq nBq oBq pB*q qB7q rBQq sB^q tBfq uBn q vBv!q wB~"q xB#q yB$q zB%q A{B*q |B+q N}-U9q (q F@q +ej F ?*   %'.AUq 6p)Uq (q H@q ŒUq 52?Bq '}B'q ~B4q 4Bhq Bu q ABq -U9q (q F@q %.AUq 6P )Uq (q H@q ŽUq 52?Bq Bq B,q BBq BXq Bnq Bq Bq Bq B q B q B q B q Bq B4q BJq B`q B-q B:q -U9q (q F@q c%Y.AUq 6p )Uq (q H@q Uq 52?Bq Bq B,q E<5 B9q BFq AB q B q E<5 B q B q 'Bq Bq AB#q 4BWq Bdq B~q Bq 'B!q B"q B$q B%q  B&q  B(q ' B'+q -U9q (q F@q i%ʜ.AUq 6P )Uq (q H@q Uq 52?Bq Bq B,q BBq BXq Bnq Bq Bq Bq B q B q B q B q Bq B4q BJq B`q Bvq  Bq !Bq "Bq #Bq $Bq %Bq &-U9q (q F@q p%.AUq 6p )Uq (q H@q Uq 52?Bq 'Bq (B,q )B9q *BFq [1B q 2B q 3B q 4Bq 5Bq 6Bq 7Bq E<5 8Bq 9B q CBq DBq hLB(q MB )q OB'+q PB4,q QBA-q RBN.q SB[/q TBh0q U-U9q (q F@q ?%".AUq 6P )Uq (q H@q Uq 52? Bq 8mB8q nBEq NtB q uB!q wB#q xB$q hB/-q B<.q '-U9q (q F@q %me.AUq 6p)Uq (q H@q Uq 52?Bq hBhq hBq Bq Bq B q -U9q (q F@q A%N.AUq 6P)Uq (q H@q Uq 52?Bq Bq B,q BBq BXq Bnq Bq Bq Bq B q B q B q B q Bq B4q BJq B`q Bvq Bq Bq B]q Bjq -U9q (q F@q м%/.AUq 6p)Uq (q H@q EUq 52?Bq Bq B#q E<5 B0q B=q 'Bdq Bqq B~ q B q  B q EV  B q E<5  B q  Bq h B'q B4q NBq Bq B!q B"q B$q B%q 'B)q B*q B+q B+,q BE.q BR/q -U9q (q F@q %..AUq 6P)Uq (q H@q SUq 52?Bq B q Bq -U9q (q F@q -%p.AUq 6p)Uq (q H@q ¶Uq 52?Bq Bq B,q  BBq !BXq "Bnq #Bq $Bq %Bq &B q 'B q (B q )B q *Bq +B4q ,BJq -B`q .Bvq /Bq 0Bq 1Boq 2-U9q (q F@q s%ҳ.AUq 6P)Uq (q H@q Uq 52? Bq E<5 3Bq 4B#q E<5 5B0q 6B=q 7BJq 8BWq 9 Bdq : Bqq ; B~ q < B q = -U9q (q F@q lZaK4)SfxDocumentInfo Bruce Forsberg F 1`SBruce Forsberg F 1W uK Info 0 Info 1 Info 2 Info 3 F 1P<44Standard LIBIMBEDDED LIBIMBEDDEDSBX sb Z Standard StarBASICSBX ARSBX AR SBX AR2c%bqqOh+'0 h t 4@c@@#C@S],@5` ,Bruce ForsbergBruce ForsbergXOutdevItemPool 1   )     &'()*+,-./06789:;UVWXYZ[\]c !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstt      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefdW0\,'(@wXXX'@?(222222Ultrafine Dashed333XX,XJXhX':@2dXXXX&';@BlackXX '@~Arrow ArrowddXXXS'@4ArrowddArrow}}XXX_'.@n,XXX'.@,XXX'@XX'@X@X @1 @G @] @s @ @'@XX'b@'̙XX X2XD'6@u22ddX'(@X'"@ BMvv(@@SD@x^SI 0 s\ z 46ZBn8x)1̔.<觔B+̄ ޢ40:prf |q]~+H~|WFMbP@aoCē[ȡz6~U{߃XJXVff @ QQVVJJKKQQVVJJKKJJKKJJQQVVQQVV JJKKUUVVXXX&XDXVXhXtXXBXI9s2H^8l4J`v&<Rh~, Z p f  2 H ^ }  + A W m A#u  P% EditEngineItemPool d6f0-6' @ @ @ ~ xdddxddd ddd ddddddddd8ddd8XdddXxdddx !ddd!XX!X4XGXZXmXXXX<(@ X (@ StarBats!"KStarBats!"KStarBats!"K StarBats!r7Starbats$rKStarbatsR$=KStarbats$;KStarbats$AKXXGXXXX+XdX@' @  dddddXddddxdddxddd ddd ddddddddd 8ddd8 XdddX xdddxXX!X4XGXZXmXXXXXXA'@d dddddd ddddddd,ddddddXXX&X2X>XJXVXb1'@ dX+'(@ XXX' @!'@X'@?timesX' @ Nd 4d d d {d d ,d hd d d d XXX"X,X6X@XJXTX^XhXr?( @ '@)XX'@LX'@kX'@XX'@X'@X%' @S' @"' @' @-$:6VT~9m'Fe{BP!''times'd .~2p *,StandardStandard!'''''''''''''''+;(,,--.. (@'A'1'+'!'''''''''Object with arrowStandardObject with arrow'''''''Object with shadowStandardObject with shadow+;(,,--..Object without fillStandardObject without fill'TextStandardText'' Text bodyStandard Text body'''Text body justfiedStandardText body justfied''+'First line indentStandardFirst line indent''@'TitleStandardTitle'''Title1StandardTitle1 '''+;(,,--..+''Title2StandardTitle2 ''+;(,,--..@'A'+''HeadingStandardHeading''A''Heading1StandardHeading1''A'''Heading2StandardHeading2''A''''Dimension LineStandardDimension Line'''''''Home~LT~Gliederung 1Home~LT~Gliederung 1  (@'A'+'!'''''''''Home~LT~Gliederung 2Home~LT~Gliederung 1Home~LT~Gliederung 2 (@'A''Home~LT~Gliederung 3Home~LT~Gliederung 2Home~LT~Gliederung 3 (@'A''Home~LT~Gliederung 4Home~LT~Gliederung 3Home~LT~Gliederung 4@'A'' Home~LT~Gliederung 5Home~LT~Gliederung 4Home~LT~Gliederung 5@'A'' Home~LT~Gliederung 6Home~LT~Gliederung 5Home~LT~Gliederung 6@'A'' Home~LT~Gliederung 7Home~LT~Gliederung 6Home~LT~Gliederung 7@' A'' Home~LT~Gliederung 8Home~LT~Gliederung 7Home~LT~Gliederung 8@' A'' Home~LT~Gliederung 9Home~LT~Gliederung 8Home~LT~Gliederung 9@' A'' Home~LT~Titel Home~LT~Titel''QQ (+'!''' ''''''Home~LT~UntertitelHome~LT~Gliederung 1Home~LT~UntertitelQQ@'+'Home~LT~NotizenHome~LT~Notizen ''!'''''''''Home~LT~HintergrundobjekteHome~LT~Hintergrundobjekte+;(,,--..Home~LT~HintergrundHome~LT~Hintergrund''TitleTitle@Background objectsBackground objects@ Background Background@NotesNotes@ Outline 1 Outline 1@ Outline 2 Outline 1 Outline 2@ Outline 3 Outline 2 Outline 3@ Outline 4 Outline 3 Outline 4@ Outline 5 Outline 4 Outline 5@ Outline 6 Outline 5 Outline 6@ Outline 7 Outline 6 Outline 7@ Outline 8 Outline 7 Outline 8@ Outline 9 Outline 8 Outline 9@hD2n8~ RP 8  ^ 4 g 3 f DrMdJoeMl0F 1PG 1?F 1 -WODrLy LAYER_LAYOUTDrLy LAYER_BCKGRNDDrLy LAYER_BACKGRNDOBJDrLyLAYER_CONTROLSDrLy!LAYER_MEASURELINESDrMP&JoeM$mTDrML DrOb<SVDr&1(&DrOb<SVDr&D[&DrOb<SVDr&1-(5LDrOb<SVDr&D-[5LDrXXgg fHome~LT~GliederungDrMP8JoeMT$my{DrML DrObSVDr&y{kQj'Home~LT~Hintergrundy{kQjDrXXgg NHome~LT~GliederungDrMPhJoeMT$mDrML DrObSVDr& h8P0! Home~LT~Titelw h8P0XxV4B1CClick to move the slide Home~LT~Titel<(DrObSVDr& 3>Gw]#Home~LT~Notizeny 3>Gw]ZxV4B1EClick to edit the notes formatStandard<(DrXXgg VHome~LT~GliederungDrPgbJoeM$mTDrML8DrMD,DrXX Handoutsgg FHome~LT~GliederungDrPg'JoeMT$my{DrML8DrMD,DrObSVDr&: 36'Object without fill: 36DrObSVDr& +H'Object without fill +HDrObSVDr& / Am'Object without fill / AmDrObSVDr&e  StandardF0DrObSVDr& , Standard+DrObSVDr&.A Standard. ADrObSVDr&  Standardc  DxV4B1/AflibAudioFileStandard'DrObSVDr&"3 T= Standardc"3 T= DxV4B1/AflibAudioFileStandard'DrObSVDr& ) Standardg ) HxV4B13AflibAudioSpectrumStandard'DrObSVDr&dW StandardE808DrObSVDr&C Standard2wbDrObSVDr&\  - Standard=(,DrObSVDr&8, Standardo,DrObSVDr&.A Standard*.@DrObSVDr&r.BB Standard+)S/a>AaDrObSVDr&4@98Standard\4@98=xV4B1(ProcessStandard'DrObSVDr&c$[Standard\c$[=xV4B1(ProcessStandard'DrObSVDr& .&Standard\ .&=xV4B1(ProcessStandard'DrObSVDr&N\GTStandarddN\GTExV4B10compute_segmentStandard'DrObSVDr&8J1)BStandardd8J1)BExV4B10compute_segmentStandard'DrObSVDr&1=Standardd1=ExV4B10compute_segmentStandard'DrObSVDr& <  Standard(#  DrObSVDr&!+x# Standard(#"" DrObSVDr&6j8 Standard(#77DrObSVDr&OStandard0DrObSVDr&*/Standard.+DrXXgg FHome~LT~GliederungDrPg\JoeMT$mDrML8DrMD,DrOb<SVDr& h8P0DrObSVDr& 3>Gx]#Home~LT~Notizena 3>Gx]BxV4B1-Click to add notesStandardDrXXgg VHome~LT~GliederungDrXX+Generic PostScript PrinterGENERIC PostScriptD$ &&d,,lprp9999999H9X9h9x99999P9`9p99991;1;p:5:5:5:5:5:5:5:5;5;5;5;5;5<5<5(<5 =50=5@=5P=5`=5p=5=5=5@#P#`#p#########(#8#H#X#lpr!;!;!;!;!;!;";x#;#;#;#;#;#;#;#;%;%;%;%;%;%;%;%;';';';';';';(;(;);*;*; *;0*;@*;P*;`*;X,;h,;x,;,;9999XR'hR'xR'R'R'R'R'R'U'U' U'0U'@U'PU'`U'pU'GENERICX'(X'8X'HX'XX'hX'Z'Z'['[' ['0['@['P['$$$$ $0$@$P$$$($8$H$X$h$x$P$`$p$$$$$$$ȱ$ر$$$$0;0;z#z# z#0z#@z#Pz#`z#pz#}#}#}#}#}#}#~#~#p######Ё#H Root Entry ®`VObjBFFFE8A7.)䰱CompObj<Ole StarBASICSfxWindows>SwNumRules,Standardjpersist elements" XSfxDocumentInfo  uBasicManager2 4SfxStyleSheetsSummaryInformation( 9@SwPageStyleSheets$KStarWriterDocument&HCompObj>=Ole ?persist elements"@SfxDocumentInfo AuBasicManager2O4StarBASICSfxWindowsPStandardQjSfxStyleSheetsyU-SummaryInformation(S@StarDrawDocument3$