From db65f7a61d58a4eae297db3f25e0aa71bcb0b777 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 11 Dec 2011 16:13:49 +0100 Subject: [PATCH] Use system OpenAL --- neo/openal/docs/ChangeLog | 378 --- neo/openal/docs/Makefile | 148 -- neo/openal/docs/alc-context.sgml | 846 ------- neo/openal/docs/api-reference.html | 15 - neo/openal/docs/app-annotations.sgml | 297 --- neo/openal/docs/app-constants.sgml | 43 - neo/openal/docs/app-extensionprocess.sgml | 36 - neo/openal/docs/app-extensions.sgml | 754 ------ neo/openal/docs/architecture.html | 16 - neo/openal/docs/chp-buffers.sgml | 691 ------ neo/openal/docs/chp-introduction.sgml | 304 --- neo/openal/docs/chp-multichannel.sgml | 261 --- neo/openal/docs/chp-operation.sgml | 977 -------- neo/openal/docs/chp-queueing.sgml | 2 - neo/openal/docs/chp-rendering.sgml | 2076 ----------------- neo/openal/docs/chp-state.sgml | 730 ------ neo/openal/docs/ent-examples.sgml | 5 - neo/openal/docs/ent-extensions.sgml | 3 - neo/openal/docs/ent-marks-annotated.sgml | 12 - neo/openal/docs/ent-marks-full.sgml | 12 - neo/openal/docs/ent-marks-reference.sgml | 12 - neo/openal/docs/ent-marks-specification.sgml | 12 - neo/openal/docs/ent-names.sgml | 43 - neo/openal/docs/index.html | 21 - neo/openal/docs/oalspecs.sgml | 109 - neo/openal/docs/sec-bookinfo.sgml | 53 - neo/openal/docs/specification.html | 18 - neo/openal/docs/white-paper.html | 16 - neo/openal/include/al.h | 491 ---- neo/openal/include/alc.h | 91 - neo/openal/include/alctypes.h | 125 - neo/openal/include/altypes.h | 333 --- neo/openal/include/alu.h | 34 - neo/openal/include/eax2.h | 345 --- neo/openal/include/eax3.h | 547 ----- neo/openal/include/eax4.h | 1575 ------------- neo/openal/include/eax5.h | 1792 -------------- neo/openal/include/eaxac3.h | 232 -- neo/openal/include/eaxman.h | 171 -- neo/openal/lib/eaxguid.lib | Bin 4426 -> 0 bytes neo/openal/lib/openal32.lib | Bin 17240 -> 0 bytes neo/openal/osx/OpenAL.framework/Headers | 1 - neo/openal/osx/OpenAL.framework/OpenAL | 1 - neo/openal/osx/OpenAL.framework/Resources | 1 - .../OpenAL.framework/Versions/A/Headers/al.h | 498 ---- .../OpenAL.framework/Versions/A/Headers/alc.h | 88 - .../Versions/A/Headers/alctypes.h | 165 -- .../Versions/A/Headers/altypes.h | 326 --- .../Versions/A/Headers/alut.h | 55 - .../osx/OpenAL.framework/Versions/A/OpenAL | Bin 256696 -> 0 bytes .../Resources/English.lproj/InfoPlist.strings | Bin 486 -> 0 bytes .../Versions/A/Resources/Info.plist | 26 - .../Versions/A/Resources/READ_ME | 86 - .../Versions/A/Resources/pbdevelopment.plist | 8 - .../osx/OpenAL.framework/Versions/Current | 1 - neo/sound/efxlib.h | 2 +- neo/sound/snd_local.h | 4 +- neo/sys/win32/eax.h | 533 ----- neo/sys/win32/eaxguid.lib | Bin 1888 -> 0 bytes 59 files changed, 3 insertions(+), 15418 deletions(-) delete mode 100644 neo/openal/docs/ChangeLog delete mode 100644 neo/openal/docs/Makefile delete mode 100644 neo/openal/docs/alc-context.sgml delete mode 100644 neo/openal/docs/api-reference.html delete mode 100644 neo/openal/docs/app-annotations.sgml delete mode 100644 neo/openal/docs/app-constants.sgml delete mode 100644 neo/openal/docs/app-extensionprocess.sgml delete mode 100644 neo/openal/docs/app-extensions.sgml delete mode 100644 neo/openal/docs/architecture.html delete mode 100644 neo/openal/docs/chp-buffers.sgml delete mode 100644 neo/openal/docs/chp-introduction.sgml delete mode 100644 neo/openal/docs/chp-multichannel.sgml delete mode 100644 neo/openal/docs/chp-operation.sgml delete mode 100644 neo/openal/docs/chp-queueing.sgml delete mode 100644 neo/openal/docs/chp-rendering.sgml delete mode 100644 neo/openal/docs/chp-state.sgml delete mode 100644 neo/openal/docs/ent-examples.sgml delete mode 100644 neo/openal/docs/ent-extensions.sgml delete mode 100644 neo/openal/docs/ent-marks-annotated.sgml delete mode 100644 neo/openal/docs/ent-marks-full.sgml delete mode 100644 neo/openal/docs/ent-marks-reference.sgml delete mode 100644 neo/openal/docs/ent-marks-specification.sgml delete mode 100644 neo/openal/docs/ent-names.sgml delete mode 100644 neo/openal/docs/index.html delete mode 100644 neo/openal/docs/oalspecs.sgml delete mode 100644 neo/openal/docs/sec-bookinfo.sgml delete mode 100644 neo/openal/docs/specification.html delete mode 100644 neo/openal/docs/white-paper.html delete mode 100644 neo/openal/include/al.h delete mode 100644 neo/openal/include/alc.h delete mode 100644 neo/openal/include/alctypes.h delete mode 100644 neo/openal/include/altypes.h delete mode 100644 neo/openal/include/alu.h delete mode 100644 neo/openal/include/eax2.h delete mode 100644 neo/openal/include/eax3.h delete mode 100644 neo/openal/include/eax4.h delete mode 100644 neo/openal/include/eax5.h delete mode 100644 neo/openal/include/eaxac3.h delete mode 100644 neo/openal/include/eaxman.h delete mode 100644 neo/openal/lib/eaxguid.lib delete mode 100644 neo/openal/lib/openal32.lib delete mode 100644 neo/openal/osx/OpenAL.framework/Headers delete mode 100644 neo/openal/osx/OpenAL.framework/OpenAL delete mode 100644 neo/openal/osx/OpenAL.framework/Resources delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Headers/al.h delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/OpenAL delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist delete mode 100644 neo/openal/osx/OpenAL.framework/Versions/Current delete mode 100644 neo/sys/win32/eax.h delete mode 100644 neo/sys/win32/eaxguid.lib diff --git a/neo/openal/docs/ChangeLog b/neo/openal/docs/ChangeLog deleted file mode 100644 index b4eb754d..00000000 --- a/neo/openal/docs/ChangeLog +++ /dev/null @@ -1,378 +0,0 @@ -2001-02-06 Bernd Kreimeier - - * chp-rendering.sgml: added annotation about CONE calculation. - * chp-state.sgml: added more annotation on log vs. linear GAIN. - -2001-01-09 Bernd Kreimeier - - * chp-state.sgml: ungrep of scratched DISTANCE_SCALE. - -2001-01-08 Bernd Kreimeier - - * chp-rendering.sgml: amended MAX_DISTANCE. - * chp-state.sgml: culling clarification. - Note: MAX_DISTANCE (and consequently the current - Inverse Clamped Distance Model) do not fit the API. - The clamping of the distance (instead of clamping - to the effective gain at the max. distance) will - potentially break other distance-dependend calculations - further down in the processing chain. - TODO: revisit Inverse Clamped Distance Model. _DS3D extension? - -2001-01-05 Bernd Kreimeier - - * chp-rendering.sgml: SOURCE_RELATIVE specification. - - * chp-state.sgml: clarified distance attentuation calculation - a bit, and added back in the linear version as an annotation. - Note: watch this, it's tied into the GAIN_LINEAR issue. - TODO: added dist calculation requirements. - -2001-01-04 Bernd Kreimeier - - * chp-operation.sgml: INVALID_ENUM for getters and enable, - not INVALID_OPERATION. Later: Delete{Object}s accepts zero. - -2000-12-04 Bernd Kreimeier - - * Makefile: added HTML ZIP targets ("update" for website). - -2000-11-10 Bernd Kreimeier - - * WWW: reworked the OpenAL web site as in CVS. This - includes emptying HTML files with obsolete whitepaper - and specification content not even linked from the - official pages, and reworking the official pages to - remove redundancy, and generally point to the snapshots. - Also created snapshots page (along with cronjob and - automated update installed by Rafael). - - * Makefile: added ZIP file generation to update target. - - * index.html: edited for snapshots/ page on www.openal.org. - As it is next to impossible to reproduce the Official OpenAL - Look w/o lots of tap dancing, I use the style from the - DocBook HTML rendering instead. - -2000-11-06 Bernd Kreimeier - - * Makefile (full): full rendering target added. - * ent-marks-full.sgml: created. - -2000-10-27 Bernd Kreimeier - - * Makefile: rendering targets for cronjob driven update. - -2000-10-26 Bernd Kreimeier - - * alc-context.sgml: annotation on release of hardware resources. - Removed version query enry point, added size-safe GetIntegerv - and GetString, removed GetErrorString, added integer and string - query tokens, added device enumeration query. Added more annotation. - - * chp-rendering.sgml: remark on release of hardware resources. - - * alc-context.sgml: had INVALID_DEVICE also marked by RFC. - Removed the "device parameter should be NULL" leftovers. - Added Query functions. Removed redundant device parameters - to avoid GLX-style redundancy and resulting BadMatch errors. - - -2000-10-25 Bernd Kreimeier - - * oalspecs.sgml: include extension list entity (below). - * ent-extensions.sgml: created. - Note: during several unsuccessful attempts to convince - DocBook and the DocBook toolchain to handle CDATA external - entities properly for and , - I also had to recover accidentally deleted files. - -2000-10-24 Bernd Kreimeier - - * alc-context.sgml: shared object section. Mike Kelly request - as RFC. ALC Error section placeholder. ALC attribute section - as placeholder. Process/Suspend added plus annotation, Update - removed. More typo fixes. Added extension query. Removed old - RFC's. No UNDERFLOW error. No CHANNELS attribute, MIXAHEAD - redundant. Removed alcUpdate( PROCESS | SUSPEND ) RFC. - - -2000-10-23 Bernd Kreimeier - - * alc-context.sgml: entities for ALCdevice and ALCcontext. - Fixed typos reported by CarloV on non-pointer handles. - - * chp-rendering.sgml: infinite LOOPING attribute. - -2000-10-20 Bernd Kreimeier - - * ent-examples.sgml: experimenting with external sample.c - files as CDATA entities, to no avail. - * oalspecs.sgml: example entities. - -2000-10-16 Bernd Kreimeier - - * chp-rendering.sgml: moved in buffer queueing. - Scratched PLAY_COUNT. Fixed SourceStart{v} residue. - - * chp-queueing.sgml: proof-reading, contents then moved out. - -2000-10-13 Bernd Kreimeier - - * chp-queueing.sgml: changed according to discussion. - Removed some, but not all redundant annotation, and removed - remainders of old attribute based approach. Added annotation - on repetition by multiple calls. Changed signatures. - -2000-10-11 Bernd Kreimeier - - * chp-state.sgml: removed GAIN_LINAR based equations. - * chp-rendering.sgml: removed GAIN_LINAR. - * ext-gainlinear.sgml: collected GAIN_LINEAR related sections. - Note: choosing to use GAIN_LINEAR_LOKI for now. The duplication - of tokens complicates specification and implementation, and - requires further discussion. - - * ent-marks.sgml: added Revision mark. - - * oalspecs.sgml: added per-file revision history (appendix). - Note: we might wind up never rendering these, I can't see - a consistent way to do this. - - * ChangeLog: moved in revision history from oalspecs.sgml. - Note: see the very first entry in this document for the - revision history that predates this ChangeLog. - TODO: include ChangeLog in RFC/Revision rendering. - - * chp-introduction.sgml: removed CVS based revision history. - Added a %Revision marked section (we now have these per-file). - -2000-10-10 Bernd Kreimeier - - * oalspecs.sgml: reworked for new distributed document. - - * app-annotations.sgml: created from original doc. - * app-extensionprocess.sgml: created from original doc. - * app-extensions.sgml: created from original doc. - * app-constants.sgml: created from original doc. - - * alc-context.sgml: created from original doc. - Note: this breaks the scheme a bit, as this is technically - a chapter, but if ALC turns into a multi-chapter - documentation at some point down the road it will have - to be a separate document anyway. - - * chp-multichannel.sgml: created from original doc. - * chp-queueing.sgml: created from original doc. - * chp-buffers.sgml: created from original doc. - * chp-rendering.sgml: created from original doc. - * chp-state.sgml: created from original doc. - * chp-operation.sgml: created from original doc. - * chp-introduction.sgml: created from original doc. - * sec-bookinfo.sgml: created from original doc. - - * ent-names.sgml: created from original doc. - * ent-marks.sgml: got it working. - Note: this will be a temporary file (created from the Makefile), - not sure whether it should be in CVS at all. - - * ChangeLog: created. - -2000--1999 Bernd Kreimeier - - * oalspecs.sgml: moved out CVS Revision History (below). - - The AL Specification was originally maintained as an HTML - document, and subsequently as a single SGML file. With the - split into several files, it is no longer possible or - desirable to maintain a single revision history. As we - have a manually maintained revhistory within the DocBook - source, I decided to move the old revision history into - the ChangeLog. - - Revision 1.11 2000/10/11 18:44:46 bk - More JMJ typo corrections. IA-SID I3DL2 section rephrased. Moved - marked section toggles in ent-marks.sgml file so that these can - be generated or modified from the Makefile. Split document up into - several separate files using external entities. Created external - ChangeLog. From now on, revision history and changes will be - maintained in the ChangeLog as it is scattered over files. - - Revision 1.10 2000/09/27 22:57:02 bk - Commit w/o subdoc (doesn't work). - - Revision 1.9 2000/09/27 22:54:36 bk - Typos from MKV and JMJ. Fixed Inverse Square Law. Scratched - ProgagationSpeed. Described distance models in full. Changed - to INVERSE_DISTANCE (both models use ROF). Added GH text (parts) - as annotation to "View" sections, added Basic AL Operation text - he sent (some changes, removed redundant section), marked source - as Example sections. Changed Terminology annotation. Added TBA - on Fundamentals. RFC'ed distributed error section from GL and - annotation. Added TBA on Floating Point Computation. Added AL - State TBA. Added AL entity as opposed to OAL. Added Command Syntax - TBA (minimal) plus annotation. More fixes from JMJ. No NaN - check comment. Rephrased invalid commmands. Disclaimer on - Enable/Disable being unused. Query with NULL destination - clarified. Example values for simple query. TBA on data - conversions. Cleaned out Time query/scaling, added RFC, - marked DURATION/REMAINDER as Scratch. Euclidean. No Transforms - now annotation. Promoted RFC on Source( BUFER, NONE ) to spec - text. Scratch'ed Streaming Buffer remarks. Removed IMPLIED. - Scratch'ed Buffer Traversal and a whole shebang of queueing - annotation to go with it. ALC cleanup, RFC on multiple - current contexts. Skipped Buffer Queueing section for now. - SUBDOC NO in DocBook declaration. Validation pass for CVS. - - Revision 1.8 2000/09/20 01:21:33 bk - Fixes from Ian Ollman: fixed wrong title on Buffer Attributes - section. Annotation on No application selected Names. Fixes - from JMJ: typos and mistakes on I3DL2. Renamed LOOP_COUNT to - PLAY_COUNT and clarified counting as requested. DOPPLER_FACTOR, - DOPPLER_VELOCITY, Doppler Effect section rewritten according to - announced changes. Removed DistanceFactor, added scale invariance. - Scratch-marked Multichannel sketch. Added BufferWriteData as Loki - extension. Removed obsolete RFC on depercating BUFFER. Rewrote - Buffer queueing state section and renamed BUFFERS_USED to - BUFFERS_PROCESSED following discussion with John Kraft, to remove - ambiguity. Rewrote BUFFERS_PROCESSED description. Added - MAX_DISTANCE plus MUTE annotation. Added No Culling section. - Edited DISTANCE_MODEL section. Distance Model Source Attributes - added. Rolloff quantization annotation added. Evaluation order - on attenuation/gain. Marked Scratch the current IASIG section - per JMJ's request, added Source Environment Attribute section - as TBA. Removed and moved RFC's (AppendData, GenStreaming). - Clarified directional attenuation. Clarified CONE_OUTER_GAIN - as scaling factor. Added a Programmers and Implementors View. - - Revision 1.7 2000/08/15 02:47:03 bk - Fixed RFC markup error needed for Full version. - - Revision 1.6 2000/08/15 02:20:49 bk - Clarified BUFFER_USED vs. buffer state. Started section on - handling multichannel output. Moved out GenStreamingBuffer - in annotation on BufferAppendData extension. Added BufferWriteData - with internalFormat parameter and discussion on mono vs. - multichannel buffers. Added Multichannel objects (kept short in - case we demote to extension or replace). Some annotation. - Tried GGI docbook2texi in attempt to end those rogue linux/doc - activities, to no avail. Removed messy scratchpad section. - Removed outdated example listing. Turned remaining scratch - annotation into appendix. Created minimal Makefile (cleanup). - - Revision 1.5 2000/08/08 02:56:05 bk - alcGetCurrentContext. Attempt to formulate Design Objectives as - a guideline. RFC's on INITIAL state, ACTIVE misnomer. RFC on - INVALID_POINTER. Lots of scratch stuff (fallout from buffer - queueing discussions). Annotations on various buffer queue - rejects and related issues. Added Scaling and Timing sections - and related calls. Added CONE_OUTER_GAIN. Added Doppler sections. - Rewrote and shuffle globale state, simple query, string query. - Moved Extensions sections in Appendix. Added annotation and - RFC's regarding distance/gain model. No more ILLGEAL - finally - checked the specs and Mesa 3.3 to be sure. Picked OPERATION at - the same time, also specs conformat (no comment...). Removed - JMJ as responsible author (all blame shall be mine). Fixed - Play(), INITIAL vs. STOPPED. Edited related RFC's, stripped - obsolete commentary. Rewrote State/State Transition section. - Fixes on SGML. CHANNELS and BITS moved in RFC's. Moved and - rewrote RFC on Duration/Remainder queries into Time section. - Stripped BYTE_LOKI of all but the essentials. Added placeholders - for Callback and AppendData in same (backwards compatibility) - section. Lots of Buffer Queueing. - - Revision 1.4 2000/07/25 17:19:17 bk - Changed ILLEGAL_OPERATION to ILLEGAL_COMMAND consistently. Added - excerpts from mailinglist to scratch section. Added Appendix on - Extension Process. Typos. RFC on EXTENSIONS changed to Annotation. - SGML validation and error fixes (not done on cvs1.3, sorry). - - Revision 1.3 2000/07/24 21:18:53 bk - Reordered manual revision history to be CVS compliant. Diff against - Rev. 1.4/bk000626 as it was not checked in CVS. Created scratch - section for removed RFC 's. Checked edits on Extension section and - removal of related RFC/bk000506. Converted removed RFC/bk000504 - on IsExtensionPresent in Annotation. Rewrote Mike's annotations - on source types and distance attentuation clamping as RFC's and - added some removed RFC sections back. Rewrote annotation added by - MikeV on compressed buffers, split of RFC on AL_SIZE query. - Re-added RFC's an buffer attribute defaults, edited annotation - on GetEnumValue return. RFC's on factory methods for streaming - buffers, memory budgeting, initial object state. Re-inserted and - extended RFC on format enum issue. Re-inserted the global - setter/getter in scratch section. Implementation requirement - section. Resurrected CONE_OUTSIDE_GAIN as RFC. BITS bitching, - annotation to explain why not enumerating frequencies. Got a grip - and recognized BITS and CHANNELS as query-only. More on frequency - in BufferData. Into CVS before current discussions are added. - - Revision 1.2 2000/07/19 15:16:58 briareos - Enable/Disable return void, not enum. - - Revision 1.1 2000/06/29 00:27:24 briareos - Initial draft of OpenAL specs. - - - 1.4/briareos : not in CVS - Finished editing related to my comments, with Joe's - feedback, in preparation for use by Creative and eventual - public dissemination later this week. - - 1.4/bk000626 : not in CVS - Started using id attribute on RFC note elements, to ensure unique - identifiers. Added Annote level. Added oal15-jm/overview.html - changes. Added oal15-jm/object-state.html (mostly). Removed - Filtering/Spatialization distinction and merged attribute table. - Moved Filter chapter to annotation. Moved Geometry to annotation, - rewrote annotation with my latest conclusions on A3D/EAGLE like - approach. Stripped out ALU and ALUT, added annotation on reasons. - Added some text to introduction chapter. Moved ALC chapter to end - of specification. Followed John Hall advice to enable section - numbers in print stylesheet. Rewrote section on GetError. Created - I3DL2 extension appendix. Reworked all tables for better - formatting with separated descriptions. Took out a bunch of - outdated RFC's. Rewrote Query and String Query section. Added - Scratch sections. Added ARB/Ack section. Didn't get RFC comments - from MikeV. Fixed permission to copy. - - 1.4/bk000508 : not in CVS. - Added RFC to Device section. Made nested RFC around entire - device section to make sure. Added trailing blanks to data type - entities as a cheap workaround to the HTML backend problem in - FuncSynopsis. Added RFC from BYTE_LOKI discussion on mailinglist. - - 1.4/bk000507 : not in CVS. - Added altypes.h info on scalar types, copied Linux OpenGL Base - ABI layout. Also added some missing enums. Checked alc.h header, - added UpdateContext and RFC's. Changed alc*Context signatures to - include ALCdevice handle. Checked al.h header, fixed outdated - BufferData/BufferAppendData signatures, added RFC's. Added comments - on differing return types. This pretty much concludes the inventory. - - 1.4/bk000506 : not in CVS. - The HTML in CVS was completely mangled between the 1.2 and 1.3 - revisions. Also, redundant al and AL_ prefixes were added, and - the document was restructured. I tried SaveAs ASCII and - whitespace insensitive compare, and finally did the compare - manually (no guarantees). The text sections that looked - relevant have been added in RFC's with the bk000506 tag. - Also added a revision history and CVS tags for future CVS based - revision control (post-E3). - - 1.4/bk000505 : not in CVS. - SGML version. Merges AL specification and API reference as - of GDC (v1.2) with each other. Adds ALC placeholder. - Addition of several RFCs based on recent discussions. - - 1.3/cvogelsa : only in CVS. - api-reference.html CVS v1.14 - specification.html CVS v1.3 - - 1.2/briareos : 8 March 2000, released at GDC. - api-reference.html CVS v1.13 - specification.html CVS v1.2 - - x.xx/nn : early specifications. - Neither the early working papers by Terry Sikes, Sean L. Palmer - and others nor the first versions of the &OAL; specification - as compiled at Loki were archived and versioned in a coherent way. \ No newline at end of file diff --git a/neo/openal/docs/Makefile b/neo/openal/docs/Makefile deleted file mode 100644 index ce5932b9..00000000 --- a/neo/openal/docs/Makefile +++ /dev/null @@ -1,148 +0,0 @@ -## ------------------------------------------------ -## Makefile for openal/docs/ - - -## DocBook stuff -DB2PS = db2ps -DB2PDF = db2pdf -DB2HTML = db2html - -## TexInfo stuff -MAKEINFO = makeinfo - - - -## Targets -OALSPEC = oalspecs -DB_OBJS = $(OALSPEC).ps $(OALSPEC)/index.html - -TEXI_OBJS = openal.info - -.SUFFIXES: .texi .info - -## Rules -%.ps : %.sgml - $(DB2PS) $< - -%/index.html : %.sgml - $(DB2HTML) $< - - -## Fixme - config.h -%.info : %.texi ../config.h - $(MAKEINFO) $< - - - -## ---------------- -## Standard targets -default: all - -all: render - -render: $(DB_OBJS) - -texi: $(TEXI_OBJS) - - -## -------------- -## Cronjob target -update: specs annotated full - - -## ---------------------------------------------------------- -## Specification - prototypes, tokens, explanation -## -specs-ps: - -rm -f $(OALSPEC)-specs.ps - cp ent-marks-specification.sgml ent-marks.sgml - $(DB2PS) $(OALSPEC).sgml - mv $(OALSPEC).ps $(OALSPEC)-specs.ps - zip -9 $(OALSPEC)-specs.ps.zip $(OALSPEC)-specs.ps - -specs-html: - -rm -rf $(OALSPEC)-specs/ - cp ent-marks-specification.sgml ent-marks.sgml - $(DB2HTML) $(OALSPEC).sgml - mv $(OALSPEC) $(OALSPEC)-specs - -rm $(OALSPEC)-specs.html.zip - zip -r9 $(OALSPEC)-specs.html.zip $(OALSPEC)-specs/ - -specs: specs-ps specs-html - - -## ----------------------------------------------------------- -## Annotated Version - including annotation seections -## (not Programmer's Guide, no examples) -annotated-ps: - -rm -f $(OALSPEC)-annote.ps - cp ent-marks-annotated.sgml ent-marks.sgml - $(DB2PS) $(OALSPEC).sgml - mv $(OALSPEC).ps $(OALSPEC)-annote.ps - zip -9 $(OALSPEC)-annote.ps.zip $(OALSPEC)-annote.ps - -annotated-html: - -rm -rf $(OALSPEC)-annote/ - cp ent-marks-annotated.sgml ent-marks.sgml - $(DB2HTML) $(OALSPEC).sgml - mv $(OALSPEC) $(OALSPEC)-annote - -rm $(OALSPEC)-annote.html.zip - zip -r9 $(OALSPEC)-annote.html.zip $(OALSPEC)-annote/ - -annotated: annotated-ps annotated-html - -## ---------------------------------------------------------- -## FULL Version - include's the RFC's and everything else -## -full-ps: - -rm -f $(OALSPEC)-full.ps - cp ent-marks-full.sgml ent-marks.sgml - $(DB2PS) $(OALSPEC).sgml - mv $(OALSPEC).ps $(OALSPEC)-full.ps - zip -9 $(OALSPEC)-full.ps.zip $(OALSPEC)-full.ps - -full-html: - -rm -rf $(OALSPEC)-full/ - cp ent-marks-full.sgml ent-marks.sgml - $(DB2HTML) $(OALSPEC).sgml - mv $(OALSPEC) $(OALSPEC)-full - -rm $(OALSPEC)-full.html.zip - zip -r9 $(OALSPEC)-full.html.zip $(OALSPEC)-full/ - -full: full-ps full-html - - -## ---------------------------------------------------------- -## ZIP - create archive -## - - - -clean: db_clean texi_clean - -db_clean: - -rm -f $(OALSPEC).dvi - -rm -f $(OALSPEC).aux - -rm -f $(OALSPEC).log - -rm -f $(OALSPEC).tex - -rm -rf $(OALSPEC).junk - -rm -f \#*\# - -rm -f *~ - -texi_clean: - @echo "Not done." - -install: - @echo "Not done." - -distclean: clean - -rm -rf \ - $(OALSPEC)-full/ \ - $(OALSPEC)-full.ps \ - $(OALSPEC)-annote/ \ - $(OALSPEC)-annote.ps \ - $(OALSPEC)-specs/ \ - $(OALSPEC)-specs.ps \ - *.zip - - diff --git a/neo/openal/docs/alc-context.sgml b/neo/openal/docs/alc-context.sgml deleted file mode 100644 index 3b0ae0f4..00000000 --- a/neo/openal/docs/alc-context.sgml +++ /dev/null @@ -1,846 +0,0 @@ - - - - AL Contexts and the ALC API - - This section of the AL specification describes ALC, the AL Context API. - ALC is a portable API for managing &AL; contexts, including - resource sharing, locking, and unlocking. Within the core AL API the - existence of a Context is implied, but the Context is not exposed. The - Context encapsulates the state of a given intance of the AL state machine. - - - To avoid confusion with the AL related prefixes implied throughout - this document, the "alc" and "ALC_" prefixes have been made explicit - in the ALC related sections. - - - ALC defines the following objects: Contexts. - - - - Annotation (ALC entry points) - While the actual ALC implemention might be supplied - as a separate library, or as part of a server or - daemon, the specification requires that the AL library - provides the actual ALC entry points. - - ]]> - - Annotation (ALC OS independend) - ALC is meant to be OS-independent. OS specifics are - expected to be adressed by defining proper device - specifiers strings, and configuration attributes. - In this, ALC differs from GLX/WGL, which (due to the - tighter coupling with the window manager and - operating system) attempt to abstract OS specifics - to a much lesser degree. - - ]]> - - - RFC/ Issues - Hardware init/deinit, mapping many processes with - multiple contexts to many devices, sharing resources - among processes. - - ]]> - - - - Managing Devices - - ALC introduces the notion of a Device. A Device can be, - depending on the implementation, a hardware device, or - a daemon/OS service/actual server. This mechanism also - permits different drivers (and hardware) to coexist - within the same system, as well as allowing several - applications to share system resources for audio, including - a single hardware output device. The details are left - to the implementation, which has to map the available - backends to uniq7ue device specifiers (represented as - strings). - - - - Annotation (Network transparency) - &AL; is meant for interoperability with &OGL;. Some - implementations of &OGL; bindings (e.g. GLX) are network - transparent. The Device API theoretically allows for - a network transparent AL implementation. No wire protocol - is specified, no specification or implementation is planned. - - ]]> - - Annotation (Device Enumeration) - At this time, ALC does not provide mechanism to query - for available devices, and request device enumerations. - This might be added at a later time, depending on demand - and the ability to abstract OS and configuration specifics. - - ]]> - - Annotation (X11 Audio) - The ALC API intentionally mimicks XOpenDisplay - and XCloseDisplay. There is no X Audio standard, - although proposals have been made in the past. - The ALC API design accounts for this possibility - in a minimal way. - - ]]> - - - Connecting to a Device - - The alcOpenDevice function allows the application (i.e. the - client program) to connect to a device (i.e. the server). - - &device; * alcOpenDevice - const &ubyte;* deviceSpecifier - - If the function returns NULL, then no sound driver/device has - been found. The argument is a null terminated string that requests - a certain device or device configuration. If NULL is specified, - the implementation will provide an implementation specific default. - - Annotation (Operating system dependencies) - At this point, system specific configuration, and operating system - specific details, are handled by leaving the details of the - string specifier to the implementation. The application coder - has to determine how he wants to obtain this information from the - OS or the user. If, at a later point, device enumeration and - configuration requests are supported through ALC, the resulting - string might still be operating system and implementation specific. - - ]]> - - - - Disconnecting from a Device - - The alcCloseDevice function allows the application (i.e. the - client program) to disconnect from a device (i.e. the server). - - &void; alcCloseDevice - &device; * deviceHandle - - If deviceHandle is NULL or invalid, an ALC_INVALID_DEVICE error - will be generated. Once closed, a deviceHandle is invalid. - - - - - - - - - Managing Rendering Contexts - - All operations of the AL core API affect a current AL context. - Within the scope of AL, the ALC is implied - it is not visible as - a handle or function parameter. Only one AL Context per INprocess - can be current at a time. Applications maintaining multiple - AL Contexts, whether threaded or not, have to set the current - context accordingly. Applications can have multiple threads - that share one more or contexts. In other words, AL and ALC are - threadsafe. - - - The default AL Context interoperates with a hardware device driver. - The application manages hardware and driver resources by - communicating through the ALC API, and configures and uses - such Contexts by issuing AL API calls. A default AL Context - processes AL calls and sound data to generate sound output. - Such a Context is called a Rendering Context. There might - be non-rendering contexts in the future. - - - The word "rendering" was chosen intentionally to emphasize the - primary objective of the AL API - spatialized sound - and the - underlying concept of AL as a sound synthesis pipeline that - simulates sound propagation by specifying spatial arrangements - of listeners, filters, and sources. If used in describing an - application that uses both &OGL; and &AL;, "sound rendering - context" and "graphics rendering context" should be used for - clarity. Throughout this document, "rendering" is used - to describe spatialized audio synthesis (avoiding ambiguous - words like "processing", as well as proprietary and restrictive - terms like "wavetracing"). - - - - - Context Attributes - - The application can choose to specify certain attributes for - a context. Attributes not specified explicitely are set to - implementation dependend defaults. - - - - Context Attributes - - - - - - Name - Description - - - - - ALC_FREQUENCY - Frequency for mixing output buffer, in units of Hz. - - - ALC_REFRESH - Refresh intervalls, in units of Hz. - - - ALC_SYNC - Flag, indicating a synchronous context. - - - -
-
- - Annotation (Refresh Control) - Applications might have a fixed, or bounded, schedule for - state changes (e.g. synchronously with the GL framerate). - In this case it is desirable to specify the mixahead - interval (milliseconds), or refresh rate (Hz), for the - mixing thread. This is especially important for a synchronous - context, where the application has to specify the refresh - interval it intends to keep. - - ]]> - - - RFC / Mixing Buffer Configuration - ALC_RESOLUTION was originally used to specify the accuracy of the - mixing output buffer. For the time being this is not supported, but - could be added if mixing path and result accuracy control is desirable - to scale resource requirements. - A full ALC_FORMAT (including channel and other attributes) does not - make sense for rendering contexts, but will be necessary for PBuffers - (mix to memory). - - ]]> - - RFC / LOKI extensions - - - ALC_SOURCES_HINT_LOKI, /* # of sources to pre-allocate */ - ALC_BUFFERS_HINT_LOKI, /* # of buffers to pre-allocate */ - - ALC_CD_LOKI, /* demand CD/DVD control */ - - - - ]]> -
- - - - Creating a Context - - A context is created using alcCreateContext. The device parameter - has to be a valid device. The attribute list can be NULL, - or a zero terminated list of integer pairs composed of valid - ALC attribute tokens and requested values. - - &context; * alcCreateContext - const &device; * deviceHandle - ∫ * attrList - - Context creation will fail - if the application requests attributes that, by themselves, - can not be provided. Context creation will fail if the - combination of specified attributes can not be provided. - Context creation will fail if a specified attribute, or - the combination of attributes, does not match the default - values for unspecified attributes. - - - - - Selecting a Context for Operation - - To make a Context current with respect to AL Operation (state - changes by issueing commands), alcMakeContextCurrent is used. - The context parameter can be NULL or a valid context pointer. - The operation will apply to the device that the context was - created for. - - &bool; alcMakeContextCurrent - &context; * context - - For each OS process (usually this means for each application), only - one context can be current at any given time. All AL commands apply - to the current context. Commands that affect objects shared among - contexts (e.g. buffers) have side effects on other contexts. - - Annotation (No Explicit Device) - An ALC context is bound to the device it was created for. - The context carries this information, thus removing the - need to specify the device explicitely. Contexts can not - be made current for any other device aside from the one - they were created for. - - ]]> - - Annotation (No Multiple Current) - There is only one current context per process, even - in multithreaded applications, even if multiple - devices are used. - - ]]> - - - Annotation (Current NULL) - The implementation is encouraged to exploit optimizations - possible if the application sets the current context - to NULL, indicating that no state changes are intended - for the time being. The application should not set the - current context to NULL if more state changes are - pending on the most recent, or another context created - for the same device. - - ]]> - - Annotation (Shared Objects) - Buffers are shared among contexts. As mutiple contexts - can exist at the same time, the state of shared objects - is also shared among contexts. - - ]]> - - RFC / Buffer Deletion - Buffers that have not yet been processed in another context - can not be deleted from any other context. - - ]]> - - - - Initiate Context Processing - - The current context is the only context accessible to state - changes by AL commands (aside from state changes affecting - shared objects). However, multiple contexts can be processed - at the same time. To indicate that a context should be - processed (i.e. that internal execution state like offset - increments are supposed to be performed), the application - has to use alcProcessContext. - - &void; alcProcessContext - &context; * context - - Repeated calls to alcProcessContext are legal, and do not - affect a context that is already marked as processing. The - default state of a context created by alcCreateContext is - that it is not marked as processing. - - - Annotation (Sync and async implementations) - Unfortunately, the exact semantics of alcProcessContext is - not independend of the implementation. Ideally it should be completely - transparent to the application whether the sound driver is threaded or - synced. Unfortunately a synced context has to have its execution - initiated by the application, which requires calls of - alcProcessContext timed in accordance to the drivers mixahead, - or the rendering buffer will underflow. For a threaded driver, - the implementation is free to consider alcProcessContext - a NOP once the context has been marked as processing. - - One consequence is that an application that was developed - using a threaded implementation of AL might not work - properly with a synchronous implementation of AL (on - the other hand, an AL application that works using a - synchronous implementation is guaranteed to work with - a threaded implementation. - - Enforcing alcProcessContext calls would defeat the purpose - of a threaded implementation. Permitting the AL implementation - to e.g. schedule optimizations based on alcProcessContext - calls would similarly obfuscate the exact semantincs. - Consequently, the application coder has to accept this - implementation dependency, and has to rely on the ALC_SYNC - attribute to explicitely request a synchronous implementation. - The implementation can expect the application to be aware - of the additonal constraints imposed on alcProcessContext in - this case. - - ]]> - - Annotation (Multiple Contexts and SYNC refresh) - The application can request SYNC contexts or threaded contexts, - however, the implementation is not obliged to provide both, or provide - a mixture of both on the same device. - - ]]> - - - RFC/ Implications for Networking - What does alcProcessContext imply for networking? - For AL, will we add alFlush/alFinish? - - ]]> - - - - Suspend Context Processing - - The application can suspend any context from processing - (including the current one). To indicate that a context should be - suspended from processing (i.e. that internal execution state like - offset increments is not supposed to be changed), the application - has to use alcSuspendContext. - - &void; alcSuspendContext - &context; * context - - Repeated calls to alcSuspendContext are legal, and do not - affect a context that is already marked as suspended. The - default state of a context created by alcCreateContext is - that it is marked as suspended. - - - Annotation (Sync and async implementations) - Unfortunately, the exact semantics of alcSuspendContext is - also not independend of the implementation. For a threaded - implementation, alcSuspendContext is necessary to ensure a context - is not processed. For a synchronous implementation, omitting - alcProcessContext calls will ultimately have the same effect, - but will also generate rendering buffer underflow errors. - Again, the application coder that requests a synchronous - context using ALC_SYNC has to make sure that alcSuspendContext - is used accordingly. - - ]]> - - Annotation (Suspending vs. Muting a context) - By setting Listener GAIN to zero, an application can mute a - context, and expect the implementation to bypass all rendering. - However, the context is still processing, and the internal - execution state is still updated accordingly. Suspending a - context, whether muted or not, will incidentally suspend rendering - as well. However, it is the application's responsibility to - prevent artifacts (e.g. by proper GAIN control to fade in and - out). It is recommended to mute a context before suspending. - - ]]> - - Annotation (Current Context Suspended) - It is possible to make a suspended context current, or - suspend the current context. In this case, the implementation - is still obliged to immediately verify AL commands as they - are issued, and generate errors accordingly. The implementation - is permitted to postpone propagating the actual state changes - until the context is marked for processing again, with the - exception of dereferencing data (e.g. buffer contents). - For efficiency reasons (memory usage), most if not all - AL commands applied to a suspended context will usually - be applied immediately. State changes will have to be applied - in the sequence they were requested. It is possible to - use suspension of a current context as an explicit locking - (to enforce apparent synchronicity), but execution is still - guaranteed to be in sequence, and the implementation is not - expected to optimize this operation. A typical use would - be setting up the initial configuration while loading a - scene. - - ]]> - - Annotation (Release of Hardware Resources) - The specification does not guarantee that the implementation - will release hardware resources used by a suspended context. - This might well depend on the details of the hardware and driver. - Neither a muted context nor a suspended context can be expected - to free device resources. If all contexts for a given device - are suspended, and no context of this device is current, the - implementation is expected to release all hardware resources if possible. - - ]]> - - - - - - - Destroying a Context - - - &void; alcDestroyContext - &context; * context - - The correct way to destroy a context is to first release it using - alcMakeCurrent and NULL. Applications should not attempt to destroy - a current context. - - -
- - - - - ALC Queries - - - Query for Current Context - - The application can query for, and obtain an handle to, the current - context for the application. If there is no current context, NULL is - returned. - - &context; * alcGetCurrentContext - - - - - - - Query for a Context's Device - - The application can query for, and obtain an handle to, the device - of a given context. - - &device; * alcGetContextsDevice - &context; * context - - - - - - - Query For Extensions - - To verify that a given extension is available for the current - context and the device it is associated with, use - - - &bool;IsExtensionPresent - const &device; * deviceHandle - const &ubyte; * extName - - - A NULL name argument returns FALSE, as do invalid and unsupported string - tokens. A NULL deviceHandle will result in an INVALID_DEVICE error. - Annotation (Exlicit Device Parameter) - Certain ALC Extensions might be relevant to context creation - (like additional attributes, or support for unusual multi-context - combinations), thus the application might have to query these - before a context is created. On the other hand, ALC Extensions - are specific to the device. - - ]]> - - - - - Query for Function Entry Addresses - - The application is expected to verify the applicability of - an extension or core function entry point before requesting - it by name, by use of alcIsExtensionPresent. - - &void; * alcGetProcAddress - const &device; * deviceHandle - const &ubyte; * funcName - - Entry points can be device specific, but are not context specific. - Using a NULL device handle does not guarantee that the entry - point is returned, even if available for one of the available - devices. Specifying a NULL name parameter will cause an - ALC_INVALID_VALUE error. - - - - - Retrieving Enumeration Values - - Enumeration/token values are device independend, but tokens - defined for extensions might not be present for a given device. - Using a NULL handle is legal, but only the tokens defined by - the AL core are guaranteed. Availability of extension tokens - dependends on the ALC extension. - - &uint; alcGetEnumValue - const &device; * deviceHandle - const &ubyte; enumName - - Specifying a NULL name parameter will cause an - ALC_INVALID_VALUE error. - - - - - Query for Error Conditions - - ALC uses the same conventions and mechanisms as AL for error - handling. In particular, ALC does not use conventions - derived from X11 (GLX) or Windows (WGL). - The alcGetError function can be used to query ALC errors. - - &enum;alcGetError - &device; * deviceHandle - - Error conditions are specific to the device. - - - - - Error Conditions - - - - - - Name - Description - - - - - ALC_NO_ERROR - The device handle or specifier does name an accessible driver/server. - - - ALC_INVALID_DEVICE - The Context argument does not name a valid context. - - - ALC_INVALID_CONTEXT - The Context argument does not name a valid context. - - - ALC_INVALID_ENUM - A token used is not valid, or not applicable. - - - ALC_INVALID_VALUE - An value (e.g. attribute) is not valid, or not applicable. - - - -
-
- - - Annotation (No UNDERFLOW error) - Applications using synchronous (and, depending on CPU - load, even an asynchronous implementation itself) might - fail to prevent underflow of the rendering output - buffer. No ALC error is generated in these cases, - as it this error condition can not be applied to a - specific command. - - ]]> -
- - - String Query - - The application can obtain certain strings from ALC. - - const &ubyte; * alcGetString - &device; * deviceHandle - &enum; token - - For some tokens, NULL is is a legal value for the deviceHandle. - In other cases, specifying a NULL device will generate an - ALC_INVALID_DEVICE error. - - - - String Query Tokens - - - - - - Name - Description - - - - - ALC_DEFAULT_DEVICE_SPECIFIER - The specifier string for the default device (NULL handle is legal). - - - ALC_DEVICE_SPECIFIER - The specifier string for the device (NULL handle is not legal). - - - ALC_EXTENSIONS - The extensions string for diagnostics and printing. - - - -
-
- - - In addition, printable error message strings are provided for - all valid error tokens, including ALC_NO_ERROR, ALC_INVALID_DEVICE, - ALC_INVALID_CONTEXT, ALC_INVALID_ENUM, ALC_INVALID_VALUE. - -
- - - Integer Query - - The application can query ALC for information using an integer - query function. - - &void; alcGetIntegerv - &device; * deviceHandle - &enum; token - &sizei; size - dest - - For some tokens, NULL is a legal deviceHandle. In other - cases, specifying a NULL device will generate an ALC_INVALID_DEVICE - error. The application - has to specify the size of the destination buffer provided. - A NULL destination or a zero size parameter will cause ALC to ignore - the query. - - - - - Integer Query Tokens - - - - - - Name - Description - - - - - ALC_MAJOR_VERSION - Major version query. - - - ALC_MINOR_VERSION - Minor version query. - - - ALC_ATTRIBUTES_SIZE - The size required for the zero-terminated attributes - list, for the current context. NULL is an invalid - device. NULL (no current context for the - specified device) is legal. - - - ALC_ALL_ATTRIBUTES - Expects a destination of ALC_CURRENT_ATTRIBUTES_SIZE, - and provides the attribute list for the current - context of the specified device. NULL is an invalid - device. NULL (no current context for the - specified device) will return the default attributes - defined by the specified device. - - - -
-
- - Annotation (Backward Compatibility) - Backward compatibility is guaranteed only for minor revisions. - Breaking ABI backwards compatibility will require a issuing - major revision. - - ]]> - - RFC / Version Matching - The ALC version can be different from the AL version. - The ALC major version has to be identical between - application and driver (client and server). - The ALC minor version can differ between client and server, - and the minimum of the two minor version numbers is returned. - - ]]> - - RFC / Device Enumeration - ALC_NUM_DEVICE_SPECIFIERS could be provided as an extension, - but it requires the number of device configurations to be - finite and small, as they are to be represented by strings. - - ]]> - -
-
- - - - - Shared Objects - - For efficiency reasons, certain AL objects are shared across - ALC contexts. At this time, AL buffers are the only shared - objects. - - - RFC/ Sharing Sources? - Mike Kelly from Dynamix describes an application scenario with - multiple camera views of the same scene (implemented using - several viewports on a single, "split screen", context) - in which he needs multiple listeners (one per view) to - preceive the same sources, with the rendering results of - each listener to mixed for a single output device. As an - alternative to permitting multiple listeners within a context, - it might be preferable to introduce a mechanism to explicitely - share certain AL objects among contexts, at a later time. - It is not desirable to share Sources by default, especially - as the more common multi-listener application is expected to - maintain listeners with disjunct sets of sources. - - ]]> - - Shared Buffers - - Buffers are shared among contexts. The processing state of a buffer - is determined by the dependencies imposed by all contexts, not just - the current context. This includes suspended contexts as well as - contexts that are processing. - - - - - -
diff --git a/neo/openal/docs/api-reference.html b/neo/openal/docs/api-reference.html deleted file mode 100644 index 37607702..00000000 --- a/neo/openal/docs/api-reference.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - -OpenAL API Reference - - - -

OpenAL API Reference

-

- This document has been removed. -

- - - diff --git a/neo/openal/docs/app-annotations.sgml b/neo/openal/docs/app-annotations.sgml deleted file mode 100644 index 6eabf4b5..00000000 --- a/neo/openal/docs/app-annotations.sgml +++ /dev/null @@ -1,297 +0,0 @@ - - - Miscellaneous Annotations - -
- Reverberation Objects? - - In a generalization of the I3DL2 Extension for - listener specific reverberation effects, it might - be best to implement Reverb Objects. A Reverb Object - is one example of a parametrized filter. Each - such object encapsulates a set of attributes (the - filter parameters). Sources and Listener alike - have an attribute that allows the application coder - to choose a reverb object for application either - at the origin of the sound, or at the position of - the listener. Initial implementation would only - support one Reverb Object per Context, applied at - the listener position. - - - The I3DL2 Environment is a filter that alters the - way the user experiences the virtual world. As - filters require DSP operations it is limited by hardware - processing capabilities. - - - The I3DL2 Environment models the surroundings of the - listener by simplifying the presumed acoustic properties - of those surroundings into a small set of parameters. - It allows to reproduce the effects of sound reflections - and reverberation caused by walls and obstacles, and - the muffling effects of obstacles inside environments - or partitions between environments. - - - Environment properties: - Early reflections level and delay. - Late reverberation level and delay, low- and high-frequency decay time. - Reverberation diffusion, density and spectrum. - - - Source properties: - Direct path intensity and spectrum. - Reverberation intensity and spectrum. - -
- -
- On Filters - - RFC/bk000502: Filters as the general concept of modifiers? - Environment as a special case filter? - Can we break down EAX environments into ReverbFilters where we - parametrize late reflections, and ReflectFilters, which fake - early reflections? Do we need this separation if we have - calculated or distinct echo effect reflections instead of - stocastic ones? Does it make sense to superimpose a general - reverb kicking in after a delay t, with reflections (random - or not) or should reverb only kick in after reflections are - discarded? - - - RFC/bk000502: old text. - (Environment) Properties: - Geometry - geometry is specified using an immediate mode API which is - similar to OpenGL. Support for scene lists are also provided on a basis - similar to OpenGL's display lists. - Materials - specify the absorptive and reflective qualities of a piece - of geometry. &AL; should provide a facility for accessing preset - materials, and storing and retrieving new materials at runtime. - - - RFC/nn: Atmospheric/ambient properties? - REF/nn: A3D 2.0 IA3dMaterial - - -
- Atmospheric Filter - - The atmospheric filter the effects of media with constant density, - on propagating sound waves. The effect of the atmospheric filter - is distance dependent. Atmospheric effects can be parameterized - by specifying attenuation per unit distance, the scale for the - unit distance, for one of a minimum of two frequency ranges - (low frequency and high frequency roll-off). - - - RFC/bk000502: do we specify the atmospheric filter per-source? - The effect is clearly dominated by the most dense medium, but - we have little chance simulating crossings between different - media this way. Distance attenuation in media clearly depends - on source and listener being embedded in the same medium, - without any obstruction along the LOS. - -
- -
- Listener Reverb - - Listener Reverb is a parameterized filter that modifies the sound at - listener position to emulate effects of the surroundings, namely - effects of late reflections. Without simulating sound propagation - this reverb accounts for the averaged outcome of different arrangements - of reflecting/absorbing surfaces around the listener. - -
- -
- Source Reverb - - There is currently no support for reverb at the source position. - -
- -
- Reflection Filter - - First order reflection (and, if support, O(n) reflection for small n) - can choose to simulate the effects of different materials by - parametrizing reflection filters. - There is currently no support for reflections. - -
- -
- Transmission Filter - - Sound propagation along the LOS can pass through obstructions - specified as convex polygons. The effects of lossy transmission - can be approximated by applying a once-off filtering. Like - atmospheric filters, this can be a frequency-dependent roll-off, - unlike atmospheric filters this does not take distance into - account. Transmission filters can be used to emulate losses - on crossing separating surfaces between different media (water/air - borders). - There is currently no support for transmissions. - -
-
- -
- Parameterization over Time - - Fading and cross-fading. There are three ways to handle any kind - of gain control as a function of time: - - - - manipulate gain per frame/sufficiently often - - - - - parameterize, i.e. specify a target gain, - a duration over which to interpolate, and an interpolation function - - - - - provide an buffer that indicates amplitude, stretched over - a duration/by a frequency - - - The last mechanism also works for early reflections and echos, - and any other temporal filtering. The first and second approach - also work for attributes like Pitch. - -
- - -
- On Geometry - - Both the A3D API and implementation as well as EAX related utilities - like EAGLE seem to indicate that any effort to handle scene geoemtry - at API level will inevitably duplicate modules found in common game - engines for purposes of collision detection, path planning, AI - support, visibility and sound propagation culling. - - - In other words, any such effort will inevitably lead to competing - subsystems and multiple use of processing and memory resources to - implement the same functionality. While it makes sense to provide - templates, examples, and even utilities like EAGLE and SDK's to - developers, it makes no sense to integrate any such functionality - with the API. - - - The geometry based processing inevitably leads to a scene graph - API, with all the resulting problems. On closer examination it - seems that the specification and storage of source and listener - positions is a red herring. - - - Second and higher order reflections seem to be irrelevant. - - - Reflection can be faked by stochastic means, but an actual - presence/immersion effect will require smooth transitions - depending on the continuous change of distance between - sources, listener, and dominant reflectors. - - - Dominant reflectors are presumed to be 1st order, - with material properties that incur little or no loss - (or even provide amplification), and significant - surface area. - - - Transmission loss through dense media is equivalent to - the distance attenuation model. - - - Refraction/reflection loss at border surfaces separating - media.... - - - No explicit geometry to check whether there is any indirect - (1st order reflection, multiple reflections) path between - source and listener - the application is usually better - equipped to handle this (portal states, PHS). The benefit - of forcing the AL implementation to check for obstruction - (object inersecting LOS) is questionable at best - LOS - checking is also better done by the main application. - In essence, the application might even handle the 1st - order reflections IFF we provide the means to generate - early reflection instead of rolling dice, and if we - make it cheap to enable a path between a source and - the listener complete with a material. Come to think of - it: the implementation guarantees n paths with m filters - one of which is transmission or reflection, one is - distance attenuation, one is source reverb, one is - listener reverb.... - -
- -
- No ALU - RFC - ALU, like GLU, is a problem: linkage dependencies, multiple drivers - sharing one ALU etc. It would be best to not clutter the specification - with ALU/ALUT. Any support code/template repository/SDK can be - maintained as a separate open source project. - - - ALU provides operations that do not affect driver or hardware state. - These can be resampling/conversion methods or other sample data - processing, or utilities for (optimized) filter generation. ALU - does not provide I/O operations. At this time, - ALU is not specified and not implemented. - - - RFC/bk000502: GLU is becoming a bit of a problem right now, with - most applications avoiding it as they load GL DLL's explicitely, - but do not trust the ABI specification enough to link against GLU, - and not bothering to load it. A vendor-neutral open source ALU - works for me, but we can not accept link time dependencies to AL. - ALU (like GLU) is meant for minimal convenience, in small - building blocks, it is not meant as an SDK. - - - RFC/bk000502: old text. - ALU is the AL Utility library, and provide functions for performing audio - conversion, preset material properties, and a compatability layer for - legacy stereo format audio. This includes support for panning and per - channel volume control. - - - RFC/nn: Er, what else does the world of 2D sound usually need? - -
- - -
- No ALUT - - Application coders frequently request additional support for sound - handling to the extent of sophisticated SDKs. It is expected that - SDK vendors will provide such products on top of AL. ALUT (in analogy - to GLUT) would constitute an "official" SDK if desired. At this time, - ALUT is not specified and not implemented, and not intended to be part - of &AL; proper. - - - ALUT is a utility toolkit for &AL;. It sits on top of ALC. - It provides convenience functions for accessing files, for playing sounds, - and an API for accessing CDROM functionality. - -
- - - -
\ No newline at end of file diff --git a/neo/openal/docs/app-constants.sgml b/neo/openal/docs/app-constants.sgml deleted file mode 100644 index 8c852e20..00000000 --- a/neo/openal/docs/app-constants.sgml +++ /dev/null @@ -1,43 +0,0 @@ - - - Global Constants - - - Misc. &AL; Global Constants - - - - - - Name - &OAL; datatype - Description - Literal value - - - - - ALenum - FALSE - boolean false - 0 - - - ALenum - TRUE - boolean true - 1 - - - -
-
- - - RFC - NONE, ONE, ZERO needed? - - ]]> -
- diff --git a/neo/openal/docs/app-extensionprocess.sgml b/neo/openal/docs/app-extensionprocess.sgml deleted file mode 100644 index 778c0912..00000000 --- a/neo/openal/docs/app-extensionprocess.sgml +++ /dev/null @@ -1,36 +0,0 @@ - - - Extension Process - - There are two ways to suggest an Extension to AL or ALC. - The simplest way is to write an ASCII text that matches - the following template: - - - - RFC: rfc-iiyymmdd-nn - Name: (indicating the purpose/feature) - Maintainer: (name and spam-secured e-mail) - Date: (last revision) - Revision: (last revision) - - new enums - new functions - - description of operation - - - - Such an RFC can be submitted on the &AL; discussion - list (please use RFC in the Subject line), or send to the - maintainer of the &AL; specification. If you are shipping - an actual implementation as a patch or as part of the - &AL; CVS a formal writeup is recommend. In this case, - the Extension has to be described as part of the - specification, which is maintained in DocBook SGML - (available for UNIX, Linux and Win32). The SGML source of - the specification is available by CVS, and the Appendix - on Extensions can be used as a template. Contact the - maintainer for details. - - diff --git a/neo/openal/docs/app-extensions.sgml b/neo/openal/docs/app-extensions.sgml deleted file mode 100644 index 1f4b3b92..00000000 --- a/neo/openal/docs/app-extensions.sgml +++ /dev/null @@ -1,754 +0,0 @@ - - - Extensions - - Extensions are a way to provide for future expansion of the &AL; API. - Typically, extensions are specified and proposed by a vendor, and - can be treated as vendor neutral if no intellectual property - restrictions apply. Extensions can also be specified as, or - promoted to be, ARB extensions, which is usually the final step - before adding a tried and true extension to the core API. ARB - extensions, once specified, have mandatory presence for - backwards compatibility. The handling of vendors-specific or - multi-vendor extensions is left to the implementation. The IA-SIG - I3DL2 Extension is an example of multi-vender extensions to - the current &AL; core API. - - - - Extension Query - - To use an extension, the application will have to obtain function addresses - and enumeration values. Before an extension can be used, the application will - have to verify - the presence of an extension using IsExtensionPresent(). The application - can then retrieve the address (function pointer) of an extension entry - point using GetProcAddress. Extensions and entry points can be - Context-specific, and the application can not count on an Extension being available - based on the mere return of an entry point. The application also - has to maintain pointers on a per-Context basis. - - - - &bool; IsExtensionPresent - const &ubyte; * extName - - - - Returns TRUE if the given extension is supported for the current - context, FALSE otherwise. - - - Annotation (IsExtensionPresent) - This function is inspired by the GLU addition, but placed in - the core API as we intend to avoid a separate ALU. This function - avoids potential string overflow and string parsing issues (strstr) - raised by GetString( EXTENSIONS ). - - ]]> - - - Annotation/ EXTENSIONS - GetString( EXTENSIONS ) is supported as well, as it allows for - easy archiving and priting of the list of supported extensions. - - ]]> - - - - Retrieving Function Entry Addresses - - - &void;* GetProcAddress - const &ubyte; * funcName - - Returns NULL if no entry point with the name funcName can be found. - Implementations are free to return NULL if an entry point is present, - but not applicable for the current context. However the specification - does not guarantee this behavior. - - - Applications can use GetProcAddress to obtain core API entry points, - not just extensions. This is the recommended way to dynamically load - and unload &AL; DLL's as sound drivers. - - - RFC/bk000504: - Original spec required all addresses are Context independent. - This matches the Linux &OGL; ABI specification, but imposes - additional implementation constraints. For now, the specification - does not guarantee this. - - ]]> - - - - - Retrieving Enumeration Values - - To obtain enumeration values for extensions, the application has - to use GetEnumValue of an extension token. Enumeration values are - defined within the &AL; namespace and allocated according to - specification of the core API and the extensions, thus they are - context-independent. - - &uint; GetEnumValue - const &ubyte; enumName - - Returns 0 if the enumeration can not be found. The presence of an - enum value does not guarantee the applicability of an extension - to the current context. A non-zero return indicates merely that - the implementation is aware of the existence of this extension. - Implementations should not attempt to return 0 to indicate that - the extensions is not supported for the current context. - - - Annotation/ enums with value zero - The literal value 0 is guaranteed for a number of AL - enums, such as FALSE, NONE, ZERO. As with GL applications - might employ sloppy use of this identity. It also means - that enums with zero value can not be queried through - GetEnumValue, a minor flaw given the constraints of - ABI backward compatibility. The recommended value to - compare GetEnumValue results with is NONE. - - ]]> - - - - Naming Conventions - - Extensions are required to use a postfix that separates the - extension namespace from the core API's namespace. - For example, an ARB-approved extension would use - "_ARB" with tokens (ALenum), and "ARB" with commands (function - names). A vendor specific extension uses a vendor-chosen - postfix, e.g. Loki Extensions use "_LOKI" and "LOKI", - respectively. - - - - - ARB Extensions - - There are no ARB Extensions defined yet, as the ARB has - yet to be installed. - - - - - - Other Extension - - For the time being this section - will list externally proposed extensions, namely - the extension based on the IASIG Level 2 guideline. - - - - - - - IA-SIG I3DL2 Extension - - - The IA-SIG I3DL2 guideline defines a set of parameters to control - the reverberation characteristics of the environment the listener - is located in, as well as filtering or muffling effects applied to - individual Sources (useful for simulating the effects of obstacles - and partitions). These features are supported by a vendor neutral - extension to &AL; (TBA). - The - IA-SIG 3D Level 2 rendering guideline - provides related information. - - - RFC: Global Attributes - Do we need global setters for these: - DIRECT_IASIG/DIRECT_HIGH_FREQUENCY_IASIG? - ROOM_IASIG/ROOM_HIGH_FREQUENCY_IASIG? - - ]]> - - - - Listener Environment Attributes - - - - - - ENV_ROOM Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_ROOM_EXT - f - [0.0, 1.0] - 1.0f - - - -
- Description: ??? -
- - - - - ENV_ROOM_HIGH_FREQUENCY Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_ROOM_HIGH_FREQUENCY_EXT - f - [0.0, 1.0] - 0.1f ??? - - - -
- Description: ??? -
- - - - - ENV_DECAY_TIME Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_DECAY_TIME_EXT - f - [0.1, 20.0] - 1.0f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - NV_DECAY_HIGH_FREQUENCY_RATIO Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_DECAY_HIGH_FREQUENCY_RATIO_EXT - f - [0.1, 2.0] - 0.5f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_REFLECTIONS Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_REFLECTIONS_EXT - f - [0.1, 3.0] - 1.0f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_REFLECTIONS_DELAY Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_REFLECTIONS_DELAY_EXT - f - [0.0, 0.3] - 0.02f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_REVERB Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_REVERB_EXT - f - [0.0, 10.0] - 1.0f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_REVERB_DELAY Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_REVERB_DELAY_EXT - f - [0.0, 0.1] - 0.04f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_DIFFUSION Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_DIFFUSION_EXT - f - [0.0, 100.0] - 100.0f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_DENSITY Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_DENSITY_EXT - f - [0.0, 100.0] - 100.0f - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
- - - - - ENV_HIGH_FREQUENCY_REFERENCE Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ENV_HIGH_FREQUENCY_REFERENCE_EXT - f - [20.0, 20000.0] - 5000.0 - - - -
- Description: ??? - What's up with the defaults? Not a normalized range - and a global Scale to set? -
-
- - Source Environment Attributes - - TBA. - - - ]]> -
- - ]]> - - - - - Compatibility Extensions - - The extensions described have at one point been in use for - experimental purposes, proof of concept, or short term needs. - They are preserved for backwards compatibility. Use is not - recommended, avialability not guaranteed. Most of these will - be officially dropped by the time API revision 2.0 is released. - - - - - Loki Buffer InternalFormat Extension - - &AL; currently does not provide a separate processing - chain for multichannel data. To handle stereo samples, - the following alternative entry point to BufferData - has been defined. - - &void; BufferWriteData - &uint; bufferName - &enum; format - &void;* data - &sizei; size - &uint; frequency - &enum; internalFormat - - Valid formats for internalFormat are FORMAT_MONO8, FORMAT_MONO16, - FORMAT_STEREO8, and FORMAT_STEREO16. - - - - - Loki BufferAppendData Extension - - Experimental implementation to append data to an existing - buffer. Obsoleted by Buffer Queueing. TBA. - - Annotation (GenStreamingBuffers): - It is possible that a consistent implementation of this - extension will require distinguishing streaming from - regular buffers at creation time, instead of making - this distinction implied by the use of BufferData vs. - BufferAppendData. - - ]]> - - RFC: alBufferAppendData - Specify data to be filled into a streaming buffer. - This takes the current position at the time of the - call, and returns the number of samples written. - ALsizei ALAPIENTRY alBufferAppendData( ALuint buffer, - ALenum format, - ALvoid* data, - ALsizei size, - ALuint freq ); - - - - - ]]> - - RFC: GenStreamingBuffers - Currently there is a function call on the Linux side, - alGenStreamingBuffers(), which generates a Buffer intended - for streaming. The intent of this function was the provide - a clear creation point for streaming buffers, rather than - the previous behaviour of a Buffer "magically" becoming - streaming Buffer the first time BufferAppendData() was - called on it. However, it's hard to believe this anomaly - in the API can be any better. What about - DelStreamingBuffers()? IsStreamingBuffer()? - - The design problem here is that we handle qualitatively different - objects using the same API. Streaming and non-streaming buffers - are fundamentally different. If we create an API that makes it - easy to mistake one for the other, or worse, if we decide to - quietly convert one type of object into another in some cases, - we create a plethora of error cases for the implementation and - the app coder to catch. Separating the Factory methods for the - objects allows us to omit an specialization API that will - accidentally be called more than once, and saves us handling - different stages of "initialization state". AL should not have - any notion of "partially initialized" or "incomplete" objects: - misery and despair lie down that road. If necessary the entire - API should be duplicated (after all, nobody handles 1D, 2D, and - 3D textures using the same GL API hooks), but as the AL - implementation has the ability to distinguish streaming and - non-streamin buffers internally there might not be a need. - Unless a concrete alternative is proposed to resolve the "anomaly" - it will be the preferred method to avoid an API that is - leaner at the expense of being more error-prone. - - ]]> - - - - - - - Loki Decoding Callback Extension - - Experimental implementation to allow the application to - specify a decoding callback for compression formats - and codecs not supported by &AL;. This is supposed to - be used if full uncompression by the application is prohibited - by memory footprint, but streaming (by queueing) is not - desired as the compressed data can be kept in memory - in its entirety. - - - If mixing can be done from the compressed data directly, - several sources can use the sample without having to - be synchronized. For compression formats not supported - by AL, however, partial decompression has to be done by - the application. This extension allows for the implementation - to "pull" data, using apllication provided decompression - code. - - - The use of this callback by the &AL; - implementation makes sense only if late decompression - (incremerntal, on demand, as needed for mixing) is done, - as full early compression (ahead-of-time) inside the - implementation would exact a similar memory footprint. - - - TBA. - - - This extension forces execution of third party code - during (possibly threaded) driver operation, and - might also require state management with global - variables for decoder state, which raises issues - of thread safety and use for multiple buffers. This - extension should be obsolete as soon as &AL; - supports a reasonable set of state of the art - compression and encoding schemes. - - - - - - - - Loki Infinite Loop Extension - - To support infinite looping, a boolean LOOP was introduced. - With the introduction of buffer queueing and the request for - support for a limited number of repetitions, this mechanism - was redundant. This extension is not supported for - buffer queue operations, attempts to use it will cause - an ILLEGAL_OPERATION error. For backwards compatibility - it is supported as the equivalent to - - Source( sName, PLAY_COUNT, MAX_INTEGER ) - - For the query LOOP==TRUE, the comparison - PLAY_COUNT!=MAX_INTEGER has to be executed on - the queue, not the current value which is decremented - for a PLAYING Source. - - Source LOOP_LOKI Attribute - - - - - - - - - &Par; - &Sig; - &Val - &Def; - - - - - LOOP_LOKI - b - &TRUE; &FALSE; - &FALSE; - - - -
- Description: - &TRUE; indicates that the Source will perform an inifinite - loop over the content of the current Buffer it refers to. -
-
- - - - - Loki Byte Offset Extension - - The following has been obsoleted by explicit Source State query. - hack. - - - - - Buffer BYTE Offset attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - BYTE_LOKI - ui - n/a - n/a - - - -
- Current byte for the buffer bound to the source interpreted - as an offset from the beginning of the buffer. -
- -
- - ]]> - - - - Loop Point Extension - - - In external file now. - - - - ]]> - -
- diff --git a/neo/openal/docs/architecture.html b/neo/openal/docs/architecture.html deleted file mode 100644 index 78d985bb..00000000 --- a/neo/openal/docs/architecture.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - OpenAL Architecture - - - -

OpenAL Architecture

-

- This document has been removed. - See Index - for the specification. -

- - - diff --git a/neo/openal/docs/chp-buffers.sgml b/neo/openal/docs/chp-buffers.sgml deleted file mode 100644 index 5a7cdff8..00000000 --- a/neo/openal/docs/chp-buffers.sgml +++ /dev/null @@ -1,691 +0,0 @@ - - - - Buffers - - A Buffer encapsulates &AL; state related to storing sample data. The - application can request and - release Buffer objects, and fill them with data. Data can be supplied - compressed and encoded as long as the format is supported. - Buffers can, internally, contain waveform data as uncompressed or - compressed samples. - - - Unlike Sources and Listener, Buffer Objects can be shared among AL contexts. - Buffers are referenced by Sources. - A single Buffer can be referred to by multiple Sources. This separation allows - drivers and hardware to optimize storage and processing where applicable. - - - The simplest supported format for buffer data is PCM. - - - - - Annotation/ Compressed Buffers - Compressed formats are in no way guaranteed by the implementation - to remain compressed. The driver might have to uncompres in memory - at once, if no hardware-assisted or incremental decoding is possible. - In many cases an implementation has to decompress the buffer, - converting the uncompressed data to a canonical internal format, - and resample it into the format native to the current context. - - ]]> - - RFC: Compressed Buffers - MikeV suggests: an application can query the amount of memory buffer - is consuming. He suggests using GetBufferi(AL_SIZE, ... ). This seems - a bad idea as (a) the application is not meant to micromanage - driver-internal memory, (b) the memory requirements known to the - application might differ from the actual, (c) there are OS - mechanisms to query free memory, (d) AL_SIZE is now ambiguous as - it announces app-side memory as allocated vs. driver side memory - as used by the driver. For clarity AL_INTERNAL_SIZE (analog to - internal format enums) might be a better choice. - - ]]> - - - Buffers can be non-streaming (default) or streaming. Non-streaming - buffers are used to store looping and non-looping (single-shot) sound - data. Streaming buffers have to be used to cache streaming - media that the application can not keep in memory for technical - reasons: e.g. data delivered in real time over network. Streaming buffers - can also be used to partially store sound samples that the application - coder consider too large to keep in memory at once. - - ]]> - - - - - - Buffer States - - At this time, Buffer states are defined for purposes of discussion. - The states described in this section are not exposed through the API - (can not be queried, or be set directly), and the state description - used in the implementation might differ from this. - - - A Buffer is considered to be in one of the following States, with respect - to all Sources: - - - - UNUSED: the Buffer is not included in any queue - for any Source. In particular, the - Buffer is neither pending nor current - for any Source. The Buffer name can be - deleted at this time. - - - - - - PROCESSED: the Buffer is listed in the queue of - at least one Source, but is neither pending - nor current for any Source. The Buffer can - be deleted as soon as it has been unqueued - for all Sources it is queued with. - - - - - PENDING: there is at least one Source for which the - Buffer has been queued, for which the Buffer - data has not yet been dereferenced. The Buffer - can only be unqueued for those Sources that - have dereferenced the data in the Buffer - in its entirety, and cannot be deleted or - changed. - - - - The Buffer state is dependent on the state of all Sources - that is has been queued for. - A single queue occurrence of a Buffer propagates the - Buffer state (over all Sources) from UNUSED to PROCESSED - or higher. Sources that are STOPPED or INITIAL still have - queue entries that cause Buffers to be PROCESSED. - - - A single queue entry - with a single Source for which the Buffer is not yet - PROCESSED propagates the buffer's queueing state to - PENDING. - - - Buffers that are PROCESSED for a given Source can be - unqueued from that Source's queue. Buffers that have - been unqueued from all Sources are UNUSED. - Buffers that are UNUSED can be deleted, or changed by - BufferData commands. - - - Annotation (No CURRENT State) - For buffer queueing, it is not relevant whether - the Buffer data is currently dereferenced by any - Source or not. It is therefore not necessary to - distinguish a CURRENT state (being referenced as - current buffer by a single PLAYING or PAUSED Source). - - ]]> - - Annotation (State Query and Shared Buffers) - A buffer that is unused by one Source might be used - by another. The Unqueue operation is determined by - the number of queue entries already processed by the - given Source. - However, the application has to check whether the - Buffer is still in use by other Sources. For now, - applications have to maintain their own lists of - buffer consumer (source) lists. If necessary, an - explicit call to determine current buffer state - with respect to all Sources might be added in - future revisions. - - ]]> - RFC: IsBufferProcessed? - Instead of exposing the internal state, a simple boolean query - whether a buffer can be deleted or refilled can be used. - - ]]> - - RFC: BufferData on QUEUED - The error on using BufferData in QUEUED buffers is introduced - because the implementation might not be able to guarantee when - the Buffer is dereferenced. Applications have to account for the - possibility that the Buffer is dereferenced at the latest possible - moment, e.g. when it becomes CURRENT. As it is easier to relax - this restricition at a later time (no effect on backwards - compatibility) than doing the reverse, we are conserative here. - - ]]> - - RFC: Buffer State Query - Buffer State could be queried using alBuffer(), but it can't be - set. Prohibiting deferred deletion of buffers would make such a - state query desirable. - - ]]> - - - - - Managing Buffer Names - - &AL; provides calls to obtain Buffer names, to request - deletion of a Buffer object associated with a valid Buffer name, - and to validate a Buffer name. Calls to control Buffer attributes - are also provided. - - - - Requesting Buffers Names - - The application requests a number of Buffers using GenBuffers. - - void GenBuffers - &sizei; n - &uint;* bufferNames - - - - RFC: Buffer Name 0 - NONE or 0 is a reserved buffer name. What properties does - this buffer have? Does it have content? If there is no content, - what is its duration? 0? 1 microsecond? Should we use this buffer - to schedule a limited duration "silence"? - - ]]> - - - - Releasing Buffer Names - - The application requests deletion of a number of Buffers - by calling DeleteBuffers. - - - Once deleted, Names are no longer valid for use with AL - function calls. Any such use will cause an INVALID_NAME - error. The implementation is free to defer actual - release of resources. - - &void; DeleteBuffers - &sizei; n - &uint;* bufferNames - - IsBuffer(bname) can be used to verify deletion of a buffer. - Deleting bufferName 0 is a legal NOP in both scalar and - vector forms of the command. The same is true for unused - buffer names, e.g. such as not allocated yet, or as - released already. - - - RFC: Force Deletion - If a buffer name is deleted, we could replace all occurences - in queues with bname 0. This is the GL behavior for deleting - the texture currently bound. - - ]]> - RFC: Relasing used Buffers - If a Buffer is USED or QUEUED, it cannot be deleted, and the operation - should fail. We have three possible responses: throw an error, deferr - deletion, or force deletion by replacing every use - of the buffer in question with bname zero. - Throwing an error requires that we lock, verify that all specified - buffers can be deleted, then perform deletion, then unlock. If there - is one buffer that can not be deleted we have to throw an error and - make the entire operation a NOP. - Deferred deletion has its own set of problems (see other RFC). - Forcing deletion makes the mistake obvious to the application - for current buffers (sound artifacts) but still doesn't expose - errors for queued buffers. It also requires complete consumer - book-keeping for each buffer. GL uses this approach for textures - at little expense because it only has one current texture. - - ]]> - - RFC: Deferred Buffer Release - Buffer deletion could be performed as a deferred operation. - In this case actual deletion would be deferred until a Buffer is - unused, i.e. not QUEUED or CURRENT anymore. The specification - would not guarantee that they are deleted as soon as possible. - - However, such a deferred execution would be muddying the borders - between immediate and deferred execution in general (as we - might want to add scheduling and deferred commands at a later time). - Introduced as the default it makes impossible for the application - to force deletion or errors. Errors caused by improper use of - &AL; will be triggered at some distance from the original mistaken - command. Debugging such conditions is usually expensive. This approach - also does not take into account sharing of buffers among contexts. - - It might be possible to introduce this behavior as a Hint() - in case that it is not desirable to explicitely introduce - deferred commands. - - ]]> - - RFC: sourceName 0 - Is there a useful application for this? Do we mark that this - is reserved? - - ]]> - - - - Validating a Buffer Name - - The application can verify whether a buffer Name is valid - using the IsBuffer query. - - &bool; IsBuffer - &uint; bufferName - - - - - - - - Manipulating Buffer Attributes - - - Buffer Attributes - - This section lists the attributes that can be set, or - queried, per Buffer. Note that some of these attributes - can not be set using the Buffer commands, but are set - using commands like BufferData. - - - Querying the attributes of a Buffer with a buffer name that - is not valid throws an INVALID_OPERATION. Passing in an - attribute name that is invalid throws an INVALID_VALUE error. - - - - - Buffer FREQUENCY Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - FREQUENCY - float - none - (0, any] - - - -
- Description: Frequency, specified in samples per second, - i.e. units of Hertz [Hz]. - Query by GetBuffer. The frequency state of a buffer is set by - BufferData calls. -
- - Annotation (No Frequency enumeration) - As the implementation has to support conversion from - one frequency to another to implement pitch, it is - feasible to offer support for arbitrary sample - frequencies, instead of restricting the application - to an enumeration of supported sample frequencies. - Another reason not to limit frequency to an enumerated - set is that future hardware might support variable - frequencies as well (it might be preferable to choose - the sampling frequency according to the PSD of the - signal then). - - However, it is desirable to avoid conversions due - to differences between the sample frequency used in - the original data, the frequency supported during the - mixing, and the frequency expected by the output device. - - ]]> - - - Annotation (Implied Frequency) - To account for the possibility of future AL implementations - supporting encoding formats for the application might - not want, or be able, to retrieve the actual frequency - from the encoded sample, the specification will be - amended to guarantee the following behavior: If a nonzero - frequency is specified, it will force a conversion from - the actual to the requested frequency. If the application - specifies a 0 frequency, AL will use the actual frequency. - If there is no frequency information implied by the format - or contained in the encoded data, specifying a 0 frequency - will yield INVALID_VALUE. It is recommended that applications - use NONE instead of the literal value. - - ]]> - - RFC: BITS not needed - This is not a setter. As a state query it doesn't provide useful - information about the internal canonical format (which could be - queried independent of the buffer). - - - - Buffer BITS Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - BITS - ui - 8,16 - 0 - - - -
- Description: - Bits per sample. This is a query-only attribute. The - default value for an (empty) buffer is zero. -
- ]]> - - - Annotation (No Format query) - As of this time there is no query for FORMAT, or format - related state information. Query of the channels or - bits of a given buffer make little sense if the query - the internal (canonical, not buffer specific) format. - Query of the original sample data format makes little - sense unless the implementation is obliged to preserve - the original data. - - ]]> - - RFC: CHANNELS needed? - No setter. Does this indicate the channels in the original data, - or those in the (canonical) format internally used? Redundant to - querying the buffer type. Should be enums as speaker configurations - might have to be destribed by two integers: 5.1. - - - - Buffer CHANNELS Attribute - - - - &Par; - &Sig; - &Val; - &Def; - - - - - CHANNELS - ui - RFC: enums or N/A? - 0 - - - -
- Description: Channels that buffer stores. Query only - attribute. This is almost - always 1, as applications using spatialized sound always - downsample to mono. This depends on the purpose of the - buffer: buffers used for spatialization have to provide - single-channel data. The default value for an (empty) - buffer is zero. -
- ]]> - - - - Buffer SIZE Attribute - - - - &Par; - &Sig; - &Val; - &Def; - - - - - SIZE - &sizei; - [0, MAX_UINT] - 0 - - - -
- Description: Size in bytes of the buffer data. Query through - GetBuffer, can be set only using BufferData calls. - Setting a SIZE of 0 is a legal NOP. The number of bytes does - not necessarily equal the number of samples (e.g. for compressed data). -
- - - RFC: buffer overflow/underflow - If a SIZE is specified for a buffer and an attempt is made to - write less or more data to the buffer, is this an error? Do we - have SubData updates? Is trying to write data to a zero size buffer - an error? Which error? - - ]]> - - RFC: query for samples/duration? - Do we need a query for samples (which does not equal memory size)? - Do we prefer a duration query? As integral, for precision? Which, - combined with frequency, has to guarantee accurate sample number? - - ]]> - - - RFC: memory budgeting - SIZE comment said: Useful for memory budgeting with compressed data. - Sounds bogus: the application can only announce how many bytes - of data it intends to provide, it might not be able to estimate - the uncompressed, decoded size in the internal format chosen by - the implementation w/o decompressing, decoding, and querying for - the internal format. Micromanaging memory is usually a bad idea. - Using SIZE to configure a buffer might ge a mistake. Using the - same enum to query the actual size internally (which might - consists of two or more buffer areas and cached decoding state) - will be confusing. - - ]]> - - RFC: buffer initial state - MikeV added: - "The default attribute values for a Buffer are nonsensical insofar - as a Buffer is incomplete without data having been - specified." - This seems wrong. An AL object will always be complete and valid, - albeit useless. A Buffer in its default state might not produce - any useful outout, but it can be specified and used. - - ]]> -
- - - - Querying Buffer Attributes - - Buffer state is maintained inside the &AL; implementation and can be - queried in full. The valid values for paramName are identical to the - ones for Buffer*. - - void GetBuffer{n}{sifd}{v} - &uint; bufferName - &enum; paramName - &type;* values - - - - - - Specifying Buffer Content - - A special case of Buffer state is the actual sound sample data stored - in asociation with the Buffer. Applications can specify sample data using - BufferData. - - &void; BufferData - &uint; bufferName - &enum; format - &void;* data - &sizei; size - &sizei; frequency - - The data specified is copied to an internal software, or if possible, - hardware buffer. The implementation is free to apply decompression, - conversion, resampling, and filtering as needed. The internal format - of the Buffer is not exposed to the application, and not - accessible. Valid formats are FORMAT_MONO8, FORMAT_MONO16, - FORMAT_STEREO8, and FORMAT_STEREO16. An implementation may - expose other formats, see the chapter on Extensions for - information on determining if additional formats are supported. - - - - Applications should always check for an error condition after attempting - to specify buffer data in case an implementation has to generate an - OUT_OF_MEMORY or conversion related INVALID_VALUE error. The application - is free to reuse the memory specified by the data pointer once the - call to BufferData returns. The implementation has to dereference, - e.g. copy, the data during BufferData execution. - - - RFC: format enums - With the possible exception of sample frequency, all - details of a sample (mono/stero, bit resolution, channels, - encoding,compression) should be specified in a format parameter. - In other words, I opt for an enumeration of formats. GL has a - quite large number of those w/o suffering damage. Allowing - parameters the way we do increases error cases and/or - conversion load. The space is combinatorial to begin with, - but an enumeration of valid formats seems better to impose - restrictions. Using enums helps dealing with formats - opaque to the application (compressed data with compressed - header) where sample size and sampling frequency might not - be available. - - There is the related issue of internal formats. A buffer used - for spatialization will have to convert to mono. A buffer used - to pass through to the output hardware will have to - remap an n-channel format to an m-channel format (or let the - hardware do it) including crosstalk handling depending on - the output device (headphones vs. speaker). To prevent that - every buffer has to do both AL needs to know the purpose of a - buffer when dereferencing the data. - - ]]> - - RFC: Frequency woes - Frequency as a uint rises precision issues. - Frequency might not be known for compressed data, we might need - a (yuck) wildcard frequency specifier? - We have a redundancy: frequency per context (mixing quality - desired), frequency internally used by the implementation when - storing the buffers, frequency provided in the data. We need - to specify the latter in some cases and can't in others. Format - enum or frequency enum again. - - ]]> - - - - RFC: data mover mess - API to copy data from output buffer to a buffer? - BufferWriteData to supersede BufferData, BufferReadData - as later extensions for buffer readback for those who want it? - Reading the output stream reverses the problems we have - with appendData: the application provides a memory buffer - into which AL copies as much data as available/as fits. - - ]]> - - - - RFC: expose internal format - Implementations are free to use whatever internal data format is best - suited for their hardware/software implementation, leaving the actual - sample format and structure opaque to the application. Should applications - be able to influence this? Through context creation? Per Buffer? - Do we use Lowest Common Denominator or highest possible quality as a - default? - - ]]> - - RFC: memory management with compressed data - If we allow for mixing from compressed data (perfectly reasonable - for hardware) then it seems even more unlikely the application could - estimate memory usage. - If a compressed format is supported by AL, do we require support for mixing from - compressed data? I daresay not - some formats might not allow for - cheap incremental decompression. - - ]]> - - RFC: conversion and sample retrieval - To retrieve a sample, the size has to be queried first for allocating a - properly sized memory segment as destination. This is dependent on the - format. Conversion can be implemented as creating a buffer, and then - requesting the data in a different format. Is this desirable? Even if - we restrict reading from buffers to the same format they were written - to, conversion from the internal format might be inevitable. Querying - and setting the internal format however might be desirable for certain - purposes. - - ]]> - - -
-
- diff --git a/neo/openal/docs/chp-introduction.sgml b/neo/openal/docs/chp-introduction.sgml deleted file mode 100644 index c9485530..00000000 --- a/neo/openal/docs/chp-introduction.sgml +++ /dev/null @@ -1,304 +0,0 @@ - - - Introduction - - - CVS Document: $Id: chp-introduction.sgml,v 1.3 2000/11/10 21:23:52 bk Exp $ - CVS Revision: $Revision: 1.3 $ - - $Log: chp-introduction.sgml,v $ - Revision 1.3 2000/11/10 21:23:52 bk - Use ../CREDITS for list of contributors. - - Revision 1.2 2000/10/26 02:58:55 bk - Cleanup (typos). - - Revision 1.1 2000/10/11 18:44:46 bk - Document split into separate files. Minor fixes. - - ]]> - -
- Formatting and Conventions - - This API Specification and Reference uses a style that is a blend of the - OpenGL v1.2 specification and the OpenGL Programming Guide, 2nd ed. - Conventions: 'T' is used to designate a type for those functions which - exist in multiple signatures for different types. 'Object' is used - to designate a target Object for those functions which exist in multiple - versions for different Object categories. The 'al' and 'AL_' prefix - is omitted throughout the document. - - - Annotation (Terminology) - "State" refers to state within the context of the &OAL; - state machine description of the &OAL; implementation. - "Objects" refer to &OAL; primitives. - "Attribute" refers to attributes of &OAL; Objects. - Attributes of a &OAL; Objects are one part of the - &OAL; state. Some attributes are not specific to - single objects, but apply to the entire context. - "Parameter" is used for function arguments that might - or might not be attributes, in particular for - command arguments that are not stored as state. - The use of "Property" is to be avoided. - - ]]> - - - - - - 1.8/1.7./1.6/1.5 - September-August 2000 - bk - Final Draft for Public Review - - - - 1.4 - June 2000 - bk - First Draft for Public Review - - - - 1.2 - March 2000 - mkv - Draft released for GDC - - - - TODO - - - work thru past changes - - add GH section - - add rewrite of GH section - - - add section on rfc/ann id's - - add section on procedure - - add proper id's to rfc/ann/sections etc. - - - - ]]> - -
- -
- What is the &OAL; Audio System? - - &OAL; (for "Open Audio Library") is a software interface to audio hardware. - The interface consists of a number of functions that allow a programmer - to specify the objects and operations in producing high-quality audio - output, specifically multichannel output of 3D arrangements of sound - sources around a listener. - - - The &OAL; API is designed to be cross-platform and easy to use. - It resembles the &OGL; API in coding style and conventions. &OAL; uses a - syntax resembling that of &OGL; where applicable. - - - &OAL; is foremost a means to generate audio in a simulated three-dimensional - space. Consequently, legacy audio concepts such as panning and left/right - channels are not directly supported. &OAL; does include extensions compatible - with the IA-SIG 3D Level 1 and Level 2 rendering guidelines to handle - sound-source directivity and distance-related attenuation and Doppler effects, - as well as environmental effects such as reflection, obstruction, transmission, - reverberation. - - - - Like &OGL;, the &OAL; core API has no notion of an explicit rendering context, - and operates on an implied current &OAL; Context. Unlike the &OGL; - specification the &OAL; specification includes both the core API (the - actual &OAL; API) and the operating system bindings - of the ALC API (the "Audio Library Context"). Unlike &OGL;'s GLX, WGL - and other OS-specific bindings, the ALC API is portable across platforms - as well. - -
- -
- Programmer's View of &OAL; - - To the programmer, &OAL; is a set of commands that allow the - specification of sound sources and a listener in three - dimensions, combined with commands that control how these - sound sources are rendered into the output buffer. The - effect of &OAL; commands is not guaranteed to be immediate, - as there are latencies depending on the implementation, - but ideally such latency should not be noticeable to the - user. - - - A typical program that uses &OAL; begins with calls to - open a sound device which is used to process output and - play it on attached hardware (e.g. speakers or headphones). - Then, calls are made to allocate an AL context and - associate it with the device. Once an AL context is - allocated, the programmer is free to issue AL commands. - Some calls are used to render Sources (point and directional - Sources, looping or not), while others affect the rendering - of these Sources including how they are attenuated by - distance and relative orientation. - - - Annotation (&OAL; and &OGL; use) - Often, &OAL; will be used to render a 3D audio environment - matched by a 3D visual scenery. For this purpose, &OAL; is - meant to be a seamlessly integrating complement to &OGL;. - &OAL; state can be updated in sync with the &OGL; or video - updates (synchronized), or in timesteps independent of the - graphics framerate. Audio rendering loops usually update - the current locations of the sources and the listener, updates - global settings, and manages buffers. - - ]]> -
- - -
- Implementor's View of &OAL; - - To the implementor, &OAL; is a set of commands that affect - the operation of CPU and sound hardware. If the hardware - consists only of an addressable output buffer, then &OAL; must - be implemented almost entirely on the host CPU. In some cases - audio hardware provides DSP-based and other acceleration in - various degress. The &OAL; implementors task is to provide - the CPU software interface while dividing the work for each - AL command between the CPU and the audio hardware. This - division should be tailored to the available audio hardware - to obtain optimum performance in carrying out AL calls. - - - &OAL; maintains a considerable amount of state information. - This state controls how the Sources are rendered into the - output buffer. Some of this state is directly available to - the user: he or she can make calls to obtain its value. - Some of it, however, is visible only by the effect it has - on what is rendered. One of the main goals of this - specification is to make &OAL; state information explicit, - to eludicate how it changes, and to indicate what its - effects are. - - - Annotation (Native audio APIs) - Implementors can choose to implement &OAL; on top - of an existing native audio API. - - ]]> - -
- - -
- Our View - - We view &OAL; as a state machine that controls a multichannel - processing system to synthesize a digital stream, passing sample - data through a chain of parametrized digital audio signal - processing operations. This model should engender a specification - that satisfies the needs of both programmers and implementors. - It does not, however, necessarily - provide a model for implementation. Any conformant implementation - must produce results conforming to those produced by the specified - methods, but there may be ways to carry out a particular computation - that are more efficient than the one specified. - - -
- - -
- Requirements, Conformance and Extensions - - The specification has to guarantee a minimum number of resources. - However, implementations are encouraged to compete on performance, - available resources, and output quality. - - - RFC: suggested requirements - These have been taken from earlier specs drafts, suggested by - Creative: - A minimum of sixteen (16) Sources per Context should always be available. - The number and size of Buffers available is limited only by the amount - of memory available and/or accessible by the implementation. - The specification could also list requirements by the implementation: - A minimum storage space of half a megabyte (512kB) should always be available. - - ]]> - - RFC: no requirements - I3DL1-like requirements might be so arbitrary that they are useless. - The dangers here are cap bits, and a subtle aliasing of source and - hardware buffers. AL implementations should implement as much quality - and performance as possible for any given number of sources/ - Application request resources when creating a context and can use Hints - to indicate desired trade-offs. - - ]]> - - - - There will be an &OAL; set of conformance tests available along - with the open source sample implementation. Vendors and individuals - are encouraged to specify and implement extensions to &OAL; in - the same way &OGL; is extensible. Successful extensions will - become part of the core specification as necessary and desirable. - &OAL; implementations have to guarantee backwards compatibility - and ABI compatibility for minor revisions. - - - The current sample implementation and documentation for &OAL; can be - obtained from - openal.org. - &OAL; is also available from the the - - &OAL; CVS repository. For more information on how to get - &OAL; from CVS also see - &coLoki; CVS. - -
- - - -
- Architecture Review and Acknowledgements - - Like &OGL;, &OAL; is meant to evolve through a joined effort of - implementators and application programmers meeting in regular - sessions of an Architecture Review Board (ARB). As of this time - the ARB has not yet been set up. Currently, the two companies - committed to implementing &OAL; drivers have appointed two - contacts responsible for preparing the specification draft. - - - Consequently &OAL; is a cooperative effort, one in a sequence of - earlier attempts to create a cross-platform audio API. The current - authors/editors have assembled this draft of the specification, - but many have, directly and indirectly, contributed to the content - of the actual document. The following list (in all likelihood - incomplete) gives in alphabetical order participants in the discussion - and contributors to the specification processs and related efforts: - - &CREDITS; - - - -
-
- - \ No newline at end of file diff --git a/neo/openal/docs/chp-multichannel.sgml b/neo/openal/docs/chp-multichannel.sgml deleted file mode 100644 index 425ec067..00000000 --- a/neo/openal/docs/chp-multichannel.sgml +++ /dev/null @@ -1,261 +0,0 @@ - - - Handling Multichannel Data - - &AL; is foremost an API to control processing of spatialized sound. For that - reason, the internal, canonical format of data stored in buffers is mono. - The specification does not require the implementation to preserve the - original data, thus multichannel (e.g. stereo) data is usually downsampled - using an algorithm of the implementor's choosing. Implementations are free - to defer decompression, decoding, and conversion until the latest possible - moment, but they are not required to do so by the specification. - - - However, &AL; is an audio API, and consequently has to provide means to - pass through preprocessed multichannel data to the sound driver and - hardware, which in turn will map it to the actual output channels. This - processing might involve mapping from n channels in the data to m channels - in the output, as well as filtering to account for varying requirements - for a given setup. For example, headphone and speaker setups differ with - respect to handling of crosstalk and noise. - - - For this reason, mono buffers can not be used to store data meant for - direct multichannel output. The API has to provide means by which the - application can signal its intention to use a given buffer in this way, - causing the implementation to either preserve the original data, or - convert it as needed for the direct output to the given speaker or - headphone configuration. In many cases, multichannel buffers could be - used with Sources, but the specification does not endorse this at this - time as this might not be guaranteed for all multichannel data formats - &AL; will support. - - - While spatialized sound is often played once, or looping a limited number - of times, multichannel data is usually streaming: typically stereo or MP3 - music, soundtracks, maybe voice data accompanying animation and cinematic - sequences. The queueing mechanism defined for mono buffers and spatialized - Sources is thus also applied to multichannel buffers and passthrough - output. - - - Applications can expect &AL; implementations to support more than one - multichannel output at once (e.g. mixing two stereo streams, or fading - from one to the other for transition). For that reason we can not restrict - multichannel output to just one stream or buffer at a time. - - - Annotation (per-case Buffer use) - The specification will likely be amended at a later time to - allow for the use of mono buffers with multichannel output, - and multichannel buffers with spatialized Sources. - The decision to use the same buffer API for mono - and multichannel buffers was taken in anticipation of this. - In cases where the specification can not guarantee - use of a given multichannel data encoding with a - spatialized source, an error can be generated at the - attempted use, validating the buffer's internal format - against the output chosen. In cases were the specification - can not guarantee the implementation will defer the - conversion of multichannel buffer content as needed (e.g. - PCM stereo data), the application can either specify the - internal format, or the internal format enumeration - can be extended to explicitely request storage of both - multichannel and mono data within the same buffer, at memory - expense. - - ]]> - - -
- Specifying Buffer Content and Internal Format - - The existing BufferData command does not permit the application - to specify an internal format. The implementation is free to - apply conversions, downsampling, upsampling, including - interpolation and filtering, in accordance with the specification. - - - However, applications might want to use different trade-offs - between quality and resource expenditure. More imortantly, - applications might choose to use preprocessed, multichannel - data instead of doing runtime spatialization, e.g. for - recorded music, voice, and realtime streams. In this case - the application expects efficient passthrough of the data - to the hardware. - - - To account for this requirement, an extended command to specify - sample data to be stored in a given buffer is introduced. - - &void; BufferWriteData - &uint; bufferName - &enum; format - &void;* data - &sizei; size - &uint; frequency - &enum; internalFormat - - The internal format of the Buffer can be requested by the - application. The implementation is not required to match - the request excatly. The specification does guarantee that - use of a multichannel internalFormat parameter will cause - the implementation to treat the data as multichannel data. - The implementation is free to perform any remapping from - the number of channels used in the data to the number of - channels available at the output, and apply other prcessing - as needed. - - - Valid formats for internalFormat are FORMAT_MONO8, FORMAT_MONO16, - FORMAT_STEREO8, and FORMAT_STEREO16. An implementation may - expose other formats, see the chapter on Extensions for - information on determining if additional formats are supported. - In general, the set of valid internalFormat parameters will be - a subset of those available as format parameters. - - - Annotation (atomic WriteData) - The internal format for a buffer can not be specified - by using Bufferi. The modular way to set state - is preferable for operations that are always, or - nearly legal and orthogonal, but specifying the - internal format affect allocation and use of a buffer, - and would cause too many error cases. - - ]]> - - Annotation (change buffer format on write) - The API allows for changing a buffer on every write operation, - turning a multichannel buffer into a mono buffer and vice versa. - The specification does not require the implementation to handle - these operations efficiently, as they might require reallocation - of memory. The same is true for resize operations at write. - Applications might prefer to release buffer names that do not - match current requirements, and request new buffer names instead, - an operation which implementations are encouraged to optimize. - - ]]> - - Annotation (BufferReadData) - The specification might be amended at a later time - with a command to retrieve the data from a buffer, - following use of alGetBuffer to retrieve size and - internalFormat. Reading has to be queued for - continuous reads from the actual mixing buffer. - - ]]> - RFC: frequency for write/read? - Do we (ever) want to provide the application control over the internal frequency? - - ]]> -
- - -
- Rendering Multichannel Buffers - - For a variety of reasons, Sources are not used to feed buffer - data into multichannel processing. Instead, a different class - of &AL; object is introduced to encapsulate state management - and resource management for multichannel output: Multichannel - objects. - - - Multichannel objects are referred to by name, and they - are managed by an API partly duplicating the Source API: - GenMultichannels, IsMultichannel, DeleteMultichannels, - Multichanneli and GetMultichanneli. However, the - SourcePlay/Stop commands as well as the Queue/Unqueue - commands can be applied to both: these commands accept - mcName parameters as well as sName parameters. It is - left to the implementation how a Name is mapped to an - object, and how the implementation dinstiguishes sNames - from mcNames. Within a 32bit namespace, and given the - small number of multichannel sources to expect (more than - one is quite possible, but not common), the implementation - can exploit the fact that Names are opaque to the - application. - - - Annotation (Source NONE) - The literal value "0", i.e. NONE, is legal. All - operations on Source/Multichannel NONE are legal NOPs - and quietly ignored. Because of the ambiguity - (is NONE a Source or Multichannel) NONE will never - be available as an actual object, nor will operations - on it ever have effects. - - ]]> - - Annotation (implicit ambient) - One way to feed multichannel data into the rendering is - using the Listener as a Source (sname==0 implies - Listener). This was rejected, as it - does not allow for multiple streams. Using multiple - Sources with appropriate type SOURCE_AMBIENT or - SOURCE_MULTICHHANEL was rejected, as Sources - are by definition spatialized, and support operations - which are meaningless or even illegal for an output - that is not spatialized at all. Modifying the semantics - of Source spatialization by a provision that a relative - position of (0,0,0) would mark a Source as ambient was - rejected for clarity and cleanness. Updates of Source - position can not be expected to convert Sources from - spatialized to ambient and vice versa at any time, - a Source State dependent semantics of position updates - is outright confusing, handling of sources that are - SOURCE_ABSOLUTE but incidentally at listener position - can not be different from that of SOURCE_RELATIVE with - a zero offset. Furthermore, multichannel data is not - necessarily ambient (surround can rotate, while ambient - attempts to prevent any perception of direction). - Finally, multichannel processing might require per-channel - gain adjustment at user request, which is a meaningless - concept for Sources. - - ]]> - - - Annotation (no direct mixing) - Direct mixing into the rendering buffer, allowing the - application to superimpose its multichannel data - (or custom software mixing results) on the audio stream - generated by spatialization was rejected, as it suffers - from similar problems as BufferAppendData and loop points, - namely the need to operate at sample level on buffers of - unknown format that might not even be directly accessible. - The same rationale that led to the adoption of maintaining - a processing queue for Sources applies to multichannel data. - - ]]> - - Annotation (no combined Buffer/Passthrough) - Multichannel buffers cannot serve as multichannel output - objects for two reasons: it would complicate the buffer - API with operations only applicable to a subset of buffers, - and it does not allow for queueing. - - ]]> - - RFC: Per-Channel access - At a later time we might want to amend the specification to - gain access to a single channel within a multichannel buffer. - I suggest that any such operation should be restricted to the - ability of reading samples from just one channel into application - memory, which allows for writing it into a mono buffer subsequently. - - ]]> - -
-
\ No newline at end of file diff --git a/neo/openal/docs/chp-operation.sgml b/neo/openal/docs/chp-operation.sgml deleted file mode 100644 index 78fa87b6..00000000 --- a/neo/openal/docs/chp-operation.sgml +++ /dev/null @@ -1,977 +0,0 @@ - - - &OAL; Operation - - - &OAL; Fundamentals - - &OAL; (henceforth, the "&AL;") is concerned only with rendering audio - into an output buffer, - and primarily meant for spatialized audio. - There is no support for reading audio input from buffers at this - time, and no support for MIDI and other components usually - associated with audio hardware. Programmers must relay on other - mechanisms to obtain audio (e.g. voice) input or generate music. - - - The &AL; has three fundamental primitives or objects -- Buffers, Sources, - and a single Listener. Each object can be changed independently, - the setting of one object does not affect the setting of others. - The application can also set modes that affect processing. Modes - are set, objects specified, and other &AL; operations performed - by sending commands in the form of function or procedure calls. - - Sources store locations, directions, and other attributes of an object in 3D - space and have a buffer associated with them for playback. There are - normally far more sources defined than buffers. When the program wants to play - a sound, it controls execution through a source object. Sources are - processed independently from each other. - - Buffers store compressed or un-compressed audio data. It is common to - initialize a large set of buffers when the program first starts (or at - non-critical times during execution -- between levels in a game, for instance). - Buffers are referred to by Sources. Data (audio sample data) is associated - with buffers. - - There is only one listener (per audio context). The listener attributes are - similar to source attributes, but are used to represent where the user is - hearing the audio from. The influence of all the sources from the - perspective of the listener is mixed and played for the user. - - - RFC: Data Binding - Have to specifiy when pointer arguments are dereferenced. - - ]]> - - Primitive Types - - As &AL; is meant to allow for seamless integration with &OGL; code - if needed, the &AL; primitive (scalar) data types mimic the - &OGL; data types. Guaranteed minimum sizes are stated for &OGL; - data types (see table 2.2 of the &OGL; 1.2 Specification), but - the actual choice of C datatype is left to the implementation. - All implementations on a given binary architecture, however, must - use a common definition of these datatypes. - - - RFC/000507: - ALlong/ALulong are omitted from the Linux OpenGL Base ABI, - and the GL specification. Do we want to go ahead on this, - or trail GL? Do we include non-i386 architectures to list - sizes explicitely. I.e. do we make the ABI part of our - mandate? - - ]]> - - - Note that this table uses explicit AL prefixes for clarity, - while they might be omitted from the rest of the document - for brevity. GCC equivalents are given for IA32, i.e. a - portable and widely available compiler on the most common - target architecture. - - &AL; Primitive Data Types - - - - - - AL Type - Description - GL Type - GCC IA32 - - - - - ALboolean - 8-bit boolean - GLboolean - unsigned char - - - ALbyte - signed 8-bit 2's-complement integer - GLbyte - signed char - - - ALubyte - unsigned 8-bit integer - GLubyte - unsigned char - - - ALshort - signed 16-bit 2's-complement integer - GLshort - short - - ALushort - unsigned 16-bit integer - GLushort - unsigned short - - - ALint - signed 32-bit 2's-complement integer - GLint - int - - - ALuint - unsigned 32-bit integer - GLuint - unsigned int - - - ALlong - signed 64-bit 2's-complement integer - n/a - long long - - - ALulong - unsigned 64-bit integer - n/a - unsigned long long - - ]]> - - ALsizei - non-negative 32-bit binary integer size - GLsizei - int - - - ALenum - enumerated 32-bit value - GLenum - unsigned int - - - ALbitfield - 32 bit bitfield - GLbitfield - unsigned int - - - ALfloat - 32-bit IEEE754 floating-point - GLfloat - float - - - ALclampf - Same as ALfloat, but in range [0, 1] - GLclampf - float - - - ALdouble - 64-bit IEEE754 floating-point - GLdouble - double - - - ALclampd - Same as ALdouble, but in range [0, 1] - GLclampd - double - - - -
-
- - - - Annotation on Type Sizes - It would be desirable to guarantee the bit size of &AL; data - types, but this might affect the mapping to &OGL; types - for which the &OGL; specification only guarantees a minimum - size. - - Annotation on 64bit integral - It would be desirable to define ulong and long, but again - we defer to &OGL; in this decision. - - Annotation on Enumeration - &enum; is not a C or C++ enumeration, but implemented as - C preprocesor defines. This makes it easier to handle - extensions to the &AL; namespace, in particular in - dealing with delays in distributing updated reference - headers. - - ]]> -
- - Floating-Point Computation - - Any representable floating-point value is legal as input - to a &AL; command that requires floating point data. - The result of providing a value that is not a floating - point number to such a command is unspecified, but must not - lead to &AL; interruption or termination. In IEEE arithmetic, - for example, providing a negative zero or a denormalized - number to a GL command yields predictable results, while - providing an NaN or infinity yields unspecified results. - - Some calculations require division. In such cases (including - implied divisions required by vector normalizations), a - division by zero produces an unspecified result but must - not lead to GL interruption or termination. - - -
- - - AL State - - The &AL; maintains considerable state. This documents enumerates - each state variable and describes how each variable can be - changed. For purposes of discussion, state variables are - categorized somewhat arbitrarily by their function. For example, - although we describe operations that the &AL; performs on the - implied output buffer, the outbut buffer is not part of the - &AL; state. Certain states of &AL; objects (e.g. buffer states - with respect to queueing) are introduced for discussion purposes, - but not exposed through the API. - - - - - AL Command Syntax - - &AL; commands are functions or procedures. Various groups of - commands perform the same operation but differ in how - arguments are supplied to them. To conveniently accomodate - this variation, we adopt the &OGL; nnotation for describing - commands and their arguments. - - - Annotation (Not all types supported yet) - At this time &AL; does not support the full flexibility that - &OGL; offers. Certain entry points are supported only for - some data types. In general, &AL; tends to use less entry - points, using setter commands that use the same tokens - as the matching query commands. - - ]]> - - - - - Basic AL Operation - - &AL; can be used for a variety of audio playback tasks, and is an - excellent complement to &OGL; for real-time rendering. A programmer who is - familiar with &OGL; will immediately notice the similarities between the - two APIs in that they describe their 3D environments using similar methods. - - - For an &OGL;/&AL; program, most of the audio programming will be in two - places in the code: initialization of the program, and the rendering loop. - An &OGL;/&AL; program will typically contain a section where the graphics and - audio systems are initialized, although it may be spread into multiple functions. - For OpenAL, initialization normally consists of creating a context, creating - the initial set of buffers, loading the buffers with sample data, creating - sources, attaching buffers to sources, setting locations and directions for - the listener and sources, and setting the initial values for state global - to &AL;. - - - - Initialization Example - - &sample.c; - - - - - - - Initialization Example - - &ExInitAL.c; - - - ]]> - - - The audio update within - the rendering loop normally consists of telling &AL; the current locations - of the sources and listener, updating the environment settings, and managing - buffers. - - - - Processing Loop - -// PlaceCamera -- places OpenGL camera and updates OpenAL listener position and source state -void 3DEnvironemnt:PlaceCamera() -{ - // update OpenGL camera position - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-0.1333, 0.1333, -0.1, 0.1, 0.2, 50.0); - - gluLookAt(listenerPos[0], listenerPos[1], listenerPos[2], - (listenerPos[0] + sin(listenerAngle)), listenerPos[1], (listenerPos[2] - cos(listenerAngle)), - 0.0, 1.0, 0.0); - - // OpenAL stuff... - // place listener at camera - alListener3f(AL_POSITION, listenerPos[0], listenerPos[1], listenerPos[2]); - float directionvect[6]; - directionvect[0] = (float) sin(listenerAngle); - directionvect[1] = 0; - directionvect[2] = (float) cos(listenerAngle); - directionvect[3] = 0; - directionvect[4] = 1; - directionvect[5] = 0; - alListenerfv(AL_ORIENTATION, directionvect); - - // play phasor if in range, else stop playback - if (range() < 9) - { - alSourcePlay(source[1]); - } else - { - alSourceStop(source[1]); - } -} - - - ]]> - - - - - AL Errors - - The AL detects only a subset of those conditions that could be - considered errors. This is because in many cases error checking - would adversely impact the performance of an error-free program. - The command - - &enum; GetError - - - is used to obtain error information. Each detectable error is - assigned a numeric code. When an error is detected by AL, - a flag is set and the error code is recorded. Further errors, - if they occur, do not affect this recorded code. When GetError - is called, the code is returned and the flag is cleared, so that - a further error will again record its code. If a call to GetError - returns NO_ERROR then there has been no detectable error since - the last call to GetError (or since the AL was initialized). - - - RFC: GL distributed error - To allow for distributed implementations there may be several - flag/code pairs. In this case, after a call to GetError returns a - value other than NO_ERROR each subsequent call returns the - non-NO_ERROR code of another distinct flag-code pair (in - unspecified order), until all NO_ERROR codes have been returned. - When there are no more non-NO_ERROR codes, all flags be reset. - The initial state of all flags is cleared and the initial value - of all codes is NO_ERROR. - - Annotation (Looping GetError) - &AL; applications are advised to loop calls of GetError to - make sure that all flags are reset. Only the first error - occurence for each flag/code pair is recorded, subsequent - errors are ignored. The result of a repeated GetError call - is not a stack trace or LIFO sequence. All error handling - is context specific. - - - ]]> - - - Annotation (Only First Error) - Like &OGL; &AL; will ignore subsequent errors once an - error conditation has been encountered. - - ]]> - - - Error codes can be mapped to strings. The GetString function - returns a pointer to a constant (literal) string that is - identical to the identifier used for the enumeration value, - as defined in the specification. - - - Annotation/ Verbose Error String - There is no need to maintain a separate GetErrorString - function (inspired by the proposed gluGetErrorStrings) - as the existing GetString entry point can be used. - - ]]> - - - - - Error Conditions - - - - - - Name - Description - - - - - NO_ERROR - "No Error" token. - - - INVALID_NAME - Invalid Name parameter. - - - INVALID_ENUM - Invalid parameter. - - - INVALID_VALUE - Invalid enum parameter value. - - - INVALID_OPERATION - Illegal call. - - - OUT_OF_MEMORY - Unable to allocate memory. - - - -
- The table summarizes the AL errors. Currently, when an error flag - is set, results of AL operations are undefined only if OUT_OF_MEMORY - has occured. In other cases, the command generating the error is - ignored so that it has no effect on AL state or output buffer - contents. If the error generating command returns a value, - it returns zero. If the generating command modifies values - through a pointer argument, no change is made to these values. - These error semantics apply only to AL errors, not to system errors - such as memory access errors. -
- - Several error generation conditions are implicit in the description - of the various AL commands. First, if a command that requires - an enumerated value is passed a value that is not one of those - specified as allowable for that command, the error INVALID_ENUM - results. This is the case even if the argument is a pointer to - a symbolic constant if that value is not allowable for the given - command. - This will occur whether the value is allowable for other functions, - or an invalid integer value. - - - Integer parameters that are used as names for &AL; objects - such as Buffers and Sources are checked for validity. If an invalid - name parameter is specified in an &AL; command, an - INVALID_NAME error will be generated, and the command is ignored. - - - If a negative integer is provided where an argument of type - &sizei; is specified, the error INVALID_VALUE results. The same - error will result from attempts to set integral and floating - point values for attributes exceeding the legal range for - these. The specification does not guarantee that the implementation - emits INVALID_VALUE if a &NaN; or &Infty; value is - passed in for a &float; or &double; argument (as the specification - does not enforce possibly expensive testing of floating point - values). - - - - Commands can be invalid. For example, certain commands might not be - applicable to a given object. There are also illegal combinations - of tokens and values as arguments to a command. &AL; responds to any - such illegal command with an INVALID_OPERATION error. - - - - No longer true except for extensions. To be avoided - in general: &AL; has - mutually exclusive commands operating on similar objects. - One example is treating a streaming buffer as a - non-streaming buffer, another is appending data to a - non-streaming buffer. - - ]]> - - - If memory is exhausted as a side effect of the execution of an - AL command, either on system level or by exhausting the allocated - resources at AL's internal disposal, the error OUT_OF_MEMORY - may be generated. This can also happen independent of recent - commands if &AL; has to request memory for an internal task - and fails to allocate the required memory from the operating - system. - - - Otherwise errors are generated only for conditions that are - explicitely described in this specification. - - - - RFC: INVALID_SIZE? - Specific error case in which the size argument is - negative, or mismatches internal conditions for a getter? - - ]]> - - - RFC: INVALID_POINTER? - GL seemingly does not specify a response to NULL pointer - destinations, and does not assign an error case. INVALID_VALUE - could be used, also we could introduce a separate INVALID_POINTER. - Is there a good reason not to catch these cases? - - ]]> - - -
- - - - - Controlling AL Execution - - The application can temporarily disable certain AL capabilities - on a per Context basis. This allows the driver implementation - to optimize for certain subsets of operations. - Enabling and disabling capabilities is handled using a function - pair. - - &void; Enable - &enum; target - - - &void; Disable - &enum; target - - The application can also query whether a given capability is - currently enabled or not. - - &bool; IsEnabled - &enum; target - - If the token used to specify target is not legal, - an INVALID_ENUM error will be generated. - - - At this time, this mechanism is not used. There are no valid - targets. - - Annotation (Enable/Disable) - Currently, &AL; is controlled exploiting existing - commands. For example, to disable sound output but - not processing, the Listener can be muted setting - GAIN to zero. Selecting NONE as the distance model - disables distance attenuation. Setting DOPPLER_FACTOR - to zero disables the Doppler Effect. A redundant - mechanism to accomplish the same is not needed. - - ]]> - - - - - Object Paradigm - - &AL; is an object-oriented API, but it does not expose classes, structs, - or other explicit data structures to the application. - - - - - Object Categories - - &AL; has three primary categories of Objects: - - - - one unique Listener per Context - - - - - multiple Buffers shared among Contexts - - - - - multiple Sources, each local to a Context - - - - In the following, "{Object}" will stand for either Source, - Listener, or Buffer. - - - - - Static vs. Dynamic Objects - - The vast majority of &AL; objects are dynamic, and will be created - on application demand. There are also &AL; objects that do not have - to be created, and can not be created, on application demand. - Currently, the Listener is the only such static object in &AL;. - - - - - - Object Names - - Dynamic Objects are manipulated using an integer, which in - analogy to &OGL; is referred to as the object's "name". These - are of type unsigned integer (uint). Names can be valid - beyond the lifetime of the context they were requested - if the objects in question can be shared among contexts. - No guarantees or assumptions are - made in the specification about the precise values or their distribution - over the lifetime of the application. As objects might be shared, - Names are guaranteed to be - unique within a class of &AL; objects, but no guarantees are made - across different classes of objects. Objects that are unique - (singletons), like the Listener, do not require and do not have - an integer "name". - - - - - - Requesting Object Names - - &AL; provides calls to obtain Object Names. The application requests - a number of Objects of a given category using Gen{Object}s. - If the number n of Objects requested is negative, - an INVALID_VALUE error will caused. The actual values of the - Names returned are implementation dependent. No guarantees on - range or value are made. Unlike &OGL; &OAL does not offer alternative - means to define (bind) a Name. - - - Allocation of Object Names does not imply immediate allocation of - resources or creation of Objects: the implementation is free to - defer this until a given Object is actually used in mutator calls. - The Names are written at the memory location specified by the caller. - - void Gen{Object}s - &sizei; n - &uint;* objectNames - - - - Requesting zero names is a legal NOP. Requesting a negative - number of names causes an INVALID_VALUE error. - &AL; will respond with an OUT_OF_MEMORY if the application - requests too many objects. The specification does not guarantee - that the &AL; implementation will allocate all resources - needed for the actual objects at the time the names are - reserved. In many cases (Buffers) this could only be - implemented by worst case estimation. Allocation of names - does not guarantee that all the named objects can actually - be used. - - - - - We do not re-use Names under any circumstance. Do we require - implementations throwing OUT_OF_MERMORY errors on allocation of - Names? No - we don't even specify buffer sizes. Ambiguity - could - an implementation throw OOM because of no names, or OOM because - of a (worst case) estimate of object sizes? Do we need OUT_OF_NAMES? - - ]]> - - - - The current headers include a sizei return parameter: - "Returns the number of ids actually allocated." - This violates the "failed commands are NOPs" design - and introduces ambiguity in error handling, and has - thus been changed breaking backwards compatibility. - - ]]> - - Annotation (No application selected Names) - Unlike GL, applications are not free to choose Names; all - Names have to be requested. Aside from possible benefits for - the implementation, and avoidance of errors in projects - that have many modules using the AL implementation (a problem - encountered in GL, when the two generation mechanisms are - mixed), this also leaves open the door to feed different - kinds of objects by Name through the same API entry points. - - ]]> - - Annotate (Negative/zero sizei) - The specification does not guarantee that sizei is an - unsigned integer, but legal values have to be non-negative. - However, requesting zero names is a legal NOP. - - ]]> - - RFC: Resource Release Hint - Do we need a hint that resource release has to be done on DeleteXXX, - instead of leaving this housekeeping to &AL;? - - RFC: Zero Name - Do we reserve the name "0"? &OGL; provides an alternative mechanism - which lets the application pick texture names, which we discarded - because it is prone to create error conditions when mixing both - approaches. As all our names are generated using GenXXXX, there - is no real need to treat "0" special. - - ]]> - - - - - - Releasing Object Names - - &AL; provides calls to the application to release Object Names - using Delete{Object}s, implicitly requesting deletion of the - Objects associated with the Names released. If the number n of Objects named - is negative, an INVALID_VALUE error will be caused. - If one or more of the specified Names is not valid, an INVALID_NAME - error will be caused. Implementation behavior following any error - is undefined. - - - Once deleted (even if an error occured on deletion), the Names are - no longer valid for use with any &AL; function calls including - calls to Delete{Objects}s. Any such use will cause an INVALID_NAME - error. - - - The &AL; implementation is free to defer actual release of - resources. Ideally, resources should be released as soon as - possible, but no guarantees are made. - - &void;Delete{Object}s - &sizei;n - &uint;*objectNames - - - - Annotation - GenXXX and DeleteXXX can not reasonably be expected to be used - for controlling driver-side resource management from the - application. A driver might never release a Source once allocated - during the lifetime of the application. - - ]]> - - RFC: Deletion Errors - chasan@acm.org: - What happens if an active source (or its associated buffer) is deleted? - The source should be stopped? Or the delete operation is invalid? - - ]]> - - - - - - Validating an Object Name - - &AL; provides calls to validate the Name of an Object. - The application can verify whether an Object Name is valid - using the Is{Object} query. There is no vector (array) - version of this function as it defeats the purpose of - unambiguous (in)valdiation. Returns &TRUE; if id is a - valid Object Name, and &FALSE; otherwise. Object Names are - valid between request (Gen{Object}s) and release (Delete{Object}s). - Is{Object} does not distinguish between invalid and deleted Names. - - &bool;Is{Object} - &uint;objectName - - - RFC/bk000504: - If zero is a valid name, this function will have to accept - it without an actyual object (or only an internal dummy) - being associated with it. I recommend that implementations - never return "0" as an object name. - - ]]> - - - - - Setting Object Attributes - - For &AL; Objects, calls to control their attributes are provided. - These depend on the actual properties of a given Object - Category. The precise API is discussed for each category, - below. Each &AL; command affecting the state of - a named Object is usually of the form - - void {Object}{n}{sifd}{v} - &uint; objectName - &enum; paramName - &type; values - - In the case of unnamed (unique) Objects, the (integer) objectName - is omitted, as it is implied by the {Object} part of function name: - - void {Object}{n}{sifd}{v} - &enum; paramName - &type; values - - For example, the Listener3d command would not require an (integer) - objectName argument. - - - The objectName specifies the &AL; object affected by this call. - Use of an invalid Name will cause an INVALID_NAME error. - - - The Object's Attribute to be affected has to be named - as paramName. &AL; parameters applicable to one category - of Objects are not necessarily legal for another catetgory - of &AL; Objects. Specification of a parameter illegal for - a given object will cause an INVALID_OPERATION error. - - - Not all possible values for a type will be legal for a - given objectName and parameterName. Use of an illegal value - or a NULL value pointer will cause an INVALID_VALUE error. - - - Any command that causes an error is a NOP. - - - - - Querying Object Attributes - - For named and for unique &AL; Objects, calls to query their - current attributes are provided. - These depend on the actual properties of a given Object - Category. The performance of such queries is implementation - dependent, no performance guarantees are made. The valid values for the - parameter paramName are identical to the ones legal for the complementing - attribute setting function. - - void Get{Object}{n}{sifd}{v} - &uint; objectName - &enum; paramName - &type;* destination - - For unnamed unique Objects, the objectName is omitted as it is - implied by the function name: - - void Get{Object}{n}{sifd}{v} - &enum; paramName - &type;* destination - - - - The precise API is discussed for each category separately, below. - Unlike their matching mutators, Query functions for non-scalar - properties (vectors etc.) are only available in array form. - - - Use of an invalid Name will cause an INVALID_NAME error. - Specification of an illegal parameter type (token) will cause - an INVALID_ENUM error. A call with a destination - NULL pointer will be quietly ignored. The &AL; state will not - be affected by errors. In case of errors, destination memory - will not be changed. - - - - - - Object Attributes - - - Attributes affecting the processing of sounds can be set for various - &AL; Object categories, or might change as an effect of &AL; calls. - The vast majority of these Object properties are specific to the - &AL; Object category, in question, but some are applicable to two - or more categories, and are listed separately. - - - The general form in which this document describes parameters is - - {Object} Parameters - - - - - - - - &Par; - &Sig; - &Val - &Def; - - - - - paramName - T - range or set - scalar or n-tuple - - - -
- Description: - The description specifies additional restrictions and details. - paramName is given as the &AL; enum defined as its name. - T can be a list of legal signatures, usually the array form - as well as the flat (unfolded) form. -
- - - RFC: Initial (Default) State - The default state of objects will have to be specified here. - There will be no commands that allow the application to set - other defaults. - - ]]> -
-
-
- diff --git a/neo/openal/docs/chp-queueing.sgml b/neo/openal/docs/chp-queueing.sgml deleted file mode 100644 index 8bce727b..00000000 --- a/neo/openal/docs/chp-queueing.sgml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/neo/openal/docs/chp-rendering.sgml b/neo/openal/docs/chp-rendering.sgml deleted file mode 100644 index 1237e88d..00000000 --- a/neo/openal/docs/chp-rendering.sgml +++ /dev/null @@ -1,2076 +0,0 @@ - - - - Listener and Sources - - - Basic Listener and Source Attributes - - This section introduces basic attributes that can be set both for - the Listener object and for Source objects. - - - RFC: attribute grouping - JM: "These attributes are of - two types: non-positional and positional. - Non-positional properties include gain control and Environment Name." - - I said: (low pass) Filters are applied to the sound during processing - at various stages. The exact sequence in which Filters are applied is - determined based on the location of the Objects they are - set for - spatial arrangement of Objects determines the - sequence unless invariance is guaranteed, or invariance - violation is permitted by the specification and current &AL; - configuration state. - - Is there a required order of application, i.e. a pipeline? - - Filter Parameters vs. Non-positional properties. - Spatialization vs. Positional properties. - Spatial attributes? - Let's postpone grouping of attributes. - - ]]> - - - - The &AL; Listener and Sources have attributes to describe - their position, velocity and orientation in three dimensional space. - &AL; like &OGL;, uses a right-handed Cartesian coordinate system (RHS), - where in a frontal default view X (thumb) points right, - Y (index finger) points up, and Z (middle finger) points towards - the viewer/camera. To switch from a left handed coordinate system (LHS) - to a right handed coordinate systems, flip the sign on the Z coordinate. - - - - - Listener/Source Position - - - - &Par; - &Sig; - &Val - &Def; - - - - - POSITION - 3fv, 3f - any except NaN - { 0.0f, 0.0f, 0.0f } - - - -
- Description: - POSITION specifies the current location of the Object in the - world coordinate system. Any 3-tuple of valid float/double values - is allowed. Implementation behavior on encountering &NaN; and &Infty; - is not defined. The Object position is always defined in the - world coordinate system. -
- - Annotation (No Transformation) - &AL; does not support transformation operations on Objects. - Support for transformation matrices is not planned. - - ]]> - - - - - Listener/Source Velocity - - - - &Par; - &Sig; - &Val - &Def; - - - - - VELOCITY - 3fv, 3f - any except NaN - { 0.0f, 0.0f, 0.0f } - - - -
- Description: - VELOCITY specifies the current velocity (speed and direction) of - the Object, in the world coordinate system. Any 3-tuple of valid - float/double values is allowed. The Object VELOCITY does not affect - its position. - &AL; does not calculate the velocity from subsequent position - updates, nor does it adjust the position over time based on - the specified velocity. Any such calculation is left to the - application. For the purposes of sound processing, position and - velocity are independent parameters affecting different aspects - of the sounds. -
- VELOCITY is taken into account by the driver to synthesize the - Doppler effect perceived by the Listener for each source, based - on the velocity of both Source and Listener, and the Doppler - related parameters. - - - - - - - - Listener/Source Gain (logarithmic) - - - - &Par; - &Sig; - &Val - &Def; - - - - - GAIN - f - 0.0f, (0.0f, any - 1.0f - - - -
- Description: - GAIN defines a scalar amplitude multiplier. As a Source attribute, it applies - to that particular source only. As a Listener attribute, it effectively - applies to all Sources in the current Context. The default 1.0 means - that the sound is un-attenuated. A GAIN value of 0.5 is equivalent to - an attenuation of 6 dB. The value zero equals silence (no output). Driver - implementations are free to optimize this case and skip mixing and - processing stages where applicable. The implementation is in charge of - ensuring artifact-free (click-free) changes of gain values and is free - to defer actual modification of the sound samples, within the limits of - acceptable latencies. -
- - GAIN larger than 1 (amplification) is permitted for Source and - Listener. However, the implementation is free to clamp the - total gain (effective gain per source times listener gain) - to 1 to prevent overflow. - - - - Annotation/ Effective Minimal Distance - Presuming that the sample uses the entire dynamic range of - the encoding format, an effective gain of 1 represents the - maximum volume at which a source can reasonably be played. - During processing, the implementation combines the Source - GAIN (or MIN_GAIN, if set and larger) with distance based - attenuation. The distance at which the effective gain is 1 - is equivalent to the DirectSound3D MIN_DISTANCE parameter. - Once the effective gain has reached the maximum possible - value, it will not increase with decreasing distance anymore. - - ]]> - - - Annotation (Muting a Context) - To mute the current context, simply set Listener GAIN to zero. - The implementation is expected to optimize for this case, - calculating necessary (offset) updates but bypassing the - mixing and releasing hardware resources. - The specification does not guarantee that the implementation - will release hardware resources used by a muted context. - - ]]> - - Annotation (Muting a Source) - To mute a Source, set Source GAIN to zero. The &AL; implementation - is encouraged to optimize for this case. - - ]]> - - - RFC: GAIN > 1? - GAIN could exceed 1 (to compensate attenuation elsewhere, or to account - for grater dynamic range of the hardware? No guarantees are made with - respect to range overflows? Precision loss? Culling by effective gain? - Does &AL; clip values during processing, and when/at what stages? - - - RFC: Doppler - JM wrote: "VELOCITY is used by the driver - to synthesize the Doppler effect perceived by the listener for each - source, based on the relative velocity of this source with respect - to the listener." - Doppler is calculated using Source and Listener velocities measured - with respect to the medium. Do we have to account for the medium - to move (offsetting listener/source) in later revisions (air/water currents)? - - - RFC: - JM removed: "For the purposes of sound processing, position and - velocity are independent parameters affecting different paths - in the sound synthesis." I think the "different aspects of sounds" - is ambiguous. Is there a problem with describing &AL; as a - multichannel processing machine? - - - ]]> - -
- - - - Listener Object - - - The Listener Object defines various properties that affect processing of - the sound for the actual output. The Listener is unique for an &AL; Context, - and has no Name. By controlling the listener, the application controls - the way the user experiences the virtual world, as the listener defines - the sampling/pickup point and orientation, and other parameters that - affect the output stream. - - - It is entirely up to the driver and hardware configuration, i.e. - the installation of &AL; as part of the operating system and - hardware setup, whether the output stream is generated for - headphones or 2 speakers, 4.1 speakers, or other arrangements, - whether (and which) HRTF's are applied, etc.. - - - Annotation (Listener Anatomy) - The API is ignorant with respect to the real world - listener, it does not need to make assumptions on the - listening capabilities of the user, its species or its - number of ears. It only describes a scene and the position - of the listener in this scene. It is the &AL; implementation - that is designed for humans with ears on either side of the - head. - - ]]> - - - Annotation (Listener State Evaluation) - Some Listener state (GAIN) affects only the very last - stage of sound synthesis, and is thus applied to the sound stream - as sampled at the Listener position. Other Listener state is - applied earlier. One example is Listener velocity as used to - compute the amount of Doppler pitch-shifting applied to each source: - In a typical implementation, pitch-shifting (sample-rate conversion) - might be the first stage of the audio processing for each source. - - ]]> - - - - Listener Attributes - - - Several Source attributes also apply to Listener: e.g. POSITION, VELOCITY, - GAIN. In addition, some attributes are listener specific. - - Listener Orientation - - - - &Par; - &Sig; - &Val - &Def; - - - - - ORIENTATION - fv - any except NaN - { { 0.0f, 0.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } } - - - -
- Description: - ORIENTATION is a pair of 3-tuples representing the 'at' direction vector - and 'up' direction of the Object in Cartesian space. &AL; expects two - vectors that are orthogonal to each other. These - vectors are not expected to be normalized. If one or more vectors - have zero length, implementation behavior is undefined. If the two - vectors are linearly dependent, behavior is undefined. -
- RFC: Orientation Paranoia - Watch LHS vs. RHS (sign on 'at'). - Confirm sequence is (up, at) not vice versa. - Do we want to allow for different representations down the road? - - ]]> -
- - - Changing Listener Attributes - - Listener attributes are changed using the Listener group of commands. - - void Listener{n}{sifd}{v} - &enum; paramName - &type; values - - - - - - Querying Listener Attributes - - Listener state is maintained inside the &AL; implementation and can be - queried in full. See Querying Object Attributes. The valid values for - paramName are identical to the ones for the Listener* command. - - void GetListener{sifd}v - &enum; paramName - &type;* values - - - -
- - - - - Source Objects - - Sources specify attributes like position, velocity, and a buffer with - sample data. By controlling a Source's attributes the - application can modify and parameterize the static sample data provided - by the Buffer referenced by the Source. - Sources define a localized sound, and encapsulate - a set of attributes applied to a sound at its origin, i.e. in the - very first stage of the processing on the way to the listener. - Source related effects have to be applied - before Listener related effects unless the output is invariant - to any collapse or reversal of order. - - - &AL; also provides additional functions to manipulate and query the - execution state of Sources: the current playing status of a - source (started, stopped, paused), including access to the current - sampling position within the associated Buffer. - - - RFC: Mike on Source Types - AL_SOURCE_ABSOLUTE and AL_SOURCE_AMBIENT have been - deprecated. AL_SOURCE_ABSOLUTE was simply the converse of the - AL_SOURCE_RELATIVE pname, and as such was unnecessary. The - effect of AL_SOURCE_AMBIENT is trivially emulated by either - querying the Listener position and setting the Source position - accordingly, or setting the Source position to (0,0,0) and the - type to AL_SOURCE_RELATIVE, and is therefore also unnecessary. - - ]]> - - - RFC: Bernd on Source Types - Mike seems to miss a few problems here. W/o a converse we can't - reset source attributes to ABSOLUTE. Ambient sounds are not - necessarily trivial. A3D manual suggested some magic number - to fake the effect of ambient (i.e. sound that ideally - can't be localized by listener). If we can get away with such magic - numbers in a tutorial in a driver-independent way, fine. If there is any - risk that the impression of ambient sound requires driver specific - hacks, then we need AMBIENT. As soon as we have a third localization - type, ABSOLUTE and RELATIVE are needed as there is no unambiguous - converse. - - From the A3D 2.0 Optimize.doc: - "Adding some ambient background noise is a great way to fill in the gaps - when the audio content is reduced. A great way to make an ambient sound - seem like it is coming from everywhere is to load up two buffers with the - same sound, and position them about 2 meters behind the listener at - about 4 and 8 o\rquote clock. The waves have to be looping (make sure - there is no beating when you play them back). Starting the sounds 180 - degrees out of phase can help, as will playing them with slightly different - pitch-shift values." - - ]]> - - RFC: Bernd on Source Types (2) - There is a point to be made in using POSITION_RELATIVE and - VELOCITY_RELATIVE iff we do not have AMBIENT to consider. - This makes it a call-by-call choice when setting Source3f{v} - vectors, as it is applied when dereferencing. - - ]]> - - RFC: Bernd on Source Types (3) - Semantically, AMBIENT has nothing to do with coordinate systems, - it is a qualifier just like multichannel direct passthru. - - ]]> - - RFC: Source Attenuation Clamping - Using AL_SOURCE_ATTENUATION_MIN and AL_SOURCE_ATTENUATION_MAX - to specify the clamping values for the normalized attenuation - factor (which is a function of distance) is in contradiction - to the distance based model that Creative is pushing for - (DirectSound). As driver-interall culling of source and other - processing might be based on the effective (overall, ultimate) - gain composed of amplifications and attenuations accumulated - over the entire processing, I raise the question whether a sound - designer might not want to control the effective GAIN ranges - instead of the distance attenuation itself. Samples commonly - use the entire dynamic range provided by the format, which is - mapped to the entire dynamic range of the output device. An - effective gain exceeding 1 does not make sense, an amplification - during processing might. - - ]]> - - - - - - - Managing Source Names - - &AL; provides calls to request and release Source Names handles. - Calls to control Source Execution State are also provided. - - - - Requesting a Source Name - - The application requests a number of Sources using GenSources. - - &void; GenSources - &sizei; n - &uint;* sources - - - - - - - Releasing Source Names - - The application requests deletion of a number of Sources - by DeleteSources. - - &void; DeleteSources - &sizei; n - &uint;* sources - - - - - - Validating a Source Name - - The application can verify whether a source name is valid - using the IsSource query. - - &bool; IsSource - &uint; sourceName - - - - - - - - Source Attributes - - This section lists the attributes that are set per Source, - affecting the processing of the current buffer. Some of - these attributes can also be set for buffer queue entries. - - Annotation (No Priorities) - There are no per Source priorities, and no explicit priority - handling, defined at this point. A mechanism that lets the - application express preferences in case that the implementation - provides culling and prioritization mechanisms might be added - at some later time. This topic is under discussion for GL as - well, which already has one exlicit priority API along with - internally used MRU heuristics (for resident texture memory). - - ]]> - - - - - - Source Positioning - - - SOURCE_RELATIVE Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - SOURCE_RELATIVE - &bool; - FALSE, TRUE - FALSE - - - -
- SOURCE_RELATIVE set to TRUE indicates that the values - specified by POSITION are to be interpreted relative - to the listener position. -
- - - Annotation (Position only) - SOURCE_RELATIVE does not affect velocity or orientation - calculation. - - ]]> - -
- - - Buffer Looping - - - Source LOOPING Attribute - - - - - - - - - &Par; - &Sig; - &Val - &Def; - - - - - LOOPING - &uint; - TURE, FALSE - FALSE - - - -
- Description: - LOOPING is a flag that indicates that the Source will not - be in STOPPED state once it reaches the end of last buffer - in the buffer queue. Instead, the Source will immediately - promote to INITIAL and PLAYING. The default value is FALSE. - LOOPING can be changed on a Source in any execution state. - In particular, it can be changed on a PLAYING Source. -
- - Annotation (Finite Repetition) - Finite reptition is implemented by buffer queueing. - - ]]> - - Annotation (Loop Control) - To implement a 3 stage "loop point" solution, the - application has to queue the FadeIn buffer first, - then queue the buffer it wants to loop, and set - LOOPING to TRUE once the FadeIn buffer has been - processed and unqueued. To fade from looping, the - application can queue a FadeOut buffer, then - set LOOPING to false on the PLAYING source. Alternatively, - the application can decide to not use the LOOPING - attribute at all, and just continue to queue the buffer - it wants repeated. - - ]]> - - Annotation (Rejected alternatives) - A finite loop counter was rejected because it is - ambiguous with respect to persistent (initial counter) - vs. transient (current counter). For similar reasons, - a Play-equivalent command with a (transient) loop counter - was rejected. - - ]]> -
- - - Current Buffer - - - Source BUFFER Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - BUFFER - &uint; - any valid bufferName - &NONE; - - - -
- Description: - Specifies the current Buffer object, making it the - head entry in the Source's queue. Using BUFFER on a - STOPPED or INITIAL Source empties the entire queue, - then appends the one Buffer specified. -
- - For a PLAYING or PAUSED Source, using the Source command - with BUFFER is an INVALID_OPERATION. - It can be applied to INITIAL and STOPPED Sources only. - Specifying an invalid bufferName will - result in an INVALID_VALUE error while specifying an - invalid sourceName results in an INVALID_NAME error. - - - NONE, i.e. 0, is a valid buffer Name. - Source( sName, BUFFER, 0 ) is a legal way to release the - current buffer queue on an INITIAL or STOPPED Source, - whether it has just one entry (current buffer) or more. - The Source( sName, BUFFER, NONE) call still causes an - INVALID_OPERATION for any source PLAYING or PAUSED, - consequently it cannot be abused to mute or stop a source. - - - Annotation (repeated Source+BUFFER does not queue) - Using repeated Source(BUFFER) calls to queue a buffer on - an active source would imply that there is no way to - release the current buffer e.g. by setting it to 0. - On the other hand read-only queues do not allow for - releasing a buffer without releasing the entire queue. - - We can not require BUFFER state to be transient and lost - as soon as a Source is implicitely or explicitely stopped. - This contradicts queue state being part of the Source's - configuration state that is preserved through Stop() - operations and available for Play(). - - ]]> - - -
- - - - Queue State Queries - - - BUFFERS_QUEUED Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - BUFFERS_QUEUED - &uint; - [0, any] - none - - - -
- Query only. Query the number of buffers in the queue - of a given Source. This includes those not yet played, - the one currently playing, and the ones that have been - played already. This will return 0 if the current and - only bufferName is 0. -
- - - - - BUFFERS_PROCESSED Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - BUFFERS_PROCESSED - &uint; - [0, any] - none - - - -
- Query only. Query the number of buffers that have - been played by a given Source. - Indirectly, this gives the index of the buffer - currently playing. Used to determine how much - slots are needed for unqueueing them. - On an STOPPED Source, all buffers are processed. - On an INITIAL Source, no buffers are processed, - all buffers are pending. - This will return 0 if the current and - only bufferName is 0. -
- - Annotation (per-Source vs. Buffer State) - BUFFERS_PROCESSED is only defined within the scope of a given - Source's queue. It indicates that the given number of buffer names - can be unqueued for this Source. It does not guarantee that the - buffers can safely be deleted or refilled, as they might still be - queued with other Sources. One way to keep track of this is to - store, per buffer, the Source for which a given buffer was most - recently scheduled (this will not work if Sources sharing buffers - might be paused by the application). If necessary an explicit - query for a given buffer name can be added in later revisions. - - ]]> - - Annotation (No Looping Queues) - Unqueueing requires nonzero BUFFERS_PROCESSED, - which necessitates no looping on entire queues, - unless we accept that no unqueueing is possible - from Source looping over the entire queue. - Currently not supported, as queueing is - primarily meant for streaming, which implies - unqueue-refill-requeue operations. - - ]]> - - -
- - - Bounds on Gain - - - Source Minimal Gain - - - - &Par; - &Sig; - &Val - &Def; - - - - - MIN_GAIN - f - 0.0f, (0.0f, 1.0f] - 0.0f - - - -
- Description: - MIN_GAIN is a scalar amplitude threshold. It indicates the minimal GAIN - that is always guaranteed for this Source. At the end of the processing - of various attenuation factors such as distance based attenuation and - Source GAIN, the effective gain calculated is compared to this value. - If the effective gain is lower than MIN_GAIN, MIN_GAIN is applied. - This happens before the Listener GAIN is applied. If a zero MIN_GAIN - is set, then the effective gain will not be corrected. -
- - - Annotation (Effective Maximal Distance) - By setting MIN_GAIN, the application implicitely defines a - maximum distance for a given distance attenuation model and - Source GAIN. The distance at which the effective gain is MIN_GAIN - can be used as a replacement to the DirectSound3D MAX_DISTANCE parameter. - Once the effective gain has reached the MIN_GAIN value, it will - no longer decrease with increasing distance. - - ]]> - - - - - Source Maximal Gain (logarithmic) - - - - &Par; - &Sig; - &Val - &Def; - - - - - MAX_GAIN - f - 0.0f, (0.0f, 1.0f] - 1.0f - - - -
- Description: - MAX_GAIN defines a scalar amplitude threshold. It indicates the maximal - GAIN permitted for this Source. At the end of the processing - of various attenuation factors such as distance based attenuation and - Source GAIN, the effective gain calculated is compared to this value. - If the effective gain is higher than MAX_GAIN, MAX_GAIN is applied. - This happens before the Listener GAIN is applied. If the Listener gain - times MAX_GAIN still exceeds the maximum gain the implementation can - handle, the implementation is free to clamp. If a zero MAX_GAIN - is set, then the Source is effectively muted. The implementation is free - to optimize for this situation, but no optimization is required or - recommended as setting GAIN to zero is the proper way to mute a Source. -
- - Annotation (Un-attenuated Source) - Setting MIN_GAIN and MAX_GAIN to the GAIN value will effectively - make the Source amplitude independent of distance. The - implementation is free to optimize for this situation. However, the - recommended way to accomplish this effect is using a ROLLOFF_FACTOR - of zero. - - ]]> - - - - Annotation (Internal GAIN threshold) - The &AL; implementation is free to use an internally chosen - threshold level below which a Source is ignored for mixing. - Reasonable choices would set this threshold low enough so - that the user will not perceive a difference. Setting MIN_GAIN - for a source will override any implementation defined test. - - ]]> -
- - - - - Distance Model Attributes - - - REFERENCE_DISTANCE Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - REFERENCE_DISTANCE - &float; - [0, any] - 1.0f - - - -
- This is used for distance attenuation calculations - based on inverse distance with rolloff. Depending - on the distance model it will also act as a distance - threshold below which gain is clamped. See the - section on distance models for details. -
- - - - - ROLLOFF_FACTOR Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - ROLLOFF_FACTOR - &float; - [0, any] - 1.0f - - - -
- This is used for distance attenuation calculations - based on inverse distance with rolloff. For - distances smaller than MAX_DISTANCE (and, depending - on the distance model, larger than REFERENCE_DISTANCE), - this will scale the distance attenuation over the - applicable range. See section on distance models for - details how the attenuation is computed as a function - of the distance. -
- - In particular, ROLLOFF_FACTOR can be set to zero for - those Sources that are supposed to be exempt from - distance attenuation. The implementation is encouraged - to optimize this case, bypassing distance attenuation - calculation entirely on a per-Source basis. - - - - - MAX_DISTANCE Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - MAX_DISTANCE - &float; - [0, any] - MAX_FLOAT - - - -
- This is used for distance attenuation calculations - based on inverse distance with rolloff, if the - Inverse Clamped Distance Model is used. In this case, - distances greater than MAX_DISTANCE will - be clamped to MAX_DISTANCE. - MAX_DISTANCE based clamping is applied before MIN_GAIN clamping, - so if the effective gain at MAX_DISTANCE is larger than MIN_GAIN, - MIN_GAIN will have no effect. No culling is supported. -
- - Annotation (No Culling) - This is a per-Source attribute supported for DS3D compatibility - only. Other API features might suffer from side effects due to - the clamping of distance (instead of e.g. clamping to an effective - gain at MAX_DISTANCE). - - ]]> - -
- - - - - - Frequency Shift by Pitch - - - Source PITCH Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - PITCH - f - (0.0f, 2.0f] - 1.0f - - - -
- Description: - Desired pitch shift, where 1.0 equals identity. Each reduction by 50 percent - equals a pitch shift of -12 semitones (one octave reduction). Zero is not - a legal value. -
-
- - - - Direction and Cone - - Each Source can be directional, depending on the settings for - CONE_INNER_ANGLE and CONE_OUTER_ANGLE. There are three zones - defined: the inner cone, the outside zone, and the transitional - zone in between. - The angle-dependent gain for a directional source is constant - inside the inner cone, and changes over the transitional zone - to the value specified outside the outer cone. - Source GAIN is applied for the inner cone, - with an application selectable CONE_OUTER_GAIN factor to - define the gain in the outer zone. In the transitional - zone implementation-dependent interpolation between - GAIN and GAIN times CONE_OUTER_GAIN is applied. - - - - Annotation (Interpolation Restrictions) - The specification does not specify the exact interpolation - applied in the transitional zone, to calculate gain as a - function of angle. The implementation is free to use - linear or other interpolation, as long as the values - are monotonically decreasing from GAIN to GAIN times CONE_OUTER_GAIN. - - ]]> - - - - - Source DIRECTION Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - DIRECTION - 3fv, 3f - any except NaN - { 0.0f, 0.0f, 0.0f } - - - -
- Description: - If DIRECTION does not equal the zero vector, the Source is directional. - The sound emission is presumed to be symmetric - around the direction vector (cylinder symmetry). Sources are not - oriented in full 3 degrees of freedom, only two angles are effectively - needed. -
- The zero vector is default, indicating that a Source is not directional. - Specifying a non-zero vector will make the Source directional. - Specifying a zero vector for a directional Source will effectively - mark it as nondirectional. - - - RFC: Oriented Sources - Do we want an alternative AZIMUTH/ALTITUDE parametrization? - Do we need ORIENTATION later? Is this superimposable? Can we mix both? - - ]]> - - Annotation (All Sources Directional) - From the point of view of the &AL; implementation, all - Sources are directional. Certain choices for cone angles - as well as a direction vector with zero length are treated - equivalent to an omnidirectional source. The &AL; - implementation is free to flag and optimize these cases. - - ]]> - - RFC: Separate GenDirectionSource? - Is there any risk that directional sources require different - resources that have to be allocated from the beginning, and - that we can not change an omnidirectional source to a - bidirectional source at runtime? - - ]]> - - - - - Source CONE_INNER_ANGLE Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - CONE_INNER_ANGLE - i,f - any except NaN - 360.0f - - - -
- Description: - Inside angle of the sound cone, in degrees. The default of 360 means that the - inner angle covers the entire world, which is equivalent to an omnidirectional - source. -
- RFC: inconsistent cone angles? - Is (inner <= outer) required? Do we generate an error? - Shouldn't this be a CONE_ANGLES 2f call specifying both angles at once? - - ]]> - - - - - - - Source CONE_OUTER_ANGLE Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - CONE_OUTER_ANGLE - i,f - any except NaN - 360.0f - - - -
- Description: Outer angle of the sound cone, in degrees. The default of 360 means that the - outer angle covers the entire world. If the inner angle is also 360, then - the zone for angle-dependent attenuation is zero. -
- - RFC: addition? - More generally, we could specify: - "If the sum of inner and outer angles is larger than 360, - CONE_OUTER_ANGLE is clamped to (360-CONE_INNER_ANGLE) and - there is no transition zone." - - ]]> - - - - Source CONE_OUTER_GAIN Attribute - - - - &Par; - &Sig; - &Val - &Def; - - - - - CONE_OUTER_GAIN - i,f - [0.0f, 1.0f] - 0.0f - - - -
- Description: the factor with which GAIN is multiplied to - determine the effective gain outside the cone defined by - the outer angle. The effective gain applied outside the - outer cone is GAIN times CONE_OUTER_GAIN. Changing - GAIN affects all directions, i.e. the source is attenuated - in all directions, for any position of the listener. - The application has to change CONE_OUTER_GAIN as well if - a different behavior is desired. -
- - - Annotation (GAIN calculation) - The angle-dependend gain DGAIN is multiplied with the - gain determined by the source's GAIN and any distance - attenuation as applicable. Let theta be the angle - between the source's direction vector, and the vector - connection the source and the listener. This multiplier - DGAIN is calculated as: - - OUTER = CONE_OUTER_ANGLE/2; - INNER = CONE_INNER_ANGLE/2; - if ( theta less/equal INNER ) - DGAIN = 1 - else if ( theta greater/equal OUTER ) - DGAIN = CONE_OUTER_GAIN - else - DGAIN = 1 - (1-CONE_OUTER_GAIN)*((theta-INNER)/(OUTER-INNER)) - GAIN *= DGAIN - - in the case of linear interpolation. The implementation - is free to use a different interplation across the (INNER,OUTER) - range as long as it is monotone. - - ]]> - - Annotation (CONE_OUTER_GAIN always less than GAIN) - CONE_OUTER_GAIN is not an absolute value, but (like all GAIN - parameters) a scaling factor. This avoids a possible error - case (implementations can count on effective gain outside the - outer cone being smaller than GAIN), and ensures the common - case in which changing GAIN should affect inner, transitional, - and outer zone simultaneously. - - In case that the application desires to have an outer zone - volume exceeding that of the inner cone, the mapping to - &AL; will require to rotate the Source direction to the - opposite direction (negate vector), and swapping - inner and outer angle. - - ]]> -
-
- - - - Changing Source Attributes - - The Source specifies the position and other properties as - taken into account during sound processing. - - void Source{n}{sifd} - &uint; sourceName - &enum; paramName - &type; value - - - void Source{n}{sifd}v - &uint; sourceName - &enum; paramName - &type;* values - - - - - - Querying Source Attributes - - Source state is maintained inside the &AL; implementation, and the - current attributes can be queried. The performance of such queries is - implementation dependent, no performance guarantees are made. The - valid values for the paramName parameter are identical to the ones - for Source*. - - void GetSource{n}{sifd}{v} - &uint; sourceName - &enum; paramName - &type;* values - - - - - Old signature: T GetSource{sifd}{v}( uint id, enum param ); - - ]]> - - - - - - - Queueing Buffers with a Source - - &AL; does not specify a built-in streaming mechanism. There - is no mechanism to stream data e.g. into a Buffer object. - Instead, the API introduces a more flexible and versatile - mechanism to queue Buffers for Sources. - - - There are many ways to use this feature, with - streaming being only one of them. - - - - Streaming is replaced by queuing static - buffers. This effectively moves any multi-buffer - caching into the application and allows the - application to select how many buffers it wants - to use, whether these are re-used in cycle, - pooled, or thrown away. - - - - - Looping (over a finite number of repititions) can be - implemented by explicitely repeating buffers - in the queue. Infinite loops can (theoretically) - be accomplished by sufficiently large repetition counters. - If only a single buffer is supposed to be repeated - infinitely, using the respective Source attribute is - recommended. - - - - - Loop Points for restricted looping inside a buffer - can in many cases be replaced by splitting the - sample into several buffers, queueing the sample - fragments (including repetitions) accordingly. - - - - Buffers can be queued, unqueued after they have been - used, and either be deleted, or refilled and queued again. - Splitting large samples over several buffers maintained - in a queue has a distinct advantages over approaches that - require explicit management of samples and sample indices. - - - RFC: Unified Handling - Jonathan Blow has proposed removing the distinction between - streaming and non-streaming buffers. An existing example is - the unified for directional and omnidirectional sources, where - all sources are treated as directional. - - ]]> - - - - Queueing command - - The application can queue up one or multiple buffer names - using SourceQueueBuffers. The buffers will be queued in the sequence - in which they appear in the array. - - &void; alSourceQueueBuffers - &uint; sourceName - &sizei; numBuffers - &uint; * bufferNames - - This command is legal on a Source in any state (to allow for - streaming, queueing has to be possible on a PLAYING Source). - Queues are read-only with exception of the unqueue operation. - The Buffer Name NONE (i.e. 0) can be queued. - - - Annotation (BUFFER vs. SourceQueueBuffers) - A Sourcei( sname, BUFFER, bname ) command is an immediate - command, and executed immediately. It effectively unqueues - all buffers, and then adds the specified buffer to the - then empty queue as its single entry. Consequently, this - call is only legal if SourceUnqueueBuffers is legal. - In particular, the Source has to be STOPPED or INITIAL. - The application is still obliged to delete all - buffers as were contained in the queue. - Sourcei( sname, BUFFER, NONE ) is a legal command, - effectively wiping the queue without specifying an - actually playable buffer. - - ]]> - - - Annotation (Buffer Repetition) - To accomplish a finite number of repetitions of a buffer name multiple times, - the buffer has to be queued multiple times. If the need occurs, the - API could be extended by SourceQueueBuffer( sname, bname, repetitions ) - call for brevity. - - ]]> - - RFC: Duration of bName==0? - The buffer is considered empty, it should have zero length, - thus zero duration for consistency. If an application wants to - schedule a pause, specifying duration for a gain==0 queue entry - might be a cleaner solution. - - ]]> - - - Annotation (Backwards Compatiblity) - Sourcei( sname, BUFFER, bname ) has been rejected as - a queueing command, as it would make semantics dependent on - source state (queueing if PLAYING, immediate else). - The command is not legal on a PLAYING or PAUSED Source. - - ]]> - - Annotation (No BUFFER_QUEUE) - Duplication of one entry point is preferable to - duplicating token enums, and tokens do not express - commands, but specify the attribute/state affected. - From the same reason, there is no BUFFER_UNQUEUE - token-as-command. - - ]]> - - - - - Unqueueing command - - Once a queue entry for a buffer has been appended to a queue - and is pending processing, it should not be changed. - Removal of a given queue entry is not possible unless - either the Source is STOPPED (in which case then entire queue - is considered processed), or if the queue entry has already - been processed (PLAYING or PAUSED Source). - - - The Unqueue command removes a number of buffers entries that - have finished processing, in the order of appearance, from - the queue. The operation will fail if more buffers are - requested than available, leaving the destination arguments - unchanged. An INVALID_VALUE error will be thrown. - If no error, the destination argument will have been updated - accordingly. - - void SourceUnqueueBuffers - &uint; sourceName - &sizei; numEntries - &uint;* bufferNames - - - - Annotation (Unqueueing shared buffers) - If a buffer is queued with more than one source, it might have - been processed for some not all of them. With the current - interface, the application is forced to maintain its own list - of consumers (Sources) for a buffer it wishes to unqueue. - For groups of Sources that are never individually PAUSED - nor STOPPED, the application can save the MRU Source for - which the buffer was scheduled last. - - ]]> - - Annotation (Looping a Queue vs. Unqueue): - If a Source is playing repeatedly, it will traverse - the entire Queue repeatedly. Consequently, no buffer - in the queue can be considered processed until - there is no further repetition scheduled. - - ]]> - - Annotation (No Name based access) - No interface is provided to access a queue entry by name, - due to ambiguity (same buffer name scheduled several times - in a sequence). - - ]]> - - Annotation (No Index based access) - No interface is provided for random access to a queue entry - by index. - - ]]> - - - - - - More Annotation on Queueing - - Annotation (No Queue Copying) - The current queue of a source could be copied to another source, - as repetition and traversal parameters are stored unless the - queue entry is unqueued, or the queue is replaced using - AL_BUFFER. Copying a queue is a special case of - copying Source state in one sense, and a special case of - a synching problem in another. Due to these unresolved issues - no such command is included in the current specification. - To share queues, the application can keep buffer names - and the selected attributes that define the queue entries - in an array or other lookup table. - - ]]> - - Annotation (No Explicit QueueClear) - Sourcei( sname, BUFFER, NONE ) serves the - same purpose. The operation is also redundant - with respect to Unqueue for a STOPPED Source. - - ]]> - - Annotation (Queueing vs. AppendData): - Buffer queueing does not solve the synchronization and timing - issues raised by possible underflow, as these are inherent - to application-driven (pushed) streaming. However, it turns - an internal AL error condition (offset exceeds valid data) - into an audible artifact (Source stops). - Its main advantage is that it allows the application coder - to operate at a scale of her own choice, selecting the - number and size of buffers used for caching the stream, - and to schedule buffer refill and queueing according to - preferences and constraints. Queueing effectively moves - all problems related to replacing or appending Buffer data - to the scale of entire arrays istead of single samples and - indices. - - ]]> - - Annotation (Multiple Sources on a stream) - Queueing allows for the application to determine how much of - a backlog of the data stream is preserved. The application can - keep buffers, and queue them with other Sources after they have - been used already by the original Source. Unlike the mechanism - for appending data to a buffer, the backlog is visible to the - application and under its control, and no synchronization of - Sources using the stream is required. - - ]]> - - - - Annotation (Loop Points and Compressed Data) - For compressed data, uncompression by the application might be - impossible or undesireable. In consequence, splitting the sample - into several buffers is not possible without explicit support - by the API. Buffer-Buffer operations will be added as needed, - for the time being applications should not try to use compressed - samples if more than full looping is required. - - ]]> - - - - Annotation (No Explicit Queue Objects) - Explicit Queue objects have been considered and rejected, - as they introduce another producer-consumer dependency with - another level of indirection. Further, e.g. QUEUE would - also require deprecating BUFFER (breaking backwards - compatibility) as an alSource argument, or would introduce - a confusing set of precedence and overide rules if both - are used in sequence. However, in the absence of explicit - queue objects the application will be forced to keep track - where buffers have been queued in case it intends to - unqueue them for refill or deletion. If several sources - use the same buffers (e.g. for synchronous or - asynchronous streaming) the buffer will have to be - unqueued from each single one. - - ]]> - - - Annotation (Queue no Display List) - An interface resembling &OGL; display-lists has been - considered and rejected. The problem with this approach - is that not only commands would have to be prohibited - (similarly, not all GL calls are legal within a display - list), but also parameters (enumerations). - - In particular, only a small set of operations is meant - to be legal for a queue at this point, and appending - to a queue has to be possible at any time. - Within a hypothetical AL display list, only relative - timing/conditionals are allowed as arguments. This - might necessitate to have multiple forms for deferred - commands, or to not allow for absolute timing. - - Example: - - // lock this queue for overwriting/appending - alBeginQueue( qname, APPEND | REPLACE ); - - // queue a buffer in sequence, with parameters - // boolean: never skip? never bail? - alQueue( AL_BUFFER, bid, loopdir, repetitions ); - ... - - // end lock. - // Existing queue content will be replaced - // or appended at this point. - alEndQueue(); - - - ]]> - - - - Queue Then Delete - - - create source - queue buffer1 - queue buffer2 - queue buffer3 - play - request deletion of buffer1,2,3 - - - - ]]> - - - Queue and Refill with Dual Buffering - - - create source - fill buffer1 - queue buffer1 - play - fill buffer2 - queue buffer2 - check for unused buffers - unqueue buffer1 - fill buffer1 - queue buffer1 - ... - - - - ]]> - - - Queue for Loop Points - - - create source - read sample data - split sample data into pre/main/post - queue pre - queue main with repetitions - queue post - play - set repetitions to 0 on main when needed - wait till post has been played - - - - ]]> - - -]]> - - - Attributes Specific to Queueing - -
- Buffer Traversal - - The Buffer traversal attribute specifies the direction - in which the sample in the buffer is supposed to be - processed. To account for the 3 basic modes of traversal that - can be implemented in software and hardware, the following - tokens are defined: - - LOOP_DIRECTION /* traversal direction */ - - FORWARD /* linear forward (increment) */ - BACKWARD /* linear backward (decrement) */ - FORWARD_AND_BACK /* RESERVED: ping-pong-looping */ - - - The first and the next two tokens are legal with a buffer queue command. - They are not legal for a Source command, in any possible - Source state. The last token is reserved, but not yet legal to use. - - - - Annotation (Ping-Pong postponed) - Definition and implementation of ping-pong looping - has been postponed. Applications can fake it at doubling - memory expense by reverse copying the buffer (2nd buffer queued - or in a double size single buffer). If there is hardware support - for this feature, AL will have to support it eventually. A boolean - flag is not acceptable because of this possibility. - - ]]> - -]]> - - - - - - - - - - - Managing Source Execution - - The execution state of a source can be queried. &AL; provides - a set of functions that initiate state transitions causing - Sources to start and stop execution. - - - TBA: State Transition Diagram. - - - Annotation/ Source Config/Exec State - Sources have configuration state and execution state. - Configuration state is directly set by the application using - AL commands, starting with the INITIAL configuration. Execution - state (e.g. the offset to the current sample) is not under direct - application control and not exposed. - - ]]> - - - Source State Query - - The application can query the current state of any Source - using GetSource with the parameter Name SOURCE_STATE. - Each Source can be in one of four possible execution states: - INITIAL, PLAYING, PAUSED, STOPPED. Sources that are either - PLAYING or PAUSED are considered active. Sources that are - STOPPED or INITIAL are considered inactive. Only PLAYING - Sources are included in the processing. The implementation - is free to skip those processing stages for Sources that - have no effect on the output (e.g. mixing for a Source - muted by zero GAIN, but not sample offset increments). - Depending on the current state of a Source certain (e.g. repeated) - state transition commands are legal NOPs: they will be ignored, - no error is generated. - - - - - State Transition Commands - - The default state of any Source is INITIAL. From this state - it can be propagated to any other state by appropriate use - of the commands below. There are no irreversible state - transitions. - - void SourcePlay - &uint; sName - - - void SourcePause - &uint; sName - - - void SourceStop - &uint; sName - - - void SourceRewind - &uint; sName - - - - - - The functions are also available as a vector variant, - which guarantees synchronized operation on a set of - Sources. - - void SourcePlayv - &sizei; n - &uint;* sNames - - - void SourcePausev - &sizei; n - &uint;* sNames - - - void SourceStopv - &sizei; n - &uint;* sNames - - - - void SourceRewindv - &sizei; n - &uint;* sNames - - - - - The following state/command/state transitions are defined: - - - - Play() applied to an INITIAL Source will promote the Source - to PLAYING, thus the data found in the Buffer will be fed - into the processing, starting at the beginning. - Play() applied to a PLAYING Source will restart the Source - from the beginning. It will not affect the configuration, - and will leave the Source in PLAYING state, but reset the - sampling offset to the beginning. - Play() applied to a PAUSED Source will - resume processing using the Source state - as preserved at the Pause() operation. - Play() applied to a STOPPED Source will propagate it - to INITIAL then to PLAYING immediately. - - - - - Pause() applied to an INITIAL Source is a legal NOP. - Pause() applied to a PLAYING Source will change its state to - PAUSED. The Source is exempt from processing, its current - state is preserved. - Pause() applied to a PAUSED Source is a legal NOP. - Pause() applied to a STOPPED Source is a legal NOP. - - - - - Stop() applied to an INITIAL Source is a legal NOP. - Stop() applied to a PLAYING Source will change its state to - STOPPED. The Source is exempt from processing, its current - state is preserved. - Stop() applied to a PAUSED Source will change its state - to STOPPED, with the same consequences as on a PLAYING - Source. - Stop() applied to a STOPPED Source is a legal NOP. - - - - - Rewind() applied to an INITIAL Source is a legal NOP. - Rewind() applied to a PLAYING Source will change its state to - STOPPED then INITIAL. The Source is exempt from processing: - its current state is preserved, with the exception of the - sampling offset, which is reset to the beginning. - Rewind() applied to a PAUSED Source will change its state - to INITIAL, with the same consequences as on a PLAYING - Source. - Rewind() applied to a STOPPED Source promotes the Source - to INITIAL, resetting the sampling offset to the beginning. - - - - - - Annotation (SourceNext) - The specification does not provide any means to - immediately skip from the current Buffer to the - next in the queue. A conditional stop (following - the next complete traversal) is available. - If necessary an additonal entry point could be - provided in future revisions. - - ]]> - - Annotation (Rewind() optional) - The INITIAL state is not identical to the STOPPED state. - Applications that want to verify whether a Source - has indeed been PLAYING before becoming STOPPED can - use Rewind() to reset the Source state to INITIAL. - This is an optional operation that can safely be - omitted by application without this constraint. - Applications that want to guard against Play() on - a Source that is INITIAL can query the Source state - first. - - ]]> - - Annotation (Play() on a PLAYING Source) - Repeated Play() commands applied a PLAYING Source are - interpreted as an (atomic) sequence to stop and restart a - Source. This can be used by applications that want to restart - a sound but do not care whether the Source has finished or not, - and do not want an audible pause. One example is the DOOM - chaingun repeatedly abbreviating the pistol sound. To guard - against redundant Play() commands, an application can query - the current state before executing Play(). If the application - coder wants to be sure that the Source will play the buffer - again, she can either increment PLAY_COUNT, or queue the buffer. - - ]]> - - Annotation (redundant commands) - The simple variant (e.g. SourcePlay) is redundant to - the vector variant (e.g. SourcePlayv). However, these - calls will be used frequently, and the simple variant - is provided for convenience. However, &AL; does not - enable applications to use literals as source names. - - ]]> - - - - - Resetting Configuration - - The INITIAL state is not necessarily identical to the - default state in which Source is created. INITIAL merely - indicates that the Source can be executed using the - SourcePlay command. A STOPPED or INITIAL Source can - be reset into the default configuration by using a - sequence Source commands as necessary. As the application - has to specify all relevant state anyway to create a - useful Source configuration, no reset command is provided. - - - - RFC: remove INITIAL - INITIAL is identical to STOPPED. The only additional information - conveyed is that INITIAL indicates a source has never been played. - Once a Source is STOPPED, it is not possible by state query alone - to decide whether it has played again. If Sources are used only - once, an application can use INITIAL to verify a Source has been - played. - The problem that I have with this is that if we acknowledge that - the application might need to verify a Source has played once, - why force the application to throw away Sources to accomplish - this? An explicit state PLAYABLE replacing INITIAL and its - inauspicious connotations (default state) and a state transition - function Rewind() that makes a STOPPED Source PLAYABLE again would - be one possibility to address this need. The obvious drawback is - that it breaks backwards compatibility. - - ]]> - - - RFC: state issues - A Source is active if it is PAUSED or PLAYING. - - A Source that is STOPPED preserves configuration state, - including buffer/queue information. - - Only a Source that is Reset() to INITIAL looses all - buffer and queue information. In this case, the INITIAL - - Sources will be stopped implicitely when reaching the - end of a non-repeating (non-looping) buffer traversal. - Sources can be stopped explicitely by the application - with either Stop() or Reset(). - - Stop() propagates - the source to STOPPED preserving its configuration state, - setting its execution state to the same as if it reached - the end of execution. - - - ]]> - - - Annotation (illegal NOPs) - In the current specification there are no illegal NOPs. - In other words, no sequence of commands affecting the - execution state will generate an INVALID_OPERATION error. - - ]]> - - - RFC/bk000504: - No UNDEFINED state. Always valid state. I.e. we have a default Buffer - that is used for sources where the application doesn't specify, - and what's in it? Default gain is zero? We need to specify - INITIAL. - - - RFC/bk000504: - Potential ambiguity: how to we distinguish STOPPED as - requested by the application from INACTIVE for - non-looping sounds once the buffer has been iterated? - Related: handling of Sources using an underflowing - streaming buffer? IMO not recommended, make this - undefined on error. - - - - RFC/bk000504: - Possible redundancy: the only reason for STOP seems to - be resetting the play positions. Redundant if we - ever manipulate offsets directly (rewind/set). - - - RFC/bk000504: - Possible redundancy: - If we ever want to support explicit setting of the start - position/offset into Buffer, START is equivalent to Set(0). - Also see LOOP (implies has to be STOPPED). Fade-Out and - Fade-In control - always manually? - - - ]]> - - - - - - diff --git a/neo/openal/docs/chp-state.sgml b/neo/openal/docs/chp-state.sgml deleted file mode 100644 index 8175a363..00000000 --- a/neo/openal/docs/chp-state.sgml +++ /dev/null @@ -1,730 +0,0 @@ - - - State and State Requests - - The majority of &AL; state is associated with individual &AL; objects, - and has to be set and queried referencing the objects. However, some - state - e.g. processing errors - is - defined context specific. &AL; has global state that affects all - objects and processing equally. This state is set using a variety - of functions, and - can be queried using query functions. The majority of queries - has to use the interface described in "Simple Queries". - - - - - Querying &AL; State - - - - Simple Queries - - Like &OGL;, &AL; uses a simplified interface for querying global - state. The following functions accept a set of enumerations. - - void GetBooleanv - &enum; paramName - &bool;* dest - - - - void GetIntegerv - &enum; paramName - ∫* dest - - - - void GetFloatv - &enum; paramName - &float;* dest - - - - void GetDoublev - &enum; paramName - &double;* dest - - Legal values are e.g. DOPPLER_FACTOR, DOPPLER_VELOCITY, DISTANCE_MODEL. - - - NULL destinations are quietly ignored. INVALID_ENUM is the - response to errors in specifying paramName. The amount of memory - required in the destination depends on the actual state requested. - Usually, state variables are returned in only one or some of the - formats above. - - - To query state controlled by Enable/Disable there is an additional - IsEnabled function defined (see "Controlling &AL; Execution"). - - - - - - Data Conversions - - If a Get command is issued that returns value types different from - the type of the value being obtained, a type converswion is - performed. If GetBooleanv is called, a floating-point or integer - value converts to FALSE if and only if it is zero (otherwise - it converts to TRUE). If GetIntegerv is called, a boolean value - is interpreted as either 1 or 0, and a floating-point value is - rounded to the nearest integer. If GetFloatv is called, a boolean - value is interpreted as either 1.0 or 0.0, an integer is - coerced to floating point, and a double-presicion foating-point - value is converted to single precision. Analogous conversions are - carried out in the case of GetDoublev. If a value is so large - in magnitude that it cannot be represented with the requested - type, then the nearest value is representable using the requested - type is returned. - - Annotation (Query of Modes) - Modes (e.g. the current distance model) can be queried - using the respective tokens. The recommended query - command is GetIntegerv. - - ]]> - - - - - String Queries - - The application can retrieve state information global to the current - &AL; Context. GetString will return a pointer to a constant string. - Valid values for param are VERSION, RENDERER, VENDOR, and EXTENSIONS, - as well as the error codes defined by &AL;. The application can - use GetString to retrieve a string for an error code. - - const &ubyte;* GetString - &enum; paramName - - - - - - - - Time and Frequency - - By default, &AL; uses seconds and Hertz as units for - time and frequency, respectively. - A float or integral value of one - for a variable that specifies quantities like duration, - latency, delay, or any other parameter measured as time, - specifies 1 second. - For frequency, the basic unit is 1/second, or Hertz. - In other words, sample frequencies and frequency - cut-offs or filter parameters specifying frequencies - are expressed in units of Hertz. - - - RFC: Query and Factor? - Will time be an &AL; state that can be queried and scaled? - &AL; usually (always) implements a real-time - process with the constraint that it has to be - synchronized with the time as experienced by the user. - Do the units used with respect to time and frequency have - a fixed meaning? - - ]]> - - RFC: Setting Time/Long - Given a frequency range from a few Hz to 50kHz or more, - we need a temporal resolution of 20 microseconds or less. - For simplicity that means we either resolve Milliseconds - and loose precision, or we resolve microseconds. - Applications might run hours or days, which is 10E5 seconds - or more. If we cover 12 orders of magnitude (10E6 to 10E-6) - 32bit unsigned integer will not suffice. Do we introduce - a 64 signed integer for the purpose of specifying time - over a duration of several days at microseconds resolution, - or do we use two 32bit integers, and how do we split them? - - ]]> - - RFC: Duration Query - - The application might want to cull Sources based on - how many milliseconds are left for their current buffer - or queue (either to stop those that will stop soon - anyway, or to stop those that will take too long, - depending). - - - We need to divorce sample (memory) count from duration, - because of compression and differences between - internal and external sample format. - - - Duration can be queried in microsecond resolution in - case we want to account for O(10Khz) sampling - frequencies properly, or milliseconds if we - do not anticipate the need to go beyond typical - operating system time resolution. - - - We need query as double, float, and possibly - long (as of now an undefined data type). - We might need an INVALID_RANGE error on the getter, - especially if large reptition counters can be set. - For paused source, the remainder will be the same - as for playing sources. The application can query - the Source State to find out the additional - information. INFINITE is not needed, - no is UNKNOWN as we operate on known - queues. - - ]]> - - Annotation (Buffer vs. Queue Duration) - Sourcel( sName , REMAINDER, &rem ) queries the remainder - for the current buffer (zero if the Source is STOPPED, - duration of the first buffer if the source is INITIAL). - Sourcel( sName, REMAINDER_QUEUE, &rem ) queries the remainder - of the entire queue. - A STOPPED Source has remainder==0. - An INITIAL Source has full remainder. - - ]]> - - - Annotation (DURATION vs. REMAINDER) - DURATION is a buffer attribute independent of - execution state. REMAINDER is a Source attribute - that encapsulates part of the execution state. - Sources and Buffers should not share these attributes: - there is no Buffer REMAINDER and no Source DURATION. - - ]]> - ]]> - - - - - - - Space and Distance - - &AL; does not define the units of measurement for distances. - The application is free to use meters, inches, or parsecs. - &AL; provides means for simulating the natural attenuation - of sound according to distance, and to exagerate or reduce - this effect. However, the resulting effects do not depend on - the distance unit used by the application to express source - and listener coordinates. &AL; calculations are scale - invariant. - - - The specification assumes Euclidean calculation of - distances, and mandates that if two Sources are - sorted with respect to the Euclidean metric, the - distance calculation used by the implementation has - to preserve that order. - - - Annotation (No DistanceFactor) - &AL; does not provide a global, per Context DISTANCE_FACTOR, - as all calculations are scale invariant. - - ]]> - - Annotation (Distance Calculations) - The specification does not enforce that distances - are calculated using the euclidean norm, to permit - using computationally cheaper approximations. - Implementations that opt to use approximations - might cause audible artifacts. The specification does - not enforce any upper limits on distance calculation - errors yet. - - ]]> - - RFC: Limiting Errors - Do we limit permissible errors on distance or gain - calculations? How much quality - and accuracy do we expect from conformant implementations? - - ]]> - - - Annotation (DS3D DistanceFactor) - The DS3D documentation explicitely states that the default - unit is 1 meter. &AL; does not specify any units. - &AL; calculations are scale invariant. The main purpose - of the DS3D DistanceFactor (modifying Doppler Shift - by scaling velocity but not reference velocity) is - accomplished using DOPPLER_VELOCITY in &AL;. &AL; - does not have an equivalent to A3D's SetUnitsPerMeter - either. - - - ]]> - - - - - - - Attenuation By Distance - - Samples usually use the entire dynamic range of the - chosen format/encoding, independent of their real world - intensity. In other words, a jet engine and a clockwork - both will have samples with full amplitude. The application - will then have to adjust Source GAIN accordingly to account - for relative differences. - - - Source GAIN is then attenuated by distance. - The effective attenuation of a Source depends on many - factors, among which distance attenuation and source - and Listener GAIN are only some of the contributing - factors. Even if the source and Listener GAIN exceed 1.0 - (amplification beyond the guaranteed dynamic range), - distance and other attenuation might ultimately limit - the overall GAIN to a value below 1.0. - - - &AL; currently supports three modes of operation - with respect to distance attenuation. It supports - two distance-dependent attenuation models, including one - that is similar to the IASIG I3DL2 (and DS3D) model. - The application chooses one of these two models (or - chooses to disable distance-dependent attenuation) - on a per-context basis. - - void DistanceModel - &enum; modelName - - Legal arguments are NONE, INVERSE_DISTANCE, and - INVERSE_DISTANCE_CLAMPED. NONE bypasses all distance - attenuation calculation for all Sources. The implementation - is expected to optimize this situation. INVERSE_DISTANCE_CLAMPED - is the DS3D model, with REFERENCE_DISTANCE indicating both the - reference distance and the distance below which gain will - be clamped. INVERSE_DISTANCE is equivalent to the DS3D model - with the exception that REFERENCE_DISTANCE does not imply any - clamping. The &AL; implementation is still free to apply - any range clamping as necessary. The current distance model - chosen can be queried using GetIntegerv and DISTANCE_MODEL. - - - Annotation (Inverse Square Law) - The "inverse square law" used in physics applies to sound - intensity (energy), which is proportional to the square - of linear gain (amplitude). Thus the inverse distance model - describes a physically correct inverse square behavior - if ROLLOFF_FACTOR is set to 1.0. - - ]]> - - Annotation (Enable/Disable Attenuation) - As ROLLOFF_FACTOR is a per-Source attribute, setting it to zero - can not be used to globally enable or disable distance - attenuation, which (e.g. when using tables) can be resource - intensive. Using Enable/Disable/IsEnabled with a DISTANCE_ATTENUATION - token is redundant with respect to the possibility that support - for different distance models might be desired at a later time. - - ]]> - - - - Inverse Distance Rolloff Model - - The following formula describes the distance attenutation - defined by the Rolloff Attenutation Model, as logarithmic - calculation. - - - G_dB = GAIN - 20*log10(1 + ROLLOFF_FACTOR*(dist-REFERENCE_DISTANCE)/REFERENCE_DISTANCE ); - G_dB = min(G_dB,MAX_GAIN); - G_dB = max(G_dB,MIN_GAIN); - - - The REFERENCE_DISTANCE parameter used here is a per-Source attribute - that can be set and queried using the REFERENCE_DISTANCE token. - REFERENCE_DISTANCE is the distance at which the Listener will - experience GAIN (unless the implementation had to clamp effective - GAIN to the available dynamic range). - ROLLOFF_FACTOR is per-Source parameter the application can use - to increase or decrease the range of a source by decreasing - or increasing the attenuation, respectively. The default value - is 1. The implementation is free to optimize for a - ROLLOFF_FACTOR value of 0, which indicates that the application - does not wish any distance attenuation on the respective Source. - - - Annotation (Linear Calculation) - The logarithmic formula above is equivalent to - - G = gain_linear / ( 1 + ROLLOFF_FACTOR*((dist-REFERENCE_DISTANCE)/REFERENCE_DISTANCE) ); - G = min(G,max_gain_linear); - G = max(G,min_gain_linear); - - with linear gains calculated from the logarithmic GAIN, - MIN_GAIN, MAX_GAIN accordingly. - By means of explanation: linear GAIN is applied to the sample, which describes - an amplitude ultimately (DAC) converted into voltage. The actual power of the - signal is proportional to the square of the amplitude (voltage). Logarithmic - measurement is done by comparing the actual power with a reference value, - i.e. the power (e.g in Watt) at the reference distance. The original Bel unit - of measure (named after Alexander Graham Bell) was defined to account for the - logarithmic response of the human ear: our subjective impression of "loudness" - is not linear in the power of the acoustic signal. For practical purposes (range - of volumes the human ear can handle) the deciBel (dB) is a better unit: - - dB = 10 * log( P/P0 ) = 10 * log( sqr(A/A0 ) = 20 * log( A/A0 ) - - Common power/amplitude ratios and attenuations per distance are: - - Logarithmic Scale and Gain - - - - Distance - Attenuation - Power Ratio - Amplitude Ratio - - - - - REF - 0dB - 1:1 - 1:1 - - - 2*REF - -6dB - 1:4 - 1:2 - - - 4*REF - -12dB - 1:16 - 1:4 - - - 8*REF - -18dB - 1:64 - 1:8 - - - 0.5*REF - 6dB - 2:1 - 4:1 - - - 0.25*REF - 12dB - 4:1 - 16:1 - - - - -
- The logarithmic gain will drop from zero (linear gain 1) to negative infinity - (approaching linear gain 0). A linear gain of zero can not be represented - logarithmically. Any doubling of the reference distance will add another - -6dB (i.e. 6dB of attenuation). This approximates an inverse square law falloff - of signal power with distance, as long as the distance exceeds the reference - distance. -
- ]]> - - Annotation (Rolloff quantization) - Implementations that use lookup tables to speed up - distance attenuation calculation may opt to map - ROLLOFF_FACTOR to a limited set of internally used - values, to minimize expense of per-Source calculations - and setup/memory costs. - - ]]> - - Annotation (Gain Clamping) - In the absence of user MIN_GAIN and MAX_GAIN selections, - clamping is implied by implementation constraints, and - clamping behavior might change. - The &AL; implementation should not clamp intermediate - values of effective gain to unit range. - Any clamping, if necessary, should be applied at the latest - possible stage. In other words, GAIN>1 is perfectly - valid as the implementation is free to clamp the value as - needed for maximum mixing accuracy and to account for the - actual dynamic range of the output device. - - ]]> - - - Annotation (Extended Dynamic Range) - For applications that - change GAIN but do not want to adjust ROLLOFF_FACTOR - and REFERENCE_DISTANCE to account for different ranges, - the separation in this distance model might allow for - more intuitive adjustments: - If we put a damper on the jet engine by lowering GAIN, - we still want the listener to perceive the full volume, - but now at a closer distance, without changing the - reference distance. - - ]]> -
- - - Inverse Distance Clamped Model - - This is essentially the Inverse Distance model, - extended to guarantee that for distances below - REFERENCE_DISTANCE, gain is clamped. This mode - is equivalent to the IASIG I3DL2 (and DS3D) distance - model. - - dist = max(dist,REFERENCE_DISTANCE); - dist = min(dist,MAX_DISTANCE); - G_dB = GAIN - 20*log10(1 + ROLLOFF_FACTOR*(dist-REFERENCE_DISTANCE)/REFERENCE_DISTANCE ) - G_dB = min(G_dB,MAX_GAIN); - G_dB = max(G_dB,MIN_GAIN); - - - - - Annotation (DS3D MIN_DISTANCE) - The DS3D attenuation model is extended by an explicit - clamping mechanism. REFERENCE_DISTANCE is equivalent - to DS3D MIN_DISTANCE if the INVERSE_DISTANCE_CLAMPED - mode is used. - - ]]> - - Annotation (High Frequency Rolloff) - To simulate different atmospheric conditions, a frequency - dependent attenuation is used in A3D and EAX. - At this time &AL; does not have a mechanism to specify - lowpass filtering parameterized by distance. - - ]]> - -
- - - - Evaluation of Gain/Attenuation Related State - - While amplification/attenuation commute (mulplication of - scaling factors), clamping operations do not. The order - in which various gain related operations are applied is: - Distance attenuation is calculated first, including - minimum (REFERENCE_DISTANCE) and maximum (MAX_DISTANCE) - thresholds. If the Source is directional (CONE_INNER_ANGLE - less than CONE_OUTER_ANGLE), an angle-dependent attenuation - is calculated depending on CONE_OUTER_GAIN, and multiplied - with the distance dependent attenuation. - The resulting attenuation factor for the given angle and - distance between Listener and Source is multiplied - with Source GAIN. The effective GAIN computed this way - is compared against MIN_GAIN and MAX_GAIN thresholds. - The result is guaranteed to be clamped to [MIN_GAIN, MAX_GAIN], - and subsequently multiplied by Listener GAIN which serves - as an overall volume control. The implementation is free - to clamp Listener GAIN if necessary due to hardware or - implementation constraints. - - - - - - - No Culling By Distance - - With the DS3D compatible Inverse Clamped Distance Model, - &AL; provides a per-Source MAX_DISTANCE attribute - that can be used to define a distance beyond which the Source will - not be further attenuated by distance. - The DS3D distance attenuation model and its clamping of volume - is also extended by a mechanism to cull (mute) sources from proccessing, - based on distance. However, &AL; does not - support culling a Source from processing based on a distance - threshold. - - - At this time &AL; is not meant to support culling at all. Culling - based on distance, or bounding volumes, or other criteria, is best - left to the application. For example, the application might - employ sophisticated techniques to determine whether sources - are audible that are beyond the scope of &AL;. In particular, - rule based culling inevitably introduces acoustic artifacts. - E.g. if the Listener-Source distance is nearly equal to the - culling threshold distance, but varies above and below, there - will be popping artifacts in the absence of hysteresis. - - - Annotation (No MAX_DISTANCE plus MUTE) - &AL; does support the AUDIBLE mode with MAX_DISTANCE (clamping), - but does not support culling. Applications that employ this - DS3D feature will have to perform their own distance calculation - and mute the source (Source GAIN equals zero) as desired. - - ]]> - - RFC: DS3D-like Extension - For ease of portability, should we define an Extension that - provides MAX_DISTANCE for MUTE mode? - - ]]> - - - - - - NO Sound Propagation Speed - - &AL; implementations can choose to model sound propagation with - limited speed for certain effects, e.g. early reflections. - In addition, the Doppler Effect is defined with respect to the - speed of sound in the predominant medium. The application can - set the speed of sound as a scalar value. The speed is defined - with respect to the scaled unit. If D I S T A N C E _ S C A L E is changed, - this will affect both the distance and the propagation speed, - leaving the propagation time unaffected. - - void PropagationSpeed - &float; propSpeed - - - - A negative scale will result in an INVALID_VALUE error, the - command is then ignored. The default value is 1. The current - setting can be queried using GetFloatv and PROPAGATION_SPEED. - - - ]]> - - - Velocity Dependent Doppler Effect - - The Doppler Effect depends on the velocities of Source and - Listener relative to the medium, and the propagation speed - of sound in that medium. The application might want to - emphasize or de-emphasize the Doppler Effect as physically - accurate calculation might not give the desired results. The - amount of frequency shift (pitch change) is proportional - to the speed of listener and source along their line of - sight. The application can increase or decrease that - frequency shift by specifying the scaling factor &AL; - should apply to the result of the calculation. - - - The Doppler Effect as implemented by &AL; is described - by the formula below. Effects of the medium (air, water) - moving with respect to listener and source are ignored. - DOPPLER_VELOCITY is the propagation speed relative to - which the Source velocities are interpreted. - - VD: DOPPLER_VELOCITY - DF: DOPPLER_FACTOR - vl: Listener velocity (scalar, projected on source-listener vector) - vs: Source velocity (scalar, projected on source-listener vector) - f: Frequency of sample - f': effective Doppler shifted frequency - - f' = DF * f * (VD-vl)/(VD+vs) - - vl<0, vs>0 : source and listener approaching each other - vl>0, vs<0 : source and listener moving away from each other - - The implementation has to clamp the projected Listener - velocity vl, if abs(vl) is greater or equal to VD. It similarly has to - clamp the projected Source velocity vs if abs(vs) is greater or equal - to VD. - - - There are two API calls global to the current context that provide - control of the two related parameters. DOPPLER_FACTOR is a simple - scaling to exaggerate or deemphasize the Doppler (pitch) shift - resulting from the calculation. - - void DopplerFactor - &float; dopplerFactor - - A negative value will result in an INVALID_VALUE error, the - command is then ignored. The default value is 1. The current - setting can be queried using GetFloatv and DOPPLER_FACTOR. - The implementation is free to optimize the case of DOPPLER_FACTOR - being set to zero, as this effectively disables the effect. - - - Annotation (No Enable) - There is currently no mechanism to switch on/off Doppler - calculation using e.g. a DOPPLER_SHIFT token and Enable/Disable. - For the time being, DopplerFactor(0) may be used to signal - to the implementation that no Doppler Effect calculation is - required. - - ]]> - - - DOPPLER_VELOCITY allows the application to change the - reference (propagation) velocity used in the Doppler Effect - calculation. This permits the application to use a velocity - scale appropriate to its purposes. - - void DopplerVelocity - &float; dopplerVelocity - - A negative or zero value will result in an INVALID_VALUE error, and the - command is ignored. The default value is 1. - The current setting can be queried using GetFloatv and DOPPLER_VELOCITY. - - - Annotation (No Sideeffects on Delay) - To permit independent control of Doppler Effect as opposed - to other, sound wave propagation related effects (delays, - echos, reverberation), DOPPLER_VELOCITY is not taken into - account for any other calculation than Doppler Shift. - - ]]> - - Annotation (SetUnitsPerMeter) - DOPPLER_VELOCITY accomplishes the purposes of DS3D - scaling parameters in a straightforward way, without - introducing the undesirable connotations of real world - units. - - ]]> - - -
- diff --git a/neo/openal/docs/ent-examples.sgml b/neo/openal/docs/ent-examples.sgml deleted file mode 100644 index 24957738..00000000 --- a/neo/openal/docs/ent-examples.sgml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/neo/openal/docs/ent-extensions.sgml b/neo/openal/docs/ent-extensions.sgml deleted file mode 100644 index c4acd939..00000000 --- a/neo/openal/docs/ent-extensions.sgml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/neo/openal/docs/ent-marks-annotated.sgml b/neo/openal/docs/ent-marks-annotated.sgml deleted file mode 100644 index 2cbe4d35..00000000 --- a/neo/openal/docs/ent-marks-annotated.sgml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/neo/openal/docs/ent-marks-full.sgml b/neo/openal/docs/ent-marks-full.sgml deleted file mode 100644 index eb5515ac..00000000 --- a/neo/openal/docs/ent-marks-full.sgml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/neo/openal/docs/ent-marks-reference.sgml b/neo/openal/docs/ent-marks-reference.sgml deleted file mode 100644 index bb34d5e5..00000000 --- a/neo/openal/docs/ent-marks-reference.sgml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/neo/openal/docs/ent-marks-specification.sgml b/neo/openal/docs/ent-marks-specification.sgml deleted file mode 100644 index f68660ae..00000000 --- a/neo/openal/docs/ent-marks-specification.sgml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/neo/openal/docs/ent-names.sgml b/neo/openal/docs/ent-names.sgml deleted file mode 100644 index 9da1b979..00000000 --- a/neo/openal/docs/ent-names.sgml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/neo/openal/docs/index.html b/neo/openal/docs/index.html deleted file mode 100644 index d4060d1c..00000000 --- a/neo/openal/docs/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Index - - - - -

Index

-

- This document has been removed. - See www.openal.org - for information. -

- - - - - - diff --git a/neo/openal/docs/oalspecs.sgml b/neo/openal/docs/oalspecs.sgml deleted file mode 100644 index fb8d3b3f..00000000 --- a/neo/openal/docs/oalspecs.sgml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - %Marks; - %Entities; - %Examples; - %Extensions; - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - &secBookInfo; - - - &chpIntroduction; - - - &chpOperation; - &chpState; - &chpRendering; - &chpBuffers; - &chpQueueing; - - - - &alcContext; - - - - &appConstants; - &appExtensions; - &appExtensionProcess; - - - - - - Main Document CVS Revision History - - CVS Document: $Id: oalspecs.sgml,v 1.15 2000/11/10 23:10:44 bk Exp $ - CVS Revision: $Revision: 1.15 $ - - $Log: oalspecs.sgml,v $ - Revision 1.15 2000/11/10 23:10:44 bk - Cleanup. - - Revision 1.14 2000/11/04 00:11:40 bk - Maintenance update - - Revision 1.13 2000/10/26 03:01:55 bk - Fixed typo for ALC entity. - - Revision 1.12 2000/10/26 02:59:46 bk - External entities. - - - -]]> - - - - - diff --git a/neo/openal/docs/sec-bookinfo.sgml b/neo/openal/docs/sec-bookinfo.sgml deleted file mode 100644 index 26b3b7a6..00000000 --- a/neo/openal/docs/sec-bookinfo.sgml +++ /dev/null @@ -1,53 +0,0 @@ - - - - &OAL; Specification and Reference - - - - Version 1.0 Draft - - June 2000 - - 1999-2000 - Loki Software - - - - - Permission is granted to make and distribute verbatim copies of this - manual provided the copyright notice and this permission notice are - preserved on all copies. - - - - - Permission is granted to copy and distribute translations of this - manual into another language, under the above conditions for modified - versions, except that this permission notice may be stated in a - translation approved by the copyright owners. - - - - UNIX is a trademark of X/Open Group. - X Window System is a trademark of X Consortium, Inc. - Linux is a trademark of Linus Torvalds. - Windows is a trademark of Microsoft Corp. - Macintosh and Apple are trademarks of Apple Computer, Inc. - Loki and &OAL; are trademarks of Loki Software, Inc. - All other trademarks are property of their respective owners. - - - - Draft document of &OAL; Specification. - - - - - - \ No newline at end of file diff --git a/neo/openal/docs/specification.html b/neo/openal/docs/specification.html deleted file mode 100644 index 0d51804b..00000000 --- a/neo/openal/docs/specification.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - -OpenAL Specification - - - - -

OpenAL Specification

-

- This document has been removed. - See Index - for the specification. -

- - - diff --git a/neo/openal/docs/white-paper.html b/neo/openal/docs/white-paper.html deleted file mode 100644 index 3c763541..00000000 --- a/neo/openal/docs/white-paper.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - OpenAL Whitepaper - - - -

OpenAL Whitepaper

-

- This document has been removed. - See Index - for the specification. -

- - - diff --git a/neo/openal/include/al.h b/neo/openal/include/al.h deleted file mode 100644 index 8c4f1202..00000000 --- a/neo/openal/include/al.h +++ /dev/null @@ -1,491 +0,0 @@ -#ifndef _AL_H_ -#define _AL_H_ - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ -#include "altypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - #ifdef _OPENAL32LIB - #define ALAPI __declspec(dllexport) - #else - #define ALAPI __declspec(dllimport) - #endif - #define ALAPIENTRY __cdecl - #define AL_CALLBACK -#else - #ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export on - #endif - #endif - #define ALAPI - #define ALAPIENTRY __cdecl - #define AL_CALLBACK -#endif - -#define OPENAL - -#ifndef AL_NO_PROTOTYPES - -/** - * OpenAL Maintenance Functions - * Initialization and exiting. - * State Management and Query. - * Error Handling. - * Extension Support. - */ - -/** State management. */ -ALAPI ALvoid ALAPIENTRY alEnable( ALenum capability ); -ALAPI ALvoid ALAPIENTRY alDisable( ALenum capability ); -ALAPI ALboolean ALAPIENTRY alIsEnabled( ALenum capability ); - -/** Application preferences for driver performance choices. */ -ALAPI ALvoid ALAPIENTRY alHint( ALenum target, ALenum mode ); - -/** State retrieval. */ -ALAPI ALboolean ALAPIENTRY alGetBoolean( ALenum param ); -ALAPI ALint ALAPIENTRY alGetInteger( ALenum param ); -ALAPI ALfloat ALAPIENTRY alGetFloat( ALenum param ); -ALAPI ALdouble ALAPIENTRY alGetDouble( ALenum param ); -ALAPI ALvoid ALAPIENTRY alGetBooleanv( ALenum param, ALboolean* data ); -ALAPI ALvoid ALAPIENTRY alGetIntegerv( ALenum param, ALint* data ); -ALAPI ALvoid ALAPIENTRY alGetFloatv( ALenum param, ALfloat* data ); -ALAPI ALvoid ALAPIENTRY alGetDoublev( ALenum param, ALdouble* data ); -ALAPI ALubyte* ALAPIENTRY alGetString( ALenum param ); - -/** - * Error support. - * Obtain the most recent error generated in the AL state machine. - */ -ALAPI ALenum ALAPIENTRY alGetError( ALvoid ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALboolean ALAPIENTRY alIsExtensionPresent( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALvoid* ALAPIENTRY alGetProcAddress( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the integer value of an enumeration (usually an extension) with the name ename. - */ -ALAPI ALenum ALAPIENTRY alGetEnumValue( ALubyte* ename ); - - - - -/** - * LISTENER - * Listener is the sample position for a given context. - * The multi-channel (usually stereo) output stream generated - * by the mixer is parametrized by this Listener object: - * its position and velocity relative to Sources, within - * occluder and reflector geometry. - */ - - - -/** - * - * Listener Environment: default 0. - */ -ALAPI ALvoid ALAPIENTRY alListeneri( ALenum param, ALint value ); - - -/** - * - * Listener Gain: default 1.0f. - */ -ALAPI ALvoid ALAPIENTRY alListenerf( ALenum param, ALfloat value ); - - -/** - * - * Listener Position. - * Listener Velocity. - */ -ALAPI ALvoid ALAPIENTRY alListener3f( ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); - - -/** - * - * Listener Position: ALfloat[3] - * Listener Velocity: ALfloat[3] - * Listener Orientation: ALfloat[6] (forward and up vector). - */ -ALAPI ALvoid ALAPIENTRY alListenerfv( ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY alGetListeneri( ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY alGetListenerf( ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY alGetListener3f( ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 ); -ALAPI ALvoid ALAPIENTRY alGetListenerfv( ALenum param, ALfloat* values ); - - -/** - * SOURCE - * Source objects are by default localized. Sources - * take the PCM data provided in the specified Buffer, - * apply Source-specific modifications, and then - * submit them to be mixed according to spatial - * arrangement etc. - */ - - - -/** Create Source objects. */ -ALAPI ALvoid ALAPIENTRY alGenSources( ALsizei n, ALuint* sources ); - -/** Delete Source objects. */ -ALAPI ALvoid ALAPIENTRY alDeleteSources( ALsizei n, ALuint* sources ); - -/** Verify a handle is a valid Source. */ -ALAPI ALboolean ALAPIENTRY alIsSource( ALuint id ); - -/** Set an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY alSourcei( ALuint source, ALenum param, ALint value ); -ALAPI ALvoid ALAPIENTRY alSourcef( ALuint source, ALenum param, ALfloat value ); -ALAPI ALvoid ALAPIENTRY alSource3f( ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); -ALAPI ALvoid ALAPIENTRY alSourcefv( ALuint source, ALenum param, ALfloat* values ); - -/** Get an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY alGetSourcei( ALuint source, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY alGetSourcef( ALuint source, ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY alGetSource3f( ALuint source, ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 ); -ALAPI ALvoid ALAPIENTRY alGetSourcefv( ALuint source, ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY alSourcePlayv( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY alSourcePausev( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY alSourceStopv( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n,ALuint *sources); - -/** Activate a source, start replay. */ -ALAPI ALvoid ALAPIENTRY alSourcePlay( ALuint source ); - -/** - * Pause a source, - * temporarily remove it from the mixer list. - */ -ALAPI ALvoid ALAPIENTRY alSourcePause( ALuint source ); - -/** - * Stop a source, - * temporarily remove it from the mixer list, - * and reset its internal state to pre-Play. - * To remove a Source completely, it has to be - * deleted following Stop, or before Play. - */ -ALAPI ALvoid ALAPIENTRY alSourceStop( ALuint source ); - -/** - * Rewinds a source, - * temporarily remove it from the mixer list, - * and reset its internal state to pre-Play. - */ -ALAPI ALvoid ALAPIENTRY alSourceRewind( ALuint source ); - - - -/** - * BUFFER - * Buffer objects are storage space for sample data. - * Buffers are referred to by Sources. There can be more than - * one Source using the same Buffer data. If Buffers have - * to be duplicated on a per-Source basis, the driver has to - * take care of allocation, copying, and deallocation as well - * as propagating buffer data changes. - */ - - - - -/** Buffer object generation. */ -ALAPI ALvoid ALAPIENTRY alGenBuffers( ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY alDeleteBuffers( ALsizei n, ALuint* buffers ); -ALAPI ALboolean ALAPIENTRY alIsBuffer( ALuint buffer ); - -/** - * Specify the data to be filled into a buffer. - */ -ALAPI ALvoid ALAPIENTRY alBufferData( ALuint buffer, - ALenum format, - ALvoid* data, - ALsizei size, - ALsizei freq ); - - -ALAPI ALvoid ALAPIENTRY alGetBufferi( ALuint buffer, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY alGetBufferf( ALuint buffer, ALenum param, ALfloat* value ); - - - - -/** - * Queue stuff - */ - -ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers( ALuint source, ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers( ALuint source, ALsizei n, ALuint* buffers ); - -/** - * Knobs and dials - */ -ALAPI ALvoid ALAPIENTRY alDistanceModel( ALenum value ); -ALAPI ALvoid ALAPIENTRY alDopplerFactor( ALfloat value ); -ALAPI ALvoid ALAPIENTRY alDopplerVelocity( ALfloat value ); - -#else /* AL_NO_PROTOTYPES */ - -/** - * OpenAL Maintenance Functions - * Initialization and exiting. - * State Management and Query. - * Error Handling. - * Extension Support. - */ - -/** State management. */ -ALAPI ALvoid ALAPIENTRY (*alEnable)( ALenum capability ); -ALAPI ALvoid ALAPIENTRY (*alDisable)( ALenum capability ); -ALAPI ALboolean ALAPIENTRY (*alIsEnabled)( ALenum capability ); - -/** Application preferences for driver performance choices. */ -ALAPI ALvoid ALAPIENTRY (*alHint)( ALenum target, ALenum mode ); - -/** State retrieval. */ -ALAPI ALboolean ALAPIENTRY (*alGetBoolean)( ALenum param ); -ALAPI ALint ALAPIENTRY (*alGetInteger)( ALenum param ); -ALAPI ALfloat ALAPIENTRY (*alGetFloat)( ALenum param ); -ALAPI ALdouble ALAPIENTRY (*alGetDouble)( ALenum param ); -ALAPI ALvoid ALAPIENTRY (*alGetBooleanv)( ALenum param, ALboolean* data ); -ALAPI ALvoid ALAPIENTRY (*alGetIntegerv)( ALenum param, ALint* data ); -ALAPI ALvoid ALAPIENTRY (*alGetFloatv)( ALenum param, ALfloat* data ); -ALAPI ALvoid ALAPIENTRY (*alGetDoublev)( ALenum param, ALdouble* data ); -ALAPI ALubyte* ALAPIENTRY (*alGetString)( ALenum param ); - -/** - * Error support. - * Obtain the most recent error generated in the AL state machine. - */ -ALAPI ALenum ALAPIENTRY (*alGetError)( ALvoid ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALboolean ALAPIENTRY (*alIsExtensionPresent)( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALvoid* ALAPIENTRY (*alGetProcAddress)( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the integer value of an enumeration (usually an extension) with the name ename. - */ -ALAPI ALenum ALAPIENTRY (*alGetEnumValue)( ALubyte* ename ); - - - - -/** - * LISTENER - * Listener is the sample position for a given context. - * The multi-channel (usually stereo) output stream generated - * by the mixer is parametrized by this Listener object: - * its position and velocity relative to Sources, within - * occluder and reflector geometry. - */ - - - -/** - * - * Listener Environment: default 0. - */ -ALAPI ALvoid ALAPIENTRY (*alListeneri)( ALenum param, ALint value ); - - -/** - * - * Listener Gain: default 1.0f. - */ -ALAPI ALvoid ALAPIENTRY (*alListenerf)( ALenum param, ALfloat value ); - - -/** - * - * Listener Position. - * Listener Velocity. - */ -ALAPI ALvoid ALAPIENTRY (*alListener3f)( ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); - - -/** - * - * Listener Position: ALfloat[3] - * Listener Velocity: ALfloat[3] - * Listener Orientation: ALfloat[6] (forward and up vector). - */ -ALAPI ALvoid ALAPIENTRY (*alListenerfv)( ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY (*alGetListeneri)( ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY (*alGetListenerf)( ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY (*alGetListener3f)( ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 ); -ALAPI ALvoid ALAPIENTRY (*alGetListenerfv)( ALenum param, ALfloat* values ); - - -/** - * SOURCE - * Source objects are by default localized. Sources - * take the PCM data provided in the specified Buffer, - * apply Source-specific modifications, and then - * submit them to be mixed according to spatial - * arrangement etc. - */ - - - -/** Create Source objects. */ -ALAPI ALvoid ALAPIENTRY (*alGenSources)( ALsizei n, ALuint* sources ); - -/** Delete Source objects. */ -ALAPI ALvoid ALAPIENTRY (*alDeleteSources)( ALsizei n, ALuint* sources ); - -/** Verify a handle is a valid Source. */ -ALAPI ALboolean ALAPIENTRY (*alIsSource)( ALuint id ); - -/** Set an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY (*alSourcei)( ALuint source, ALenum param, ALint value ); -ALAPI ALvoid ALAPIENTRY (*alSourcef)( ALuint source, ALenum param, ALfloat value ); -ALAPI ALvoid ALAPIENTRY (*alSource3f)( ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); -ALAPI ALvoid ALAPIENTRY (*alSourcefv)( ALuint source, ALenum param, ALfloat* values ); - -/** Get an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY (*alGetSourcei)( ALuint source, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY (*alGetSourcef)( ALuint source, ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY (*alGetSourcefv)( ALuint source, ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY (*alSourcePlayv)( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY (*alSourceStopv)( ALsizei n, ALuint *sources ); - -/** Activate a source, start replay. */ -ALAPI ALvoid ALAPIENTRY (*alSourcePlay)( ALuint source ); - -/** - * Pause a source, - * temporarily remove it from the mixer list. - */ -ALAPI ALvoid ALAPIENTRY (*alSourcePause)( ALuint source ); - -/** - * Stop a source, - * temporarily remove it from the mixer list, - * and reset its internal state to pre-Play. - * To remove a Source completely, it has to be - * deleted following Stop, or before Play. - */ -ALAPI ALvoid ALAPIENTRY (*alSourceStop)( ALuint source ); - - - -/** - * BUFFER - * Buffer objects are storage space for sample data. - * Buffers are referred to by Sources. There can be more than - * one Source using the same Buffer data. If Buffers have - * to be duplicated on a per-Source basis, the driver has to - * take care of allocation, copying, and deallocation as well - * as propagating buffer data changes. - */ - - - - -/** Buffer object generation. */ -ALAPI ALvoid ALAPIENTRY (*alGenBuffers)( ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY (*alDeleteBuffers)( ALsizei n, ALuint* buffers ); -ALAPI ALboolean ALAPIENTRY (*alIsBuffer)( ALuint buffer ); - -/** - * Specify the data to be filled into a buffer. - */ -ALAPI ALvoid ALAPIENTRY (*alBufferData)( ALuint buffer, - ALenum format, - ALvoid* data, - ALsizei size, - ALsizei freq ); - -ALAPI ALvoid ALAPIENTRY (*alGetBufferi)( ALuint buffer, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY (*alGetBufferf)( ALuint buffer, ALenum param, ALfloat* value ); - - - - -/** - * Queue stuff - */ -ALAPI ALvoid ALAPIENTRY (*alSourceQueueBuffers)( ALuint source, ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY (*alSourceUnqueueBuffers)( ALuint source, ALsizei n, ALuint* buffers ); - -/** - * Knobs and dials - */ -ALAPI ALvoid ALAPIENTRY (*alDistanceModel)( ALenum value ); -ALAPI ALvoid ALAPIENTRY (*alDopplerFactor)( ALfloat value ); -ALAPI ALvoid ALAPIENTRY (*alDopplerVelocity)( ALfloat value ); - -#endif /* AL_NO_PROTOTYPES */ - -#ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export off - #endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/include/alc.h b/neo/openal/include/alc.h deleted file mode 100644 index b7252c4f..00000000 --- a/neo/openal/include/alc.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef _ALC_H_ -#define _ALC_H_ - -#include "altypes.h" -#include "alctypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - #ifdef _OPENAL32LIB - #define ALCAPI __declspec(dllexport) - #else - #define ALCAPI __declspec(dllimport) - #endif - - typedef struct ALCdevice_struct ALCdevice; - typedef struct ALCcontext_struct ALCcontext; - - #define ALCAPIENTRY __cdecl -#else - #ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export on - #endif - #endif - #define ALCAPI - #define ALCAPIENTRY __cdecl -#endif - - - -#ifndef ALC_NO_PROTOTYPES - -ALCAPI ALCubyte* ALCAPIENTRY alcGetString(ALCdevice *device,ALCenum param); -ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALCsizei size,ALCint *data); - -ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(ALCubyte *deviceName); -ALCAPI ALCvoid ALCAPIENTRY alcCloseDevice(ALCdevice *device); - -ALCAPI ALCcontext*ALCAPIENTRY alcCreateContext(ALCdevice *device,ALCint *attrList); -ALCAPI ALCboolean ALCAPIENTRY alcMakeContextCurrent(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY alcProcessContext(ALCcontext *context); -ALCAPI ALCcontext*ALCAPIENTRY alcGetCurrentContext(ALCvoid); -ALCAPI ALCdevice* ALCAPIENTRY alcGetContextsDevice(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY alcSuspendContext(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY alcDestroyContext(ALCcontext *context); - -ALCAPI ALCenum ALCAPIENTRY alcGetError(ALCdevice *device); - -ALCAPI ALCboolean ALCAPIENTRY alcIsExtensionPresent(ALCdevice *device,ALCubyte *extName); -ALCAPI ALCvoid * ALCAPIENTRY alcGetProcAddress(ALCdevice *device,ALCubyte *funcName); -ALCAPI ALCenum ALCAPIENTRY alcGetEnumValue(ALCdevice *device,ALCubyte *enumName); - -#else /* ALC_NO_PROTOTYPES */ - -ALCAPI ALCubyte* ALCAPIENTRY (*alcGetString)(ALCdevice *device,ALCenum param); -ALCAPI ALCvoid ALCAPIENTRY (*alcGetIntegerv)(ALCdevice * device,ALCenum param,ALCsizei size,ALCint *data); - -ALCAPI ALCdevice* ALCAPIENTRY (*alcOpenDevice)(ALubyte *deviceName); -ALCAPI ALCvoid ALCAPIENTRY (*alcCloseDevice)(ALCdevice *device); - -ALCAPI ALCcontext*ALCAPIENTRY (*alcCreateContext)(ALCdevice *device,ALCint *attrList); -ALCAPI ALCboolean ALCAPIENTRY (*alcMakeContextCurrent)(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY (*alcProcessContext)(ALCcontext *context); -ALCAPI ALCcontext*ALCAPIENTRY (*alcGetCurrentContext)(ALCvoid); -ALCAPI ALCdevice* ALCAPIENTRY (*alcGetContextsDevice)(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY (*alcSuspendContext)(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY (*alcDestroyContext)(ALCcontext *context); - -ALCAPI ALCenum ALCAPIENTRY (*alcGetError)(ALCdevice *device); - -ALCAPI ALCboolean ALCAPIENTRY (*alcIsExtensionPresent)(ALCdevice *device,ALCubyte *extName); -ALCAPI ALCvoid * ALCAPIENTRY (*alcGetProcAddress)(ALCdevice *device,ALCubyte *funcName); -ALCAPI ALCenum ALCAPIENTRY (*alcGetEnumValue)(ALCdevice *device,ALCubyte *enumName); - -#endif /* AL_NO_PROTOTYPES */ - -#ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export off - #endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/include/alctypes.h b/neo/openal/include/alctypes.h deleted file mode 100644 index 436fcfac..00000000 --- a/neo/openal/include/alctypes.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef _ALCTYPES_H_ -#define _ALCTYPES_H_ - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -/** ALC boolean type. */ -typedef char ALCboolean; - -/** ALC 8bit signed byte. */ -typedef char ALCbyte; - -/** ALC 8bit unsigned byte. */ -typedef unsigned char ALCubyte; - -/** ALC 16bit signed short integer type. */ -typedef short ALCshort; - -/** ALC 16bit unsigned short integer type. */ -typedef unsigned short ALCushort; - -/** ALC 32bit unsigned integer type. */ -typedef unsigned ALCuint; - -/** ALC 32bit signed integer type. */ -typedef int ALCint; - -/** ALC 32bit floating point type. */ -typedef float ALCfloat; - -/** ALC 64bit double point type. */ -typedef double ALCdouble; - -/** ALC 32bit type. */ -typedef unsigned int ALCsizei; - -/** ALC void type */ -typedef void ALCvoid; - -/** ALC enumerations. */ -typedef int ALCenum; - -/* Bad value. */ -#define ALC_INVALID (-1) - -/* Boolean False. */ -#define ALC_FALSE 0 - -/* Boolean True. */ -#define ALC_TRUE 1 - -/** Errors: No Error. */ -#define ALC_NO_ERROR ALC_FALSE - -#define ALC_MAJOR_VERSION 0x1000 -#define ALC_MINOR_VERSION 0x1001 -#define ALC_ATTRIBUTES_SIZE 0x1002 -#define ALC_ALL_ATTRIBUTES 0x1003 - -#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004 -#define ALC_DEVICE_SPECIFIER 0x1005 -#define ALC_EXTENSIONS 0x1006 - -#define ALC_FREQUENCY 0x1007 -#define ALC_REFRESH 0x1008 -#define ALC_SYNC 0x1009 - -/** - * The device argument does not name a valid dvice. - */ -#define ALC_INVALID_DEVICE 0xA001 - -/** - * The context argument does not name a valid context. - */ -#define ALC_INVALID_CONTEXT 0xA002 - -/** - * A function was called at inappropriate time, - * or in an inappropriate way, causing an illegal state. - * This can be an incompatible ALenum, object ID, - * and/or function. - */ -#define ALC_INVALID_ENUM 0xA003 - -/** - * Illegal value passed as an argument to an AL call. - * Applies to parameter values, but not to enumerations. - */ -#define ALC_INVALID_VALUE 0xA004 - -/** - * A function could not be completed, - * because there is not enough memory available. - */ -#define ALC_OUT_OF_MEMORY 0xA005 - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/include/altypes.h b/neo/openal/include/altypes.h deleted file mode 100644 index 9dc4ead1..00000000 --- a/neo/openal/include/altypes.h +++ /dev/null @@ -1,333 +0,0 @@ -#ifndef _ALTYPES_H_ -#define _ALTYPES_H_ - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -/** OpenAL boolean type. */ -typedef char ALboolean; - -/** OpenAL 8bit signed byte. */ -typedef char ALbyte; - -/** OpenAL 8bit unsigned byte. */ -typedef unsigned char ALubyte; - -/** OpenAL 16bit signed short integer type. */ -typedef short ALshort; - -/** OpenAL 16bit unsigned short integer type. */ -typedef unsigned short ALushort; - -/** OpenAL 32bit unsigned integer type. */ -typedef unsigned ALuint; - -/** OpenAL 32bit signed integer type. */ -typedef int ALint; - -/** OpenAL 32bit floating point type. */ -typedef float ALfloat; - -/** OpenAL 64bit double point type. */ -typedef double ALdouble; - -/** OpenAL 32bit type. */ -typedef unsigned int ALsizei; - -/** OpenAL void type */ -typedef void ALvoid; - -/** OpenAL enumerations. */ -typedef int ALenum; - -/* Bad value. */ -#define AL_INVALID (-1) - -/* Disable value. */ -#define AL_NONE 0 - -/* Boolean False. */ -#define AL_FALSE 0 - -/* Boolean True. */ -#define AL_TRUE 1 - -/** - * Indicate the type of AL_SOURCE. - * Sources can be spatialized - */ -#define AL_SOURCE_TYPE 0x200 - -/** Indicate source has absolute coordinates. */ -#define AL_SOURCE_ABSOLUTE 0x201 - -/** Indicate Source has listener relative coordinates. */ -#define AL_SOURCE_RELATIVE 0x202 - -/** - * Directional source, inner cone angle, in degrees. - * Range: [0-360] - * Default: 360 - */ -#define AL_CONE_INNER_ANGLE 0x1001 - -/** - * Directional source, outer cone angle, in degrees. - * Range: [0-360] - * Default: 360 - */ -#define AL_CONE_OUTER_ANGLE 0x1002 - -/** - * Specify the pitch to be applied, either at source, - * or on mixer results, at listener. - * Range: [0.5-2.0] - * Default: 1.0 - */ -#define AL_PITCH 0x1003 - -/** - * Specify the current location in three dimensional space. - * OpenAL, like OpenGL, uses a right handed coordinate system, - * where in a frontal default view X (thumb) points right, - * Y points up (index finger), and Z points towards the - * viewer/camera (middle finger). - * To switch from a left handed coordinate system, flip the - * sign on the Z coordinate. - * Listener position is always in the world coordinate system. - */ -#define AL_POSITION 0x1004 - -/** Specify the current direction as forward vector. */ -#define AL_DIRECTION 0x1005 - -/** Specify the current velocity in three dimensional space. */ -#define AL_VELOCITY 0x1006 - -/** - * Indicate whether source has to loop infinite. - * Type: ALboolean - * Range: [AL_TRUE, AL_FALSE] - * Default: AL_FALSE - */ -#define AL_LOOPING 0x1007 - -/** - * Indicate the buffer to provide sound samples. - * Type: ALuint. - * Range: any valid Buffer id. - */ -#define AL_BUFFER 0x1009 - -/** - * Indicate the gain (volume amplification) applied. - * Type: ALfloat. - * Range: ]0.0- ] - * A value of 1.0 means un-attenuated/unchanged. - * Each division by 2 equals an attenuation of -6dB. - * Each multiplicaton with 2 equals an amplification of +6dB. - * A value of 0.0 is meaningless with respect to a logarithmic - * scale; it is interpreted as zero volume - the channel - * is effectively disabled. - */ -#define AL_GAIN 0x100A - -/** - * Indicate minimum source attenuation. - * Type: ALfloat - * Range: [0.0 - 1.0] - */ -#define AL_MIN_GAIN 0x100D - -/** - * Indicate maximum source attenuation. - * Type: ALfloat - * Range: [0.0 - 1.0] - */ -#define AL_MAX_GAIN 0x100E - -/** - * Specify the current orientation. - * Type: ALfv6 (at/up) - * Range: N/A - */ -#define AL_ORIENTATION 0x100F - -/* byte offset into source (in canon format). -1 if source - * is not playing. Don't set this, get this. - * - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - */ -#define AL_REFERENCE_DISTANCE 0x1020 - - /** - * Indicate the rolloff factor for the source. - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - */ -#define AL_ROLLOFF_FACTOR 0x1021 - -/** - * Indicate the gain (volume amplification) applied. - * Type: ALfloat. - * Range: ]0.0- ] - * A value of 1.0 means un-attenuated/unchanged. - * Each division by 2 equals an attenuation of -6dB. - * Each multiplicaton with 2 equals an amplification of +6dB. - * A value of 0.0 is meaningless with respect to a logarithmic - * scale; it is interpreted as zero volume - the channel - * is effectively disabled. - */ -#define AL_CONE_OUTER_GAIN 0x1022 - -/** - * Specify the maximum distance. - * Type: ALfloat - * Range: [0.0 - ] - */ -#define AL_MAX_DISTANCE 0x1023 - -/** - * Specify the channel mask. (Creative) - * Type: ALuint - * Range: [0 - 255] - */ -#define AL_CHANNEL_MASK 0x3000 - -/** - * Source state information - */ -#define AL_SOURCE_STATE 0x1010 -#define AL_INITIAL 0x1011 -#define AL_PLAYING 0x1012 -#define AL_PAUSED 0x1013 -#define AL_STOPPED 0x1014 - -/** - * Buffer Queue params - */ -#define AL_BUFFERS_QUEUED 0x1015 -#define AL_BUFFERS_PROCESSED 0x1016 - -/** Sound buffers: format specifier. */ -#define AL_FORMAT_MONO8 0x1100 -#define AL_FORMAT_MONO16 0x1101 -#define AL_FORMAT_STEREO8 0x1102 -#define AL_FORMAT_STEREO16 0x1103 - -/** - * Sound buffers: frequency, in units of Hertz [Hz]. - * This is the number of samples per second. Half of the - * sample frequency marks the maximum significant - * frequency component. - */ -#define AL_FREQUENCY 0x2001 -#define AL_BITS 0x2002 -#define AL_CHANNELS 0x2003 -#define AL_SIZE 0x2004 -#define AL_DATA 0x2005 - -/** - * Buffer state. - * - * Not supported for public use (yet). - */ -#define AL_UNUSED 0x2010 -#define AL_PENDING 0x2011 -#define AL_PROCESSED 0x2012 - -/** Errors: No Error. */ -#define AL_NO_ERROR AL_FALSE - -/** - * Illegal name passed as an argument to an AL call. - */ -#define AL_INVALID_NAME 0xA001 - -/** - * Illegal enum passed as an argument to an AL call. - */ -#define AL_INVALID_ENUM 0xA002 -/** - * Illegal value passed as an argument to an AL call. - * Applies to parameter values, but not to enumerations. - */ -#define AL_INVALID_VALUE 0xA003 - -/** - * A function was called at inappropriate time, - * or in an inappropriate way, causing an illegal state. - * This can be an incompatible ALenum, object ID, - * and/or function. - */ -#define AL_INVALID_OPERATION 0xA004 - -/** - * A function could not be completed, - * because there is not enough memory available. - */ -#define AL_OUT_OF_MEMORY 0xA005 - -/** Context strings: Vendor Name. */ -#define AL_VENDOR 0xB001 -#define AL_VERSION 0xB002 -#define AL_RENDERER 0xB003 -#define AL_EXTENSIONS 0xB004 - -/** Global tweakage. */ - -/** - * Doppler scale. Default 1.0 - */ -#define AL_DOPPLER_FACTOR 0xC000 - -/** - * Doppler velocity. Default 1.0 - */ -#define AL_DOPPLER_VELOCITY 0xC001 - -/** - * Distance model. Default AL_INVERSE_DISTANCE_CLAMPED - */ -#define AL_DISTANCE_MODEL 0xD000 - -/** Distance models. */ - -#define AL_INVERSE_DISTANCE 0xD001 -#define AL_INVERSE_DISTANCE_CLAMPED 0xD002 - - /** - * enables - */ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/include/alu.h b/neo/openal/include/alu.h deleted file mode 100644 index c6adff62..00000000 --- a/neo/openal/include/alu.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _ALU_H_ -#define _ALU_H_ - -#define ALUAPI -#define ALUAPIENTRY __cdecl - -#define BUFFERSIZE 48000 -#define FRACTIONBITS 14 -#define FRACTIONMASK ((1L< - - /* - * EAX Wrapper Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5} - */ - DEFINE_GUID(CLSID_EAXDirectSound, - 0x4ff53b81, - 0x1ce0, - 0x11d3, - 0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5); - - /* - * EAX Wrapper Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C} - */ - DEFINE_GUID(CLSID_EAXDirectSound8, - 0xca503b60, - 0xb176, - 0x11d4, - 0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc); - - - -#ifdef DIRECTSOUND_VERSION -#if DIRECTSOUND_VERSION == 0x0800 - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate8(GUID*, LPDIRECTSOUND8*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE8)(GUID*, LPDIRECTSOUND8*, IUnknown FAR*); -#endif -#endif - - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate(GUID*, LPDIRECTSOUND*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE)(GUID*, LPDIRECTSOUND*, IUnknown FAR*); - -#else // OPENAL - //#include - - #ifndef GUID_DEFINED - #define GUID_DEFINED - typedef struct _GUID - { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; - } GUID; - #endif // !GUID_DEFINED - - #ifndef DEFINE_GUID - #ifndef INITGUID - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID /*FAR*/ name - #else - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - #endif // INITGUID - #endif // DEFINE_GUID - - - /* - * EAX OpenAL Extension - */ - typedef ALenum (*EAXSet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALenum (*EAXGet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALboolean (*EAXSetBufferMode)(ALsizei,ALuint*,ALint); - typedef ALenum (*EAXGetBufferMode)(ALuint,ALint*); -#endif - -#pragma pack(push, 4) - -/* - * EAX 3.0 listener property set {A8FA6880-B476-11d3-BDB9-00C0F02DDF87} - */ -DEFINE_GUID(DSPROPSETID_EAX30_ListenerProperties, - 0xa8fa6882, - 0xb476, - 0x11d3, - 0xbd, 0xb9, 0x00, 0xc0, 0xf0, 0x2d, 0xdf, 0x87); - -// For compatibility with future EAX versions: -#define DSPROPSETID_EAX_ListenerProperties DSPROPSETID_EAX30_ListenerProperties - -typedef enum -{ - DSPROPERTY_EAXLISTENER_NONE, - DSPROPERTY_EAXLISTENER_ALLPARAMETERS, - DSPROPERTY_EAXLISTENER_ENVIRONMENT, - DSPROPERTY_EAXLISTENER_ENVIRONMENTSIZE, - DSPROPERTY_EAXLISTENER_ENVIRONMENTDIFFUSION, - DSPROPERTY_EAXLISTENER_ROOM, - DSPROPERTY_EAXLISTENER_ROOMHF, - DSPROPERTY_EAXLISTENER_ROOMLF, - DSPROPERTY_EAXLISTENER_DECAYTIME, - DSPROPERTY_EAXLISTENER_DECAYHFRATIO, - DSPROPERTY_EAXLISTENER_DECAYLFRATIO, - DSPROPERTY_EAXLISTENER_REFLECTIONS, - DSPROPERTY_EAXLISTENER_REFLECTIONSDELAY, - DSPROPERTY_EAXLISTENER_REFLECTIONSPAN, - DSPROPERTY_EAXLISTENER_REVERB, - DSPROPERTY_EAXLISTENER_REVERBDELAY, - DSPROPERTY_EAXLISTENER_REVERBPAN, - DSPROPERTY_EAXLISTENER_ECHOTIME, - DSPROPERTY_EAXLISTENER_ECHODEPTH, - DSPROPERTY_EAXLISTENER_MODULATIONTIME, - DSPROPERTY_EAXLISTENER_MODULATIONDEPTH, - DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF, - DSPROPERTY_EAXLISTENER_HFREFERENCE, - DSPROPERTY_EAXLISTENER_LFREFERENCE, - DSPROPERTY_EAXLISTENER_ROOMROLLOFFFACTOR, - DSPROPERTY_EAXLISTENER_FLAGS -} DSPROPERTY_EAX_LISTENERPROPERTY; - -// OR these flags with property id -#define DSPROPERTY_EAXLISTENER_IMMEDIATE 0x00000000 // changes take effect immediately -#define DSPROPERTY_EAXLISTENER_DEFERRED 0x80000000 // changes take effect later -#define DSPROPERTY_EAXLISTENER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXLISTENER_NONE | \ - DSPROPERTY_EAXLISTENER_IMMEDIATE) -#ifndef EAXVECTOR_DEFINED -#define EAXVECTOR_DEFINED -typedef struct _EAXVECTOR { - float x; - float y; - float z; -} EAXVECTOR; -#endif - -// Use this structure for DSPROPERTY_EAXLISTENER_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all times and delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myListener.lRoom = -1000; -// myListener.lRoomHF = -100; -// ... -// myListener.dwFlags = myFlags /* see EAXLISTENERFLAGS below */ ; -// instead of: -// myListener = { -1000, -100, ... , 0x00000009 }; -// If you want to save and load presets in binary form, you -// should define your own structure to insure future compatibility. -// -typedef struct _EAXLISTENERPROPERTIES -{ - unsigned long ulEnvironment; // sets all listener properties - float flEnvironmentSize; // environment size in meters - float flEnvironmentDiffusion; // environment diffusion - long lRoom; // room effect level (at mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lRoomLF; // relative room effect level at low frequencies - float flDecayTime; // reverberation decay time at mid frequencies - float flDecayHFRatio; // high-frequency to mid-frequency decay time ratio - float flDecayLFRatio; // low-frequency to mid-frequency decay time ratio - long lReflections; // early reflections level relative to room effect - float flReflectionsDelay; // initial reflection delay time - EAXVECTOR vReflectionsPan; // early reflections panning vector - long lReverb; // late reverberation level relative to room effect - float flReverbDelay; // late reverberation delay time relative to initial reflection - EAXVECTOR vReverbPan; // late reverberation panning vector - float flEchoTime; // echo time - float flEchoDepth; // echo depth - float flModulationTime; // modulation time - float flModulationDepth; // modulation depth - float flAirAbsorptionHF; // change in level per meter at high frequencies - float flHFReference; // reference high frequency - float flLFReference; // reference low frequency - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - unsigned long ulFlags; // modifies the behavior of properties -} EAXLISTENERPROPERTIES, *LPEAXLISTENERPROPERTIES; - -// used by DSPROPERTY_EAXLISTENER_ENVIRONMENT -#ifndef EAX_ENVIRONMENTS_DEFINED -#define EAX_ENVIRONMENTS_DEFINED -enum -{ - EAX_ENVIRONMENT_GENERIC, - EAX_ENVIRONMENT_PADDEDCELL, - EAX_ENVIRONMENT_ROOM, - EAX_ENVIRONMENT_BATHROOM, - EAX_ENVIRONMENT_LIVINGROOM, - EAX_ENVIRONMENT_STONEROOM, - EAX_ENVIRONMENT_AUDITORIUM, - EAX_ENVIRONMENT_CONCERTHALL, - EAX_ENVIRONMENT_CAVE, - EAX_ENVIRONMENT_ARENA, - EAX_ENVIRONMENT_HANGAR, - EAX_ENVIRONMENT_CARPETEDHALLWAY, - EAX_ENVIRONMENT_HALLWAY, - EAX_ENVIRONMENT_STONECORRIDOR, - EAX_ENVIRONMENT_ALLEY, - EAX_ENVIRONMENT_FOREST, - EAX_ENVIRONMENT_CITY, - EAX_ENVIRONMENT_MOUNTAINS, - EAX_ENVIRONMENT_QUARRY, - EAX_ENVIRONMENT_PLAIN, - EAX_ENVIRONMENT_PARKINGLOT, - EAX_ENVIRONMENT_SEWERPIPE, - EAX_ENVIRONMENT_UNDERWATER, - EAX_ENVIRONMENT_DRUGGED, - EAX_ENVIRONMENT_DIZZY, - EAX_ENVIRONMENT_PSYCHOTIC, - - EAX_ENVIRONMENT_UNDEFINED, - - EAX_ENVIRONMENT_COUNT -}; -#endif - -// Used by DSPROPERTY_EAXLISTENER_FLAGS -// -// Note: The number and order of flags may change in future EAX versions. -// It is recommended to use the flag defines as follows: -// myFlags = EAXLISTENERFLAGS_DECAYTIMESCALE | EAXLISTENERFLAGS_REVERBSCALE; -// instead of: -// myFlags = 0x00000009; -// -// These flags determine what properties are affected by environment size. -#define EAXLISTENERFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time -#define EAXLISTENERFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level -#define EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time -#define EAXLISTENERFLAGS_REVERBSCALE 0x00000008 // reflections level -#define EAXLISTENERFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time -#define EAXLISTENERFLAGS_ECHOTIMESCALE 0x00000040 // echo time -#define EAXLISTENERFLAGS_MODULATIONTIMESCALE 0x00000080 // modulation time - -// This flag limits high-frequency decay time according to air absorption. -#define EAXLISTENERFLAGS_DECAYHFLIMIT 0x00000020 - -#define EAXLISTENERFLAGS_RESERVED 0xFFFFFF00 // reserved future use - -// Property ranges and defaults: - -#define EAXLISTENER_MINENVIRONMENT 0 -#define EAXLISTENER_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1) -#define EAXLISTENER_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC - -#define EAXLISTENER_MINENVIRONMENTSIZE 1.0f -#define EAXLISTENER_MAXENVIRONMENTSIZE 100.0f -#define EAXLISTENER_DEFAULTENVIRONMENTSIZE 7.5f - -#define EAXLISTENER_MINENVIRONMENTDIFFUSION 0.0f -#define EAXLISTENER_MAXENVIRONMENTDIFFUSION 1.0f -#define EAXLISTENER_DEFAULTENVIRONMENTDIFFUSION 1.0f - -#define EAXLISTENER_MINROOM (-10000) -#define EAXLISTENER_MAXROOM 0 -#define EAXLISTENER_DEFAULTROOM (-1000) - -#define EAXLISTENER_MINROOMHF (-10000) -#define EAXLISTENER_MAXROOMHF 0 -#define EAXLISTENER_DEFAULTROOMHF (-100) - -#define EAXLISTENER_MINROOMLF (-10000) -#define EAXLISTENER_MAXROOMLF 0 -#define EAXLISTENER_DEFAULTROOMLF 0 - -#define EAXLISTENER_MINDECAYTIME 0.1f -#define EAXLISTENER_MAXDECAYTIME 20.0f -#define EAXLISTENER_DEFAULTDECAYTIME 1.49f - -#define EAXLISTENER_MINDECAYHFRATIO 0.1f -#define EAXLISTENER_MAXDECAYHFRATIO 2.0f -#define EAXLISTENER_DEFAULTDECAYHFRATIO 0.83f - -#define EAXLISTENER_MINDECAYLFRATIO 0.1f -#define EAXLISTENER_MAXDECAYLFRATIO 2.0f -#define EAXLISTENER_DEFAULTDECAYLFRATIO 1.00f - -#define EAXLISTENER_MINREFLECTIONS (-10000) -#define EAXLISTENER_MAXREFLECTIONS 1000 -#define EAXLISTENER_DEFAULTREFLECTIONS (-2602) - -#define EAXLISTENER_MINREFLECTIONSDELAY 0.0f -#define EAXLISTENER_MAXREFLECTIONSDELAY 0.3f -#define EAXLISTENER_DEFAULTREFLECTIONSDELAY 0.007f - -#define EAXLISTENER_MINREVERB (-10000) -#define EAXLISTENER_MAXREVERB 2000 -#define EAXLISTENER_DEFAULTREVERB 200 - -#define EAXLISTENER_MINREVERBDELAY 0.0f -#define EAXLISTENER_MAXREVERBDELAY 0.1f -#define EAXLISTENER_DEFAULTREVERBDELAY 0.011f - -#define EAXLISTENER_MINECHOTIME 0.075f -#define EAXLISTENER_MAXECHOTIME 0.25f -#define EAXLISTENER_DEFAULTECHOTIME 0.25f - -#define EAXLISTENER_MINECHODEPTH 0.0f -#define EAXLISTENER_MAXECHODEPTH 1.0f -#define EAXLISTENER_DEFAULTECHODEPTH 0.0f - -#define EAXLISTENER_MINMODULATIONTIME 0.04f -#define EAXLISTENER_MAXMODULATIONTIME 4.0f -#define EAXLISTENER_DEFAULTMODULATIONTIME 0.25f - -#define EAXLISTENER_MINMODULATIONDEPTH 0.0f -#define EAXLISTENER_MAXMODULATIONDEPTH 1.0f -#define EAXLISTENER_DEFAULTMODULATIONDEPTH 0.0f - -#define EAXLISTENER_MINAIRABSORPTIONHF (-100.0f) -#define EAXLISTENER_MAXAIRABSORPTIONHF 0.0f -#define EAXLISTENER_DEFAULTAIRABSORPTIONHF (-5.0f) - -#define EAXLISTENER_MINHFREFERENCE 1000.0f -#define EAXLISTENER_MAXHFREFERENCE 20000.0f -#define EAXLISTENER_DEFAULTHFREFERENCE 5000.0f - -#define EAXLISTENER_MINLFREFERENCE 20.0f -#define EAXLISTENER_MAXLFREFERENCE 1000.0f -#define EAXLISTENER_DEFAULTLFREFERENCE 250.0f - -#define EAXLISTENER_MINROOMROLLOFFFACTOR 0.0f -#define EAXLISTENER_MAXROOMROLLOFFFACTOR 10.0f -#define EAXLISTENER_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXLISTENER_DEFAULTFLAGS (EAXLISTENERFLAGS_DECAYTIMESCALE | \ - EAXLISTENERFLAGS_REFLECTIONSSCALE | \ - EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE | \ - EAXLISTENERFLAGS_REVERBSCALE | \ - EAXLISTENERFLAGS_REVERBDELAYSCALE | \ - EAXLISTENERFLAGS_DECAYHFLIMIT) - - - -/* -* EAX 3.0 buffer property set {A8FA6881-B476-11d3-BDB9-00C0F02DDF87} -*/ -DEFINE_GUID(DSPROPSETID_EAX30_BufferProperties, - 0xa8fa6881, - 0xb476, - 0x11d3, - 0xbd, 0xb9, 0x0, 0xc0, 0xf0, 0x2d, 0xdf, 0x87); - -// For compatibility with future EAX versions: -#define DSPROPSETID_EAX_BufferProperties DSPROPSETID_EAX30_BufferProperties -#define DSPROPSETID_EAX_SourceProperties DSPROPSETID_EAX30_BufferProperties - -typedef enum -{ - DSPROPERTY_EAXBUFFER_NONE, - DSPROPERTY_EAXBUFFER_ALLPARAMETERS, - DSPROPERTY_EAXBUFFER_OBSTRUCTIONPARAMETERS, - DSPROPERTY_EAXBUFFER_OCCLUSIONPARAMETERS, - DSPROPERTY_EAXBUFFER_EXCLUSIONPARAMETERS, - DSPROPERTY_EAXBUFFER_DIRECT, - DSPROPERTY_EAXBUFFER_DIRECTHF, - DSPROPERTY_EAXBUFFER_ROOM, - DSPROPERTY_EAXBUFFER_ROOMHF, - DSPROPERTY_EAXBUFFER_OBSTRUCTION, - DSPROPERTY_EAXBUFFER_OBSTRUCTIONLFRATIO, - DSPROPERTY_EAXBUFFER_OCCLUSION, - DSPROPERTY_EAXBUFFER_OCCLUSIONLFRATIO, - DSPROPERTY_EAXBUFFER_OCCLUSIONROOMRATIO, - DSPROPERTY_EAXBUFFER_OCCLUSIONDIRECTRATIO, - DSPROPERTY_EAXBUFFER_EXCLUSION, - DSPROPERTY_EAXBUFFER_EXCLUSIONLFRATIO, - DSPROPERTY_EAXBUFFER_OUTSIDEVOLUMEHF, - DSPROPERTY_EAXBUFFER_DOPPLERFACTOR, - DSPROPERTY_EAXBUFFER_ROLLOFFFACTOR, - DSPROPERTY_EAXBUFFER_ROOMROLLOFFFACTOR, - DSPROPERTY_EAXBUFFER_AIRABSORPTIONFACTOR, - DSPROPERTY_EAXBUFFER_FLAGS -} DSPROPERTY_EAX_BUFFERPROPERTY; - -// OR these flags with property id -#define DSPROPERTY_EAXBUFFER_IMMEDIATE 0x00000000 // changes take effect immediately -#define DSPROPERTY_EAXBUFFER_DEFERRED 0x80000000 // changes take effect later -#define DSPROPERTY_EAXBUFFER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXBUFFER_NONE | \ - DSPROPERTY_EAXBUFFER_IMMEDIATE) - -// Use this structure for DSPROPERTY_EAXBUFFER_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myBuffer.lDirect = 0; -// myBuffer.lDirectHF = -200; -// ... -// myBuffer.dwFlags = myFlags /* see EAXBUFFERFLAGS below */ ; -// instead of: -// myBuffer = { 0, -200, ... , 0x00000003 }; -// -typedef struct _EAXBUFFERPROPERTIES -{ - long lDirect; // direct path level (at low and mid frequencies) - long lDirectHF; // relative direct path level at high frequencies - long lRoom; // room effect level (at low and mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lObstruction; // main obstruction control (attenuation at high frequencies) - float flObstructionLFRatio; // obstruction low-frequency level re. main control - long lOcclusion; // main occlusion control (attenuation at high frequencies) - float flOcclusionLFRatio; // occlusion low-frequency level re. main control - float flOcclusionRoomRatio; // relative occlusion control for room effect - float flOcclusionDirectRatio; // relative occlusion control for direct path - long lExclusion; // main exlusion control (attenuation at high frequencies) - float flExclusionLFRatio; // exclusion low-frequency level re. main control - long lOutsideVolumeHF; // outside sound cone level at high frequencies - float flDopplerFactor; // like DS3D flDopplerFactor but per source - float flRolloffFactor; // like DS3D flRolloffFactor but per source - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - float flAirAbsorptionFactor; // multiplies DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF - unsigned long ulFlags; // modifies the behavior of properties -} EAXBUFFERPROPERTIES, *LPEAXBUFFERPROPERTIES; - -// Use this structure for DSPROPERTY_EAXBUFFER_OBSTRUCTION, -#ifndef EAX_OBSTRUCTIONPROPERTIES_DEFINED -#define EAX_OBSTRUCTIONPROPERTIES_DEFINED -typedef struct _EAXOBSTRUCTIONPROPERTIES -{ - long lObstruction; - float flObstructionLFRatio; -} EAXOBSTRUCTIONPROPERTIES, *LPEAXOBSTRUCTIONPROPERTIES; -#endif - -// Use this structure for DSPROPERTY_EAXBUFFER_OCCLUSION -#ifndef EAX_OCCLUSIONPROPERTIES_DEFINED -#define EAX_OCCLUSIONPROPERTIES_DEFINED -typedef struct _EAXOCCLUSIONPROPERTIES -{ - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; -} EAXOCCLUSIONPROPERTIES, *LPEAXOCCLUSIONPROPERTIES; -#endif - -// Use this structure for DSPROPERTY_EAXBUFFER_EXCLUSION -#ifndef EAX_EXCLUSIONPROPERTIES_DEFINED -#define EAX_EXCLUSIONPROPERTIES_DEFINED -typedef struct _EAXEXCLUSIONPROPERTIES -{ - long lExclusion; - float flExclusionLFRatio; -} EAXEXCLUSIONPROPERTIES, *LPEAXEXCLUSIONPROPERTIES; -#endif - -// Used by DSPROPERTY_EAXBUFFER_FLAGS -// TRUE: value is computed automatically - property is an offset -// FALSE: value is used directly -// -// Note: The number and order of flags may change in future EAX versions. -// To insure future compatibility, use flag defines as follows: -// myFlags = EAXBUFFERFLAGS_DIRECTHFAUTO | EAXBUFFERFLAGS_ROOMAUTO; -// instead of: -// myFlags = 0x00000003; -// -#define EAXBUFFERFLAGS_DIRECTHFAUTO 0x00000001 // affects DSPROPERTY_EAXBUFFER_DIRECTHF -#define EAXBUFFERFLAGS_ROOMAUTO 0x00000002 // affects DSPROPERTY_EAXBUFFER_ROOM -#define EAXBUFFERFLAGS_ROOMHFAUTO 0x00000004 // affects DSPROPERTY_EAXBUFFER_ROOMHF - -#define EAXBUFFERFLAGS_RESERVED 0xFFFFFFF8 // reserved future use - -// Property ranges and defaults: - -#define EAXBUFFER_MINDIRECT (-10000) -#define EAXBUFFER_MAXDIRECT 1000 -#define EAXBUFFER_DEFAULTDIRECT 0 - -#define EAXBUFFER_MINDIRECTHF (-10000) -#define EAXBUFFER_MAXDIRECTHF 0 -#define EAXBUFFER_DEFAULTDIRECTHF 0 - -#define EAXBUFFER_MINROOM (-10000) -#define EAXBUFFER_MAXROOM 1000 -#define EAXBUFFER_DEFAULTROOM 0 - -#define EAXBUFFER_MINROOMHF (-10000) -#define EAXBUFFER_MAXROOMHF 0 -#define EAXBUFFER_DEFAULTROOMHF 0 - -#define EAXBUFFER_MINOBSTRUCTION (-10000) -#define EAXBUFFER_MAXOBSTRUCTION 0 -#define EAXBUFFER_DEFAULTOBSTRUCTION 0 - -#define EAXBUFFER_MINOBSTRUCTIONLFRATIO 0.0f -#define EAXBUFFER_MAXOBSTRUCTIONLFRATIO 1.0f -#define EAXBUFFER_DEFAULTOBSTRUCTIONLFRATIO 0.0f - -#define EAXBUFFER_MINOCCLUSION (-10000) -#define EAXBUFFER_MAXOCCLUSION 0 -#define EAXBUFFER_DEFAULTOCCLUSION 0 - -#define EAXBUFFER_MINOCCLUSIONLFRATIO 0.0f -#define EAXBUFFER_MAXOCCLUSIONLFRATIO 1.0f -#define EAXBUFFER_DEFAULTOCCLUSIONLFRATIO 0.25f - -#define EAXBUFFER_MINOCCLUSIONROOMRATIO 0.0f -#define EAXBUFFER_MAXOCCLUSIONROOMRATIO 10.0f -#define EAXBUFFER_DEFAULTOCCLUSIONROOMRATIO 1.5f - -#define EAXBUFFER_MINOCCLUSIONDIRECTRATIO 0.0f -#define EAXBUFFER_MAXOCCLUSIONDIRECTRATIO 10.0f -#define EAXBUFFER_DEFAULTOCCLUSIONDIRECTRATIO 1.0f - -#define EAXBUFFER_MINEXCLUSION (-10000) -#define EAXBUFFER_MAXEXCLUSION 0 -#define EAXBUFFER_DEFAULTEXCLUSION 0 - -#define EAXBUFFER_MINEXCLUSIONLFRATIO 0.0f -#define EAXBUFFER_MAXEXCLUSIONLFRATIO 1.0f -#define EAXBUFFER_DEFAULTEXCLUSIONLFRATIO 1.0f - -#define EAXBUFFER_MINOUTSIDEVOLUMEHF (-10000) -#define EAXBUFFER_MAXOUTSIDEVOLUMEHF 0 -#define EAXBUFFER_DEFAULTOUTSIDEVOLUMEHF 0 - -#define EAXBUFFER_MINDOPPLERFACTOR 0.0f -#define EAXBUFFER_MAXDOPPLERFACTOR 10.f -#define EAXBUFFER_DEFAULTDOPPLERFACTOR 0.0f - -#define EAXBUFFER_MINROLLOFFFACTOR 0.0f -#define EAXBUFFER_MAXROLLOFFFACTOR 10.f -#define EAXBUFFER_DEFAULTROLLOFFFACTOR 0.0f - -#define EAXBUFFER_MINROOMROLLOFFFACTOR 0.0f -#define EAXBUFFER_MAXROOMROLLOFFFACTOR 10.f -#define EAXBUFFER_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXBUFFER_MINAIRABSORPTIONFACTOR 0.0f -#define EAXBUFFER_MAXAIRABSORPTIONFACTOR 10.0f -#define EAXBUFFER_DEFAULTAIRABSORPTIONFACTOR 1.0f - -#define EAXBUFFER_DEFAULTFLAGS (EAXBUFFERFLAGS_DIRECTHFAUTO | \ - EAXBUFFERFLAGS_ROOMAUTO | \ - EAXBUFFERFLAGS_ROOMHFAUTO ) - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif diff --git a/neo/openal/include/eax4.h b/neo/openal/include/eax4.h deleted file mode 100644 index 6bf13137..00000000 --- a/neo/openal/include/eax4.h +++ /dev/null @@ -1,1575 +0,0 @@ -/*******************************************************************\ -* * -* EAX.H - Environmental Audio Extensions version 4.0 * -* for OpenAL and DirectSound3D * -* * -* File revision 1.0.0 (GDC Beta SDK Release) * -* * -\*******************************************************************/ - -#ifndef EAX_H_INCLUDED -#define EAX_H_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#ifndef OPENAL - #include - - /* - * EAX Unified Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5} - */ - DEFINE_GUID(CLSID_EAXDirectSound, - 0x4ff53b81, - 0x1ce0, - 0x11d3, - 0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5); - - /* - * EAX Unified Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C} - */ - DEFINE_GUID(CLSID_EAXDirectSound8, - 0xca503b60, - 0xb176, - 0x11d4, - 0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc); - - - -#ifdef DIRECTSOUND_VERSION -#if DIRECTSOUND_VERSION >= 0x0800 - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate8(GUID*, LPDIRECTSOUND8*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE8)(GUID*, LPDIRECTSOUND8*, IUnknown FAR*); -#endif -#endif - - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate(GUID*, LPDIRECTSOUND*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE)(GUID*, LPDIRECTSOUND*, IUnknown FAR*); - -#else // OPENAL -// #include - - #ifndef GUID_DEFINED - #define GUID_DEFINED - typedef struct _GUID - { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; - } GUID; - #endif // GUID_DEFINED - - #ifndef DEFINE_GUID - #ifndef INITGUID - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID /*FAR*/ name - #else - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - #endif // INITGUID - #endif // DEFINE_GUID - - /* - * EAX OpenAL Extensions - */ - typedef ALenum (*EAXSet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALenum (*EAXGet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALboolean (*EAXSetBufferMode)(ALsizei, ALuint*, ALint); - typedef ALenum (*EAXGetBufferMode)(ALuint, ALint*); -#endif - -#pragma pack(push, 4) - - - - -//////////////////////////////////////////////////////////////////////////// -// Constants - -#define EAX_MAX_FXSLOTS 4 -#define EAX_MAX_ACTIVE_FXSLOTS 2 - -// The EAX_NULL_GUID is used by EAXFXSLOT_LOADEFFECT, EAXCONTEXT_PRIMARYFXSLOTID -// and EAXSOURCE_ACTIVEFXSLOTID - -// {00000000-0000-0000-0000-000000000000} -DEFINE_GUID(EAX_NULL_GUID, - 0x00000000, - 0x0000, - 0x0000, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - -// The EAX_PrimaryFXSlotID GUID is used by EAXSOURCE_ACTIVEFXSLOTID - -// {F317866D-924C-450C-861B-E6DAA25E7C20} -DEFINE_GUID(EAX_PrimaryFXSlotID, - 0xf317866d, - 0x924c, - 0x450c, - 0x86, 0x1b, 0xe6, 0xda, 0xa2, 0x5e, 0x7c, 0x20); - - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Structures - -// Use this structure for EAXCONTEXT_ALL property. -typedef struct _EAXCONTEXTPROPERTIES -{ - GUID guidPrimaryFXSlotID; - float flDistanceFactor; - float flAirAbsorptionHF; - float flHFReference; -} EAXCONTEXTPROPERTIES, *LPEAXCONTEXTPROPERTIES; - -// Use this structure for EAXSOURCE_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myBuffer.lDirect = 0; -// myBuffer.lDirectHF = -200; -// ... -// myBuffer.dwFlags = myFlags /* see EAXSOURCEFLAGS below */ ; -// instead of: -// myBuffer = { 0, -200, ... , 0x00000003 }; -// -typedef struct _EAXSOURCEPROPERTIES -{ - long lDirect; // direct path level (at low and mid frequencies) - long lDirectHF; // relative direct path level at high frequencies - long lRoom; // room effect level (at low and mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lObstruction; // main obstruction control (attenuation at high frequencies) - float flObstructionLFRatio; // obstruction low-frequency level re. main control - long lOcclusion; // main occlusion control (attenuation at high frequencies) - float flOcclusionLFRatio; // occlusion low-frequency level re. main control - float flOcclusionRoomRatio; // relative occlusion control for room effect - float flOcclusionDirectRatio; // relative occlusion control for direct path - long lExclusion; // main exlusion control (attenuation at high frequencies) - float flExclusionLFRatio; // exclusion low-frequency level re. main control - long lOutsideVolumeHF; // outside sound cone level at high frequencies - float flDopplerFactor; // like DS3D flDopplerFactor but per source - float flRolloffFactor; // like DS3D flRolloffFactor but per source - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - float flAirAbsorptionFactor; // multiplies EAXREVERB_AIRABSORPTIONHF - unsigned long ulFlags; // modifies the behavior of properties -} EAXSOURCEPROPERTIES, *LPEAXSOURCEPROPERTIES; - -// Use this structure for EAXSOURCE_ALLSENDPARAMETERS -// - all levels are hundredths of decibels -// -typedef struct _EAXSOURCEALLSENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lSend; // send level (at low and mid frequencies) - long lSendHF; // relative send level at high frequencies - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; - long lExclusion; - float flExclusionLFRatio; -} EAXSOURCEALLSENDPROPERTIES, *LPEAXSOURCEALLSENDPROPERTIES; - -// Use this structure for EAXSOURCE_ACTIVEFXSLOTID -typedef struct _EAXACTIVEFXSLOTS -{ - GUID guidActiveFXSlots[EAX_MAX_ACTIVE_FXSLOTS]; -} EAXACTIVEFXSLOTS, *LPEAXACTIVEFXSLOTS; - -// Use this structure for EAXSOURCE_OBSTRUCTIONPARAMETERS property. -#ifndef EAX_OBSTRUCTIONPROPERTIES_DEFINED -#define EAX_OBSTRUCTIONPROPERTIES_DEFINED -typedef struct _EAXOBSTRUCTIONPROPERTIES -{ - long lObstruction; - float flObstructionLFRatio; -} EAXOBSTRUCTIONPROPERTIES, *LPEAXOBSTRUCTIONPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_OCCLUSIONPARAMETERS property. -#ifndef EAX_OCCLUSIONPROPERTIES_DEFINED -#define EAX_OCCLUSIONPROPERTIES_DEFINED -typedef struct _EAXOCCLUSIONPROPERTIES -{ - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; -} EAXOCCLUSIONPROPERTIES, *LPEAXOCCLUSIONPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_EXCLUSIONPARAMETERS property. -#ifndef EAX_EXCLUSIONPROPERTIES_DEFINED -#define EAX_EXCLUSIONPROPERTIES_DEFINED -typedef struct _EAXEXCLUSIONPROPERTIES -{ - long lExclusion; - float flExclusionLFRatio; -} EAXEXCLUSIONPROPERTIES, *LPEAXEXCLUSIONPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_SENDPARAMETERS properties. -typedef struct _EAXSOURCESENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lSend; - long lSendHF; -} EAXSOURCESENDPROPERTIES, *LPEAXSOURCESENDPROPERTIES; - -// Use this structure for EAXSOURCE_OCCLUSIONSENDPARAMETERS -typedef struct _EAXSOURCEOCCLUSIONSENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; -} EAXSOURCEOCCLUSIONSENDPROPERTIES, *LPEAXSOURCEOCCLUSIONSENDPROPERTIES; - -// Use this structure for EAXSOURCE_EXCLUSIONSENDPARAMETERS -typedef struct _EAXSOURCEEXCLUSIONSENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lExclusion; - float flExclusionLFRatio; -} EAXSOURCEEXCLUSIONSENDPROPERTIES, *LPEAXSOURCEEXCLUSIONSENDPROPERTIES; - -// Use this structure for EAXFXSLOT_ALLPARAMETERS -// - all levels are hundredths of decibels -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myFXSlot.guidLoadEffect = EAX_REVERB_EFFECT; -// myFXSlot.lVolume = 0; -// myFXSlot.lLock = 1; -// myFXSlot.ulFlags = myFlags /* see EAXFXSLOTFLAGS below */ ; -// instead of: -// myFXSlot = { EAX_REVERB_EFFECT, 0, 1, 0x00000001 }; -// -typedef struct _EAXFXSLOTPROPERTIES -{ - GUID guidLoadEffect; - long lVolume; - long lLock; - unsigned long ulFlags; -} EAXFXSLOTPROPERTIES, *LPEAXFXSLOTPROPERTIES; - -// Use this structure for EAXREVERB_REFLECTIONSPAN and EAXREVERB_REVERBPAN properties. -#ifndef EAXVECTOR_DEFINED -#define EAXVECTOR_DEFINED -typedef struct _EAXVECTOR { - float x; - float y; - float z; -} EAXVECTOR; -#endif - - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Error Codes - -#define EAX_OK 0 -#define EAXERR_INVALID_OPERATION (-1) -#define EAXERR_INVALID_VALUE (-2) -#define EAXERR_NO_EFFECT_LOADED (-3) -#define EAXERR_UNKNOWN_EFFECT (-4) -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Context Object - -// {1D4870AD-0DEF-43c0-A40C-523632296342} -DEFINE_GUID(EAXPROPERTYID_EAX40_Context, - 0x1d4870ad, - 0xdef, - 0x43c0, - 0xa4, 0xc, 0x52, 0x36, 0x32, 0x29, 0x63, 0x42); - -// For compatibility with future EAX versions: -#define EAXPROPERTYID_EAX_Context EAXPROPERTYID_EAX40_Context - -typedef enum -{ - EAXCONTEXT_NONE = 0, - EAXCONTEXT_ALLPARAMETERS, - EAXCONTEXT_PRIMARYFXSLOTID, - EAXCONTEXT_DISTANCEFACTOR, - EAXCONTEXT_AIRABSORPTIONHF, - EAXCONTEXT_HFREFERENCE, - EAXCONTEXT_LASTERROR -} EAXCONTEXT_PROPERTY; - -// OR these flags with property id -#define EAXCONTEXT_PARAMETER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXCONTEXT_PARAMETER_DEFER 0x80000000 // changes take effect later -#define EAXCONTEXT_PARAMETER_COMMITDEFERREDSETTINGS (EAXCONTEXT_NONE | \ - EAXCONTEXT_PARAMETER_IMMEDIATE) - -// EAX Context property ranges and defaults: -#define EAXCONTEXT_DEFAULTPRIMARYFXSLOTID EAXPROPERTYID_EAX40_FXSlot0 - -#define EAXCONTEXT_MINDISTANCEFACTOR FLT_MIN //minimum positive value -#define EAXCONTEXT_MAXDISTANCEFACTOR FLT_MAX -#define EAXCONTEXT_DEFAULTDISTANCEFACTOR 1.0f - -#define EAXCONTEXT_MINAIRABSORPTIONHF (-100.0f) -#define EAXCONTEXT_MAXAIRABSORPTIONHF 0.0f -#define EAXCONTEXT_DEFAULTAIRABSORPTIONHF (-5.0f) - -#define EAXCONTEXT_MINHFREFERENCE 1000.0f -#define EAXCONTEXT_MAXHFREFERENCE 20000.0f -#define EAXCONTEXT_DEFAULTHFREFERENCE 5000.0f - -#define EAXCONTEXT_DEFAULTLASTERROR EAX_OK - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Effect Slot Objects - -// {C4D79F1E-F1AC-436b-A81D-A738E7045469} -DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot0, - 0xc4d79f1e, - 0xf1ac, - 0x436b, - 0xa8, 0x1d, 0xa7, 0x38, 0xe7, 0x4, 0x54, 0x69); - -// {08C00E96-74BE-4491-93AA-E8AD35A49117} -DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot1, - 0x8c00e96, - 0x74be, - 0x4491, - 0x93, 0xaa, 0xe8, 0xad, 0x35, 0xa4, 0x91, 0x17); - -// {1D433B88-F0F6-4637-919F-60E7E06B5EDD} -DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot2, - 0x1d433b88, - 0xf0f6, - 0x4637, - 0x91, 0x9f, 0x60, 0xe7, 0xe0, 0x6b, 0x5e, 0xdd); - -// {EFFF08EA-C7D8-44ab-93AD-6DBD5F910064} -DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot3, - 0xefff08ea, - 0xc7d8, - 0x44ab, - 0x93, 0xad, 0x6d, 0xbd, 0x5f, 0x91, 0x0, 0x64); - -// For compatibility with future EAX versions: -#define EAXPROPERTYID_EAX_FXSlot0 EAXPROPERTYID_EAX40_FXSlot0 -#define EAXPROPERTYID_EAX_FXSlot1 EAXPROPERTYID_EAX40_FXSlot1 -#define EAXPROPERTYID_EAX_FXSlot2 EAXPROPERTYID_EAX40_FXSlot2 -#define EAXPROPERTYID_EAX_FXSlot3 EAXPROPERTYID_EAX40_FXSlot3 - -// FXSlot object properties -typedef enum -{ - EAXFXSLOT_PARAMETER = 0, // range 0-0x40 reserved for loaded effect parameters - EAXFXSLOT_NONE = 0x10000, - EAXFXSLOT_ALLPARAMETERS, - EAXFXSLOT_LOADEFFECT, - EAXFXSLOT_VOLUME, - EAXFXSLOT_LOCK, - EAXFXSLOT_FLAGS -} EAXFXSLOT_PROPERTY; - -// Note: The number and order of flags may change in future EAX versions. -// To insure future compatibility, use flag defines as follows: -// myFlags = EAXFXSLOTFLAGS_ENVIRONMENT; -// instead of: -// myFlags = 0x00000001; -// -#define EAXFXSLOTFLAGS_ENVIRONMENT 0x00000001 -#define EAXFXSLOTFLAGS_RESERVED 0xFFFFFFFE // reserved future use - -// EAX Effect Slot property ranges and defaults: -#define EAXFXSLOT_MINVOLUME (-10000) -#define EAXFXSLOT_MAXVOLUME 0 -#define EAXFXSLOT_DEFAULTVOLUME 0 - -#define EAXFXSLOT_MINLOCK 0 -#define EAXFXSLOT_MAXLOCK 1 - -enum -{ - EAXFXSLOT_UNLOCKED = 0, - EAXFXSLOT_LOCKED = 1 -}; - -#define EAXFXSLOT_DEFAULTFLAGS (EAXFXSLOTFLAGS_ENVIRONMENT) -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Source Object - -// {1B86B823-22DF-4eae-8B3C-1278CE544227} -DEFINE_GUID(EAXPROPERTYID_EAX40_Source, - 0x1b86b823, - 0x22df, - 0x4eae, - 0x8b, 0x3c, 0x12, 0x78, 0xce, 0x54, 0x42, 0x27); - -// For compatibility with future EAX versions: -#define EAXPROPERTYID_EAX_Source EAXPROPERTYID_EAX40_Source - -// Source object properties -typedef enum -{ - EAXSOURCE_NONE, - EAXSOURCE_ALLPARAMETERS, - EAXSOURCE_OBSTRUCTIONPARAMETERS, - EAXSOURCE_OCCLUSIONPARAMETERS, - EAXSOURCE_EXCLUSIONPARAMETERS, - EAXSOURCE_DIRECT, - EAXSOURCE_DIRECTHF, - EAXSOURCE_ROOM, - EAXSOURCE_ROOMHF, - EAXSOURCE_OBSTRUCTION, - EAXSOURCE_OBSTRUCTIONLFRATIO, - EAXSOURCE_OCCLUSION, - EAXSOURCE_OCCLUSIONLFRATIO, - EAXSOURCE_OCCLUSIONROOMRATIO, - EAXSOURCE_OCCLUSIONDIRECTRATIO, - EAXSOURCE_EXCLUSION, - EAXSOURCE_EXCLUSIONLFRATIO, - EAXSOURCE_OUTSIDEVOLUMEHF, - EAXSOURCE_DOPPLERFACTOR, - EAXSOURCE_ROLLOFFFACTOR, - EAXSOURCE_ROOMROLLOFFFACTOR, - EAXSOURCE_AIRABSORPTIONFACTOR, - EAXSOURCE_FLAGS, - EAXSOURCE_SENDPARAMETERS, - EAXSOURCE_ALLSENDPARAMETERS, - EAXSOURCE_OCCLUSIONSENDPARAMETERS, - EAXSOURCE_EXCLUSIONSENDPARAMETERS, - EAXSOURCE_ACTIVEFXSLOTID, -} EAXSOURCE_PROPERTY; - -// OR these flags with property id -#define EAXSOURCE_PARAMETER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXSOURCE_PARAMETER_DEFERRED 0x80000000 // changes take effect later -#define EAXSOURCE_PARAMETER_COMMITDEFERREDSETTINGS (EAXSOURCE_NONE | \ - EAXSOURCE_PARAMETER_IMMEDIATE) -// Used by EAXSOURCE_FLAGS for EAXSOURCEFLAGS_xxxAUTO -// TRUE: value is computed automatically - property is an offset -// FALSE: value is used directly -// -// Note: The number and order of flags may change in future EAX versions. -// To insure future compatibility, use flag defines as follows: -// myFlags = EAXSOURCE_DIRECTHFAUTO | EAXSOURCE_ROOMAUTO; -// instead of: -// myFlags = 0x00000003; -// -#define EAXSOURCEFLAGS_DIRECTHFAUTO 0x00000001 // relates to EAXSOURCE_DIRECTHF -#define EAXSOURCEFLAGS_ROOMAUTO 0x00000002 // relates to EAXSOURCE_ROOM -#define EAXSOURCEFLAGS_ROOMHFAUTO 0x00000004 // relates to EAXSOURCE_ROOMHF -#define EAXSOURCEFLAGS_RESERVED 0xFFFFFFF8 // reserved future use - -// EAX Source property ranges and defaults: -#define EAXSOURCE_MINSEND (-10000) -#define EAXSOURCE_MAXSEND 0 -#define EAXSOURCE_DEFAULTSEND 0 - -#define EAXSOURCE_MINSENDHF (-10000) -#define EAXSOURCE_MAXSENDHF 0 -#define EAXSOURCE_DEFAULTSENDHF 0 - -#define EAXSOURCE_MINDIRECT (-10000) -#define EAXSOURCE_MAXDIRECT 1000 -#define EAXSOURCE_DEFAULTDIRECT 0 - -#define EAXSOURCE_MINDIRECTHF (-10000) -#define EAXSOURCE_MAXDIRECTHF 0 -#define EAXSOURCE_DEFAULTDIRECTHF 0 - -#define EAXSOURCE_MINROOM (-10000) -#define EAXSOURCE_MAXROOM 1000 -#define EAXSOURCE_DEFAULTROOM 0 - -#define EAXSOURCE_MINROOMHF (-10000) -#define EAXSOURCE_MAXROOMHF 0 -#define EAXSOURCE_DEFAULTROOMHF 0 - -#define EAXSOURCE_MINOBSTRUCTION (-10000) -#define EAXSOURCE_MAXOBSTRUCTION 0 -#define EAXSOURCE_DEFAULTOBSTRUCTION 0 - -#define EAXSOURCE_MINOBSTRUCTIONLFRATIO 0.0f -#define EAXSOURCE_MAXOBSTRUCTIONLFRATIO 1.0f -#define EAXSOURCE_DEFAULTOBSTRUCTIONLFRATIO 0.0f - -#define EAXSOURCE_MINOCCLUSION (-10000) -#define EAXSOURCE_MAXOCCLUSION 0 -#define EAXSOURCE_DEFAULTOCCLUSION 0 - -#define EAXSOURCE_MINOCCLUSIONLFRATIO 0.0f -#define EAXSOURCE_MAXOCCLUSIONLFRATIO 1.0f -#define EAXSOURCE_DEFAULTOCCLUSIONLFRATIO 0.25f - -#define EAXSOURCE_MINOCCLUSIONROOMRATIO 0.0f -#define EAXSOURCE_MAXOCCLUSIONROOMRATIO 10.0f -#define EAXSOURCE_DEFAULTOCCLUSIONROOMRATIO 1.5f - -#define EAXSOURCE_MINOCCLUSIONDIRECTRATIO 0.0f -#define EAXSOURCE_MAXOCCLUSIONDIRECTRATIO 10.0f -#define EAXSOURCE_DEFAULTOCCLUSIONDIRECTRATIO 1.0f - -#define EAXSOURCE_MINEXCLUSION (-10000) -#define EAXSOURCE_MAXEXCLUSION 0 -#define EAXSOURCE_DEFAULTEXCLUSION 0 - -#define EAXSOURCE_MINEXCLUSIONLFRATIO 0.0f -#define EAXSOURCE_MAXEXCLUSIONLFRATIO 1.0f -#define EAXSOURCE_DEFAULTEXCLUSIONLFRATIO 1.0f - -#define EAXSOURCE_MINOUTSIDEVOLUMEHF (-10000) -#define EAXSOURCE_MAXOUTSIDEVOLUMEHF 0 -#define EAXSOURCE_DEFAULTOUTSIDEVOLUMEHF 0 - -#define EAXSOURCE_MINDOPPLERFACTOR 0.0f -#define EAXSOURCE_MAXDOPPLERFACTOR 10.f -#define EAXSOURCE_DEFAULTDOPPLERFACTOR 1.0f - -#define EAXSOURCE_MINROLLOFFFACTOR 0.0f -#define EAXSOURCE_MAXROLLOFFFACTOR 10.f -#define EAXSOURCE_DEFAULTROLLOFFFACTOR 0.0f - -#define EAXSOURCE_MINROOMROLLOFFFACTOR 0.0f -#define EAXSOURCE_MAXROOMROLLOFFFACTOR 10.f -#define EAXSOURCE_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXSOURCE_MINAIRABSORPTIONFACTOR 0.0f -#define EAXSOURCE_MAXAIRABSORPTIONFACTOR 10.0f -#define EAXSOURCE_DEFAULTAIRABSORPTIONFACTOR 0.0f - -#define EAXSOURCE_DEFAULTFLAGS (EAXSOURCEFLAGS_DIRECTHFAUTO | \ - EAXSOURCEFLAGS_ROOMAUTO | \ - EAXSOURCEFLAGS_ROOMHFAUTO ) - -#define EAXSOURCE_DEFAULTACTIVEFXSLOTID {{ EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] }, \ - { EAX_PrimaryFXSlotID.Data1, EAX_PrimaryFXSlotID.Data2, \ - EAX_PrimaryFXSlotID.Data3, EAX_PrimaryFXSlotID.Data4[0],\ - EAX_PrimaryFXSlotID.Data4[1],EAX_PrimaryFXSlotID.Data4[2],\ - EAX_PrimaryFXSlotID.Data4[3],EAX_PrimaryFXSlotID.Data4[4],\ - EAX_PrimaryFXSlotID.Data4[5],EAX_PrimaryFXSlotID.Data4[6],\ - EAX_PrimaryFXSlotID.Data4[7] }} - - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Reverb Effect - -// EAX REVERB {0CF95C8F-A3CC-4849-B0B6-832ECC1822DF} -DEFINE_GUID(EAX_REVERB_EFFECT, - 0xcf95c8f, - 0xa3cc, - 0x4849, - 0xb0, 0xb6, 0x83, 0x2e, 0xcc, 0x18, 0x22, 0xdf); - -// Reverb effect properties -typedef enum -{ - EAXREVERB_NONE, - EAXREVERB_ALLPARAMETERS, - EAXREVERB_ENVIRONMENT, - EAXREVERB_ENVIRONMENTSIZE, - EAXREVERB_ENVIRONMENTDIFFUSION, - EAXREVERB_ROOM, - EAXREVERB_ROOMHF, - EAXREVERB_ROOMLF, - EAXREVERB_DECAYTIME, - EAXREVERB_DECAYHFRATIO, - EAXREVERB_DECAYLFRATIO, - EAXREVERB_REFLECTIONS, - EAXREVERB_REFLECTIONSDELAY, - EAXREVERB_REFLECTIONSPAN, - EAXREVERB_REVERB, - EAXREVERB_REVERBDELAY, - EAXREVERB_REVERBPAN, - EAXREVERB_ECHOTIME, - EAXREVERB_ECHODEPTH, - EAXREVERB_MODULATIONTIME, - EAXREVERB_MODULATIONDEPTH, - EAXREVERB_AIRABSORPTIONHF, - EAXREVERB_HFREFERENCE, - EAXREVERB_LFREFERENCE, - EAXREVERB_ROOMROLLOFFFACTOR, - EAXREVERB_FLAGS, -} EAXREVERB_PROPERTY; - -// OR these flags with property id -#define EAXREVERB_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXREVERB_DEFERRED 0x80000000 // changes take effect later -#define EAXREVERB_COMMITDEFERREDSETTINGS (EAXREVERB_NONE | \ - EAXREVERB_IMMEDIATE) - -// used by EAXREVERB_ENVIRONMENT -#ifndef EAX_ENVIRONMENTS_DEFINED -#define EAX_ENVIRONMENTS_DEFINED -enum -{ - EAX_ENVIRONMENT_GENERIC, - EAX_ENVIRONMENT_PADDEDCELL, - EAX_ENVIRONMENT_ROOM, - EAX_ENVIRONMENT_BATHROOM, - EAX_ENVIRONMENT_LIVINGROOM, - EAX_ENVIRONMENT_STONEROOM, - EAX_ENVIRONMENT_AUDITORIUM, - EAX_ENVIRONMENT_CONCERTHALL, - EAX_ENVIRONMENT_CAVE, - EAX_ENVIRONMENT_ARENA, - EAX_ENVIRONMENT_HANGAR, - EAX_ENVIRONMENT_CARPETEDHALLWAY, - EAX_ENVIRONMENT_HALLWAY, - EAX_ENVIRONMENT_STONECORRIDOR, - EAX_ENVIRONMENT_ALLEY, - EAX_ENVIRONMENT_FOREST, - EAX_ENVIRONMENT_CITY, - EAX_ENVIRONMENT_MOUNTAINS, - EAX_ENVIRONMENT_QUARRY, - EAX_ENVIRONMENT_PLAIN, - EAX_ENVIRONMENT_PARKINGLOT, - EAX_ENVIRONMENT_SEWERPIPE, - EAX_ENVIRONMENT_UNDERWATER, - EAX_ENVIRONMENT_DRUGGED, - EAX_ENVIRONMENT_DIZZY, - EAX_ENVIRONMENT_PSYCHOTIC, - - EAX_ENVIRONMENT_UNDEFINED, - - EAX_ENVIRONMENT_COUNT -}; -#endif - -// Used by EAXREVERB_FLAGS -// -// Note: The number and order of flags may change in future EAX versions. -// It is recommended to use the flag defines as follows: -// myFlags = EAXREVERBFLAGS_DECAYTIMESCALE | EAXREVERBFLAGS_REVERBSCALE; -// instead of: -// myFlags = 0x00000009; -// -// These flags determine what properties are affected by environment size. -#define EAXREVERBFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time -#define EAXREVERBFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level -#define EAXREVERBFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time -#define EAXREVERBFLAGS_REVERBSCALE 0x00000008 // reflections level -#define EAXREVERBFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time -#define EAXREVERBFLAGS_ECHOTIMESCALE 0x00000040 // echo time -#define EAXREVERBFLAGS_MODULATIONTIMESCALE 0x00000080 // modulation time -// This flag limits high-frequency decay time according to air absorption. -#define EAXREVERBFLAGS_DECAYHFLIMIT 0x00000020 -#define EAXREVERBFLAGS_RESERVED 0xFFFFFF00 // reserved future use - -// Use this structure for EAXREVERB_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all times and delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myReverb.lRoom = -1000; -// myReverb.lRoomHF = -100; -// ... -// myReverb.dwFlags = myFlags /* see EAXREVERBFLAGS below */ ; -// instead of: -// myReverb = { -1000, -100, ... , 0x00000009 }; -// If you want to save and load presets in binary form, you -// should define your own structure to insure future compatibility. -// -typedef struct _EAXREVERBPROPERTIES -{ - unsigned long ulEnvironment; // sets all reverb properties - float flEnvironmentSize; // environment size in meters - float flEnvironmentDiffusion; // environment diffusion - long lRoom; // room effect level (at mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lRoomLF; // relative room effect level at low frequencies - float flDecayTime; // reverberation decay time at mid frequencies - float flDecayHFRatio; // high-frequency to mid-frequency decay time ratio - float flDecayLFRatio; // low-frequency to mid-frequency decay time ratio - long lReflections; // early reflections level relative to room effect - float flReflectionsDelay; // initial reflection delay time - EAXVECTOR vReflectionsPan; // early reflections panning vector - long lReverb; // late reverberation level relative to room effect - float flReverbDelay; // late reverberation delay time relative to initial reflection - EAXVECTOR vReverbPan; // late reverberation panning vector - float flEchoTime; // echo time - float flEchoDepth; // echo depth - float flModulationTime; // modulation time - float flModulationDepth; // modulation depth - float flAirAbsorptionHF; // change in level per meter at high frequencies - float flHFReference; // reference high frequency - float flLFReference; // reference low frequency - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - unsigned long ulFlags; // modifies the behavior of properties -} EAXREVERBPROPERTIES, *LPEAXREVERBPROPERTIES; - -// Property ranges and defaults: -#define EAXREVERB_MINENVIRONMENT 0 -#define EAXREVERB_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1) -#define EAXREVERB_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC - -#define EAXREVERB_MINENVIRONMENTSIZE 1.0f -#define EAXREVERB_MAXENVIRONMENTSIZE 100.0f -#define EAXREVERB_DEFAULTENVIRONMENTSIZE 7.5f - -#define EAXREVERB_MINENVIRONMENTDIFFUSION 0.0f -#define EAXREVERB_MAXENVIRONMENTDIFFUSION 1.0f -#define EAXREVERB_DEFAULTENVIRONMENTDIFFUSION 1.0f - -#define EAXREVERB_MINROOM (-10000) -#define EAXREVERB_MAXROOM 0 -#define EAXREVERB_DEFAULTROOM (-1000) - -#define EAXREVERB_MINROOMHF (-10000) -#define EAXREVERB_MAXROOMHF 0 -#define EAXREVERB_DEFAULTROOMHF (-100) - -#define EAXREVERB_MINROOMLF (-10000) -#define EAXREVERB_MAXROOMLF 0 -#define EAXREVERB_DEFAULTROOMLF 0 - -#define EAXREVERB_MINDECAYTIME 0.1f -#define EAXREVERB_MAXDECAYTIME 20.0f -#define EAXREVERB_DEFAULTDECAYTIME 1.49f - -#define EAXREVERB_MINDECAYHFRATIO 0.1f -#define EAXREVERB_MAXDECAYHFRATIO 2.0f -#define EAXREVERB_DEFAULTDECAYHFRATIO 0.83f - -#define EAXREVERB_MINDECAYLFRATIO 0.1f -#define EAXREVERB_MAXDECAYLFRATIO 2.0f -#define EAXREVERB_DEFAULTDECAYLFRATIO 1.00f - -#define EAXREVERB_MINREFLECTIONS (-10000) -#define EAXREVERB_MAXREFLECTIONS 1000 -#define EAXREVERB_DEFAULTREFLECTIONS (-2602) - -#define EAXREVERB_MINREFLECTIONSDELAY 0.0f -#define EAXREVERB_MAXREFLECTIONSDELAY 0.3f -#define EAXREVERB_DEFAULTREFLECTIONSDELAY 0.007f - -#define EAXREVERB_DEFAULTREFLECTIONSPAN {0.0f, 0.0f, 0.0f} - -#define EAXREVERB_MINREVERB (-10000) -#define EAXREVERB_MAXREVERB 2000 -#define EAXREVERB_DEFAULTREVERB 200 - -#define EAXREVERB_MINREVERBDELAY 0.0f -#define EAXREVERB_MAXREVERBDELAY 0.1f -#define EAXREVERB_DEFAULTREVERBDELAY 0.011f - -#define EAXREVERB_DEFAULTREVERBPAN {0.0f, 0.0f, 0.0f} - -#define EAXREVERB_MINECHOTIME 0.075f -#define EAXREVERB_MAXECHOTIME 0.25f -#define EAXREVERB_DEFAULTECHOTIME 0.25f - -#define EAXREVERB_MINECHODEPTH 0.0f -#define EAXREVERB_MAXECHODEPTH 1.0f -#define EAXREVERB_DEFAULTECHODEPTH 0.0f - -#define EAXREVERB_MINMODULATIONTIME 0.04f -#define EAXREVERB_MAXMODULATIONTIME 4.0f -#define EAXREVERB_DEFAULTMODULATIONTIME 0.25f - -#define EAXREVERB_MINMODULATIONDEPTH 0.0f -#define EAXREVERB_MAXMODULATIONDEPTH 1.0f -#define EAXREVERB_DEFAULTMODULATIONDEPTH 0.0f - -#define EAXREVERB_MINAIRABSORPTIONHF (-100.0f) -#define EAXREVERB_MAXAIRABSORPTIONHF 0.0f -#define EAXREVERB_DEFAULTAIRABSORPTIONHF (-5.0f) - -#define EAXREVERB_MINHFREFERENCE 1000.0f -#define EAXREVERB_MAXHFREFERENCE 20000.0f -#define EAXREVERB_DEFAULTHFREFERENCE 5000.0f - -#define EAXREVERB_MINLFREFERENCE 20.0f -#define EAXREVERB_MAXLFREFERENCE 1000.0f -#define EAXREVERB_DEFAULTLFREFERENCE 250.0f - -#define EAXREVERB_MINROOMROLLOFFFACTOR 0.0f -#define EAXREVERB_MAXROOMROLLOFFFACTOR 10.0f -#define EAXREVERB_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXREVERB_DEFAULTFLAGS (EAXREVERBFLAGS_DECAYTIMESCALE | \ - EAXREVERBFLAGS_REFLECTIONSSCALE | \ - EAXREVERBFLAGS_REFLECTIONSDELAYSCALE | \ - EAXREVERBFLAGS_REVERBSCALE | \ - EAXREVERBFLAGS_REVERBDELAYSCALE | \ - EAXREVERBFLAGS_DECAYHFLIMIT) -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// - -// New Effect Types - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// AGC Compressor Effect - -// EAX AGC COMPRESSOR {BFB7A01E-7825-4039-927F-3AABDA0C560} - -DEFINE_GUID(EAX_AGCCOMPRESSOR_EFFECT, - 0xbfb7a01e, - 0x7825, - 0x4039, - 0x92, 0x7f, 0x3, 0xaa, 0xbd, 0xa0, 0xc5, 0x60); - -// AGC Compressor properties -typedef enum -{ - EAXAGCCOMPRESSOR_NONE, - EAXAGCCOMPRESSOR_ALLPARAMETERS, - EAXAGCCOMPRESSOR_ONOFF -} EAXAGCCOMPRESSOR_PROPERTY; - -// OR these flags with property id -#define EAXAGCCOMPRESSOR_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXAGCCOMPRESSOR_DEFERRED 0x80000000 // changes take effect later -#define EAXAGCCOMPRESSOR_COMMITDEFERREDSETTINGS (EAXAGCCOMPRESSOR_NONE | \ - EAXAGCCOMPRESSOR_IMMEDIATE) - -// Use this structure for EAXAGCCOMPRESSOR_ALLPARAMETERS -typedef struct _EAXAGCCOMPRESSORPROPERTIES -{ - unsigned long ulOnOff; // Switch Compressor on or off -} EAXAGCCOMPRESSORPROPERTIES, *LPEAXAGCCOMPRESSORPROPERTIES; - -// Property ranges and defaults: - -#define EAXAGCCOMPRESSOR_MINONOFF 0 -#define EAXAGCCOMPRESSOR_MAXONOFF 1 -#define EAXAGCCOMPRESSOR_DEFAULTONOFF 1 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Autowah Effect - -// EAX AUTOWAH {EC3130C0-AC7A-11D2-88DD-A024D13CE1} -DEFINE_GUID(EAX_AUTOWAH_EFFECT, - 0xec3130c0, - 0xac7a, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Autowah properties -typedef enum -{ - EAXAUTOWAH_NONE, - EAXAUTOWAH_ALLPARAMETERS, - EAXAUTOWAH_ATTACKTIME, - EAXAUTOWAH_RELEASETIME, - EAXAUTOWAH_RESONANCE, - EAXAUTOWAH_PEAKLEVEL -} EAXAUTOWAH_PROPERTY; - -// OR these flags with property id -#define EAXAUTOWAH_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXAUTOWAH_DEFERRED 0x80000000 // changes take effect later -#define EAXAUTOWAH_COMMITDEFERREDSETTINGS (EAXAUTOWAH_NONE | \ - EAXAUTOWAH_IMMEDIATE) - -// Use this structure for EAXAUTOWAH_ALLPARAMETERS -typedef struct _EAXAUTOWAHPROPERTIES -{ - float flAttackTime; // Attack time (seconds) - float flReleaseTime; // Release time (seconds) - long lResonance; // Resonance (mB) - long lPeakLevel; // Peak level (mB) -} EAXAUTOWAHPROPERTIES, *LPEAXAUTOWAHPROPERTIES; - -// Property ranges and defaults: - -#define EAXAUTOWAH_MINATTACKTIME 0.0001f -#define EAXAUTOWAH_MAXATTACKTIME 1.0f -#define EAXAUTOWAH_DEFAULTATTACKTIME 0.06f - -#define EAXAUTOWAH_MINRELEASETIME 0.0001f -#define EAXAUTOWAH_MAXRELEASETIME 1.0f -#define EAXAUTOWAH_DEFAULTRELEASETIME 0.06f - -#define EAXAUTOWAH_MINRESONANCE 600 -#define EAXAUTOWAH_MAXRESONANCE 6000 -#define EAXAUTOWAH_DEFAULTRESONANCE 6000 - -#define EAXAUTOWAH_MINPEAKLEVEL (-9000) -#define EAXAUTOWAH_MAXPEAKLEVEL 9000 -#define EAXAUTOWAH_DEFAULTPEAKLEVEL 2100 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Chorus Effect - -// EAX CHORUS {DE6D6FE0-AC79-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_CHORUS_EFFECT, - 0xde6d6fe0, - 0xac79, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - - -// Chorus properties -typedef enum -{ - EAXCHORUS_NONE, - EAXCHORUS_ALLPARAMETERS, - EAXCHORUS_WAVEFORM, - EAXCHORUS_PHASE, - EAXCHORUS_RATE, - EAXCHORUS_DEPTH, - EAXCHORUS_FEEDBACK, - EAXCHORUS_DELAY -} EAXCHORUS_PROPERTY; - -// OR these flags with property id -#define EAXCHORUS_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXCHORUS_DEFERRED 0x80000000 // changes take effect later -#define EAXCHORUS_COMMITDEFERREDSETTINGS (EAXCHORUS_NONE | \ - EAXCHORUS_IMMEDIATE) - -// used by EAXCHORUS_WAVEFORM -enum -{ - EAX_CHORUS_SINUSOID, - EAX_CHORUS_TRIANGLE -}; - -// Use this structure for EAXCHORUS_ALLPARAMETERS -typedef struct _EAXCHORUSPROPERTIES -{ - unsigned long ulWaveform; // Waveform selector - see enum above - long lPhase; // Phase (Degrees) - float flRate; // Rate (Hz) - float flDepth; // Depth (0 to 1) - float flFeedback; // Feedback (-1 to 1) - float flDelay; // Delay (seconds) -} EAXCHORUSPROPERTIES, *LPEAXCHORUSPROPERTIES; - -// Property ranges and defaults: - -#define EAXCHORUS_MINWAVEFORM 0 -#define EAXCHORUS_MAXWAVEFORM 1 -#define EAXCHORUS_DEFAULTWAVEFORM 1 - -#define EAXCHORUS_MINPHASE (-180) -#define EAXCHORUS_MAXPHASE 180 -#define EAXCHORUS_DEFAULTPHASE 90 - -#define EAXCHORUS_MINRATE 0.0f -#define EAXCHORUS_MAXRATE 10.0f -#define EAXCHORUS_DEFAULTRATE 1.1f - -#define EAXCHORUS_MINDEPTH 0.0f -#define EAXCHORUS_MAXDEPTH 1.0f -#define EAXCHORUS_DEFAULTDEPTH 0.1f - -#define EAXCHORUS_MINFEEDBACK (-1.0f) -#define EAXCHORUS_MAXFEEDBACK 1.0f -#define EAXCHORUS_DEFAULTFEEDBACK 0.25f - -#define EAXCHORUS_MINDELAY 0.0f -#define EAXCHORUS_MAXDELAY 0.016f -#define EAXCHORUS_DEFAULTDELAY 0.016f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Distortion Effect - -// EAX DISTORTION {975A4CE0-AC7E-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_DISTORTION_EFFECT, - 0x975a4ce0, - 0xac7e, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Distortion properties -typedef enum -{ - EAXDISTORTION_NONE, - EAXDISTORTION_ALLPARAMETERS, - EAXDISTORTION_EDGE, - EAXDISTORTION_GAIN, - EAXDISTORTION_LOWPASSCUTOFF, - EAXDISTORTION_EQCENTER, - EAXDISTORTION_EQBANDWIDTH -} EAXDISTORTION_PROPERTY; - -// OR these flags with property id -#define EAXDISTORTION_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXDISTORTION_DEFERRED 0x80000000 // changes take effect later -#define EAXDISTORTION_COMMITDEFERREDSETTINGS (EAXDISTORTION_NONE | \ - EAXDISTORTION_IMMEDIATE) - -// Use this structure for EAXDISTORTION_ALLPARAMETERS -typedef struct _EAXDISTORTIONPROPERTIES -{ - float flEdge; // Controls the shape of the distortion (0 to 1) - long lGain; // Controls the post distortion gain (mB) - float flLowPassCutOff; // Controls the cut-off of the filter pre-distortion (Hz) - float flEQCenter; // Controls the center frequency of the EQ post-distortion (Hz) - float flEQBandwidth; // Controls the bandwidth of the EQ post-distortion (Hz) -} EAXDISTORTIONPROPERTIES, *LPEAXDISTORTIONPROPERTIES; - -// Property ranges and defaults: - -#define EAXDISTORTION_MINEDGE 0.0f -#define EAXDISTORTION_MAXEDGE 1.0f -#define EAXDISTORTION_DEFAULTEDGE 0.2f - -#define EAXDISTORTION_MINGAIN (-6000) -#define EAXDISTORTION_MAXGAIN 0 -#define EAXDISTORTION_DEFAULTGAIN (-2600) - -#define EAXDISTORTION_MINLOWPASSCUTOFF 80.0f -#define EAXDISTORTION_MAXLOWPASSCUTOFF 24000.0f -#define EAXDISTORTION_DEFAULTLOWPASSCUTOFF 8000.0f - -#define EAXDISTORTION_MINEQCENTER 80.0f -#define EAXDISTORTION_MAXEQCENTER 24000.0f -#define EAXDISTORTION_DEFAULTEQCENTER 3600.0f - -#define EAXDISTORTION_MINEQBANDWIDTH 80.0f -#define EAXDISTORTION_MAXEQBANDWIDTH 24000.0f -#define EAXDISTORTION_DEFAULTEQBANDWIDTH 3600.0f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Echo Effect - -// EAX ECHO {E9F1BC0-AC82-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_ECHO_EFFECT, - 0xe9f1bc0, - 0xac82, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Echo properties -typedef enum -{ - EAXECHO_NONE, - EAXECHO_ALLPARAMETERS, - EAXECHO_DELAY, - EAXECHO_LRDELAY, - EAXECHO_DAMPING, - EAXECHO_FEEDBACK, - EAXECHO_SPREAD -} EAXECHO_PROPERTY; - -// OR these flags with property id -#define EAXECHO_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXECHO_DEFERRED 0x80000000 // changes take effect later -#define EAXECHO_COMMITDEFERREDSETTINGS (EAXECHO_NONE | \ - EAXECHO_IMMEDIATE) - -// Use this structure for EAXECHO_ALLPARAMETERS -typedef struct _EAXECHOPROPERTIES -{ - float flDelay; // Controls the initial delay time (seconds) - float flLRDelay; // Controls the delay time between the first and second taps (seconds) - float flDamping; // Controls a low-pass filter that dampens the echoes (0 to 1) - float flFeedback; // Controls the duration of echo repetition (0 to 1) - float flSpread; // Controls the left-right spread of the echoes -} EAXECHOPROPERTIES, *LPEAXECHOPROPERTIES; - -// Property ranges and defaults: - -#define EAXECHO_MINDAMPING 0.0f -#define EAXECHO_MAXDAMPING 0.99f -#define EAXECHO_DEFAULTDAMPING 0.5f - -#define EAXECHO_MINDELAY 0.0f -#define EAXECHO_MAXDELAY 0.207f -#define EAXECHO_DEFAULTDELAY 0.1f - -#define EAXECHO_MINLRDELAY 0.0f -#define EAXECHO_MAXLRDELAY 0.404f -#define EAXECHO_DEFAULTLRDELAY 0.1f - -#define EAXECHO_MINFEEDBACK 0.0f -#define EAXECHO_MAXFEEDBACK 1.0f -#define EAXECHO_DEFAULTFEEDBACK 0.5f - -#define EAXECHO_MINSPREAD (-1.0f) -#define EAXECHO_MAXSPREAD 1.0f -#define EAXECHO_DEFAULTSPREAD (-1.0f) - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Equalizer Effect - -// EAX EQUALIZER {65F94CE0-9793-11D3-939D-C0F02DD6F0} - -DEFINE_GUID(EAX_EQUALIZER_EFFECT, - 0x65f94ce0, - 0x9793, - 0x11d3, - 0x93, 0x9d, 0x0, 0xc0, 0xf0, 0x2d, 0xd6, 0xf0); - - -// Equalizer properties -typedef enum -{ - EAXEQUALIZER_NONE, - EAXEQUALIZER_ALLPARAMETERS, - EAXEQUALIZER_LOWGAIN, - EAXEQUALIZER_LOWCUTOFF, - EAXEQUALIZER_MID1GAIN, - EAXEQUALIZER_MID1CENTER, - EAXEQUALIZER_MID1WIDTH, - EAXEQUALIZER_MID2GAIN, - EAXEQUALIZER_MID2CENTER, - EAXEQUALIZER_MID2WIDTH, - EAXEQUALIZER_HIGHGAIN, - EAXEQUALIZER_HIGHCUTOFF -} EAXEQUALIZER_PROPERTY; - -// OR these flags with property id -#define EAXEQUALIZER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXEQUALIZER_DEFERRED 0x80000000 // changes take effect later -#define EAXEQUALIZER_COMMITDEFERREDSETTINGS (EAXEQUALIZER_NONE | \ - EAXEQUALIZER_IMMEDIATE) - -// Use this structure for EAXEQUALIZER_ALLPARAMETERS -typedef struct _EAXEQUALIZERPROPERTIES -{ - long lLowGain; // (mB) - float flLowCutOff; // (Hz) - long lMid1Gain; // (mB) - float flMid1Center; // (Hz) - float flMid1Width; // (octaves) - long lMid2Gain; // (mB) - float flMid2Center; // (Hz) - float flMid2Width; // (octaves) - long lHighGain; // (mB) - float flHighCutOff; // (Hz) -} EAXEQUALIZERPROPERTIES, *LPEAXEQUALIZERPROPERTIES; - -// Property ranges and defaults: - -#define EAXEQUALIZER_MINLOWGAIN (-1800) -#define EAXEQUALIZER_MAXLOWGAIN 1800 -#define EAXEQUALIZER_DEFAULTLOWGAIN 0 - -#define EAXEQUALIZER_MINLOWCUTOFF 50.0f -#define EAXEQUALIZER_MAXLOWCUTOFF 800.0f -#define EAXEQUALIZER_DEFAULTLOWCUTOFF 200.0f - -#define EAXEQUALIZER_MINMID1GAIN (-1800) -#define EAXEQUALIZER_MAXMID1GAIN 1800 -#define EAXEQUALIZER_DEFAULTMID1GAIN 0 - -#define EAXEQUALIZER_MINMID1CENTER 200.0f -#define EAXEQUALIZER_MAXMID1CENTER 3000.0f -#define EAXEQUALIZER_DEFAULTMID1CENTER 500.0f - -#define EAXEQUALIZER_MINMID1WIDTH 0.01f -#define EAXEQUALIZER_MAXMID1WIDTH 1.0f -#define EAXEQUALIZER_DEFAULTMID1WIDTH 1.0f - -#define EAXEQUALIZER_MINMID2GAIN (-1800) -#define EAXEQUALIZER_MAXMID2GAIN 1800 -#define EAXEQUALIZER_DEFAULTMID2GAIN 0 - -#define EAXEQUALIZER_MINMID2CENTER 1000.0f -#define EAXEQUALIZER_MAXMID2CENTER 8000.0f -#define EAXEQUALIZER_DEFAULTMID2CENTER 3000.0f - -#define EAXEQUALIZER_MINMID2WIDTH 0.01f -#define EAXEQUALIZER_MAXMID2WIDTH 1.0f -#define EAXEQUALIZER_DEFAULTMID2WIDTH 1.0f - -#define EAXEQUALIZER_MINHIGHGAIN (-1800) -#define EAXEQUALIZER_MAXHIGHGAIN 1800 -#define EAXEQUALIZER_DEFAULTHIGHGAIN 0 - -#define EAXEQUALIZER_MINHIGHCUTOFF 4000.0f -#define EAXEQUALIZER_MAXHIGHCUTOFF 16000.0f -#define EAXEQUALIZER_DEFAULTHIGHCUTOFF 6000.0f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Flanger Effect - -// EAX FLANGER {A70007C0-7D2-11D3-9B1E-A024D13CE1} - -DEFINE_GUID(EAX_FLANGER_EFFECT, - 0xa70007c0, - 0x7d2, - 0x11d3, - 0x9b, 0x1e, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Flanger properties -typedef enum -{ - EAXFLANGER_NONE, - EAXFLANGER_ALLPARAMETERS, - EAXFLANGER_WAVEFORM, - EAXFLANGER_PHASE, - EAXFLANGER_RATE, - EAXFLANGER_DEPTH, - EAXFLANGER_FEEDBACK, - EAXFLANGER_DELAY -} EAXFLANGER_PROPERTY; - -// OR these flags with property id -#define EAXFLANGER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXFLANGER_DEFERRED 0x80000000 // changes take effect later -#define EAXFLANGER_COMMITDEFERREDSETTINGS (EAXFLANGER_NONE | \ - EAXFLANGER_IMMEDIATE) - -// used by EAXFLANGER_WAVEFORM -enum -{ - EAX_FLANGER_SINUSOID, - EAX_FLANGER_TRIANGLE -}; - -// Use this structure for EAXFLANGER_ALLPARAMETERS -typedef struct _EAXFLANGERPROPERTIES -{ - unsigned long ulWaveform; // Waveform selector - see enum above - long lPhase; // Phase (Degrees) - float flRate; // Rate (Hz) - float flDepth; // Depth (0 to 1) - float flFeedback; // Feedback (0 to 1) - float flDelay; // Delay (seconds) -} EAXFLANGERPROPERTIES, *LPEAXFLANGERPROPERTIES; - -// Property ranges and defaults: - -#define EAXFLANGER_MINWAVEFORM 0 -#define EAXFLANGER_MAXWAVEFORM 1 -#define EAXFLANGER_DEFAULTWAVEFORM 1 - -#define EAXFLANGER_MINPHASE (-180) -#define EAXFLANGER_MAXPHASE 180 -#define EAXFLANGER_DEFAULTPHASE 0 - -#define EAXFLANGER_MINRATE 0.0f -#define EAXFLANGER_MAXRATE 10.0f -#define EAXFLANGER_DEFAULTRATE 0.27f - -#define EAXFLANGER_MINDEPTH 0.0f -#define EAXFLANGER_MAXDEPTH 1.0f -#define EAXFLANGER_DEFAULTDEPTH 1.0f - -#define EAXFLANGER_MINFEEDBACK (-1.0f) -#define EAXFLANGER_MAXFEEDBACK 1.0f -#define EAXFLANGER_DEFAULTFEEDBACK (-0.5f) - -#define EAXFLANGER_MINDELAY 0.0f -#define EAXFLANGER_MAXDELAY 0.004f -#define EAXFLANGER_DEFAULTDELAY 0.002f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Frequency Shifter Effect - -// EAX FREQUENCY SHIFTER {DC3E1880-9212-11D3-939D-C0F02DD6F0} - -DEFINE_GUID(EAX_FREQUENCYSHIFTER_EFFECT, - 0xdc3e1880, - 0x9212, - 0x11d3, - 0x93, 0x9d, 0x0, 0xc0, 0xf0, 0x2d, 0xd6, 0xf0); - -// Frequency Shifter properties -typedef enum -{ - EAXFREQUENCYSHIFTER_NONE, - EAXFREQUENCYSHIFTER_ALLPARAMETERS, - EAXFREQUENCYSHIFTER_FREQUENCY, - EAXFREQUENCYSHIFTER_LEFTDIRECTION, - EAXFREQUENCYSHIFTER_RIGHTDIRECTION -} EAXFREQUENCYSHIFTER_PROPERTY; - -// OR these flags with property id -#define EAXFREQUENCYSHIFTER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXFREQUENCYSHIFTER_DEFERRED 0x80000000 // changes take effect later -#define EAXFREQUENCYSHIFTER_COMMITDEFERREDSETTINGS (EAXFREQUENCYSHIFTER_NONE | \ - EAXFREQUENCYSHIFTER_IMMEDIATE) - -// used by EAXFREQUENCYSHIFTER_LEFTDIRECTION and EAXFREQUENCYSHIFTER_RIGHTDIRECTION -enum -{ - EAX_FREQUENCYSHIFTER_DOWN, - EAX_FREQUENCYSHIFTER_UP, - EAX_FREQUENCYSHIFTER_OFF -}; - -// Use this structure for EAXFREQUENCYSHIFTER_ALLPARAMETERS -typedef struct _EAXFREQUENCYSHIFTERPROPERTIES -{ - float flFrequency; // (Hz) - unsigned long ulLeftDirection; // see enum above - unsigned long ulRightDirection; // see enum above -} EAXFREQUENCYSHIFTERPROPERTIES, *LPEAXFREQUENCYSHIFTERPROPERTIES; - -// Property ranges and defaults: - -#define EAXFREQUENCYSHIFTER_MINFREQUENCY 0.0f -#define EAXFREQUENCYSHIFTER_MAXFREQUENCY 24000.0f -#define EAXFREQUENCYSHIFTER_DEFAULTFREQUENCY 0.0f - -#define EAXFREQUENCYSHIFTER_MINLEFTDIRECTION 0 -#define EAXFREQUENCYSHIFTER_MAXLEFTDIRECTION 2 -#define EAXFREQUENCYSHIFTER_DEFAULTLEFTDIRECTION 0 - -#define EAXFREQUENCYSHIFTER_MINRIGHTDIRECTION 0 -#define EAXFREQUENCYSHIFTER_MAXRIGHTDIRECTION 2 -#define EAXFREQUENCYSHIFTER_DEFAULTRIGHTDIRECTION 0 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Vocal Morpher Effect - -// EAX VOCAL MORPHER {E41CF10C-3383-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_VOCALMORPHER_EFFECT, - 0xe41cf10c, - 0x3383, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Vocal Morpher properties -typedef enum -{ - EAXVOCALMORPHER_NONE, - EAXVOCALMORPHER_ALLPARAMETERS, - EAXVOCALMORPHER_PHONEMEA, - EAXVOCALMORPHER_PHONEMEACOARSETUNING, - EAXVOCALMORPHER_PHONEMEB, - EAXVOCALMORPHER_PHONEMEBCOARSETUNING, - EAXVOCALMORPHER_WAVEFORM, - EAXVOCALMORPHER_RATE -} EAXVOCALMORPHER_PROPERTY; - -// OR these flags with property id -#define EAXVOCALMORPHER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXVOCALMORPHER_DEFERRED 0x80000000 // changes take effect later -#define EAXVOCALMORPHER_COMMITDEFERREDSETTINGS (EAXVOCALMORPHER_NONE | \ - EAXVOCALMORPHER_IMMEDIATE) - -// used by EAXVOCALMORPHER_PHONEMEA and EAXVOCALMORPHER_PHONEMEB -enum -{ - A, E, I, O, U, AA, AE, AH, AO, EH, ER, IH, IY, UH, UW, B, D, F, G, - J, K, L, M, N, P, R, S, T, V, Z -}; - -// used by EAXVOCALMORPHER_WAVEFORM -enum -{ - EAX_VOCALMORPHER_SINUSOID, - EAX_VOCALMORPHER_TRIANGLE, - EAX_VOCALMORPHER_SAWTOOTH -}; - -// Use this structure for EAXVOCALMORPHER_ALLPARAMETERS -typedef struct _EAXVOCALMORPHERPROPERTIES -{ - unsigned long ulPhonemeA; // see enum above - long lPhonemeACoarseTuning; // (semitones) - unsigned long ulPhonemeB; // see enum above - long lPhonemeBCoarseTuning; // (semitones) - unsigned long ulWaveform; // Waveform selector - see enum above - float flRate; // (Hz) -} EAXVOCALMORPHERPROPERTIES, *LPEAXVOCALMORPHERPROPERTIES; - -// Property ranges and defaults: - -#define EAXVOCALMORPHER_MINPHONEMEA 0 -#define EAXVOCALMORPHER_MAXPHONEMEA 29 -#define EAXVOCALMORPHER_DEFAULTPHONEMEA 0 - -#define EAXVOCALMORPHER_MINPHONEMEACOARSETUNING (-24) -#define EAXVOCALMORPHER_MAXPHONEMEACOARSETUNING 24 -#define EAXVOCALMORPHER_DEFAULTPHONEMEACOARSETUNING 0 - -#define EAXVOCALMORPHER_MINPHONEMEB 0 -#define EAXVOCALMORPHER_MAXPHONEMEB 29 -#define EAXVOCALMORPHER_DEFAULTPHONEMEB 10 - -#define EAXVOCALMORPHER_MINPHONEMEBCOARSETUNING (-24) -#define EAXVOCALMORPHER_MAXPHONEMEBCOARSETUNING 24 -#define EAXVOCALMORPHER_DEFAULTPHONEMEBCOARSETUNING 0 - -#define EAXVOCALMORPHER_MINWAVEFORM 0 -#define EAXVOCALMORPHER_MAXWAVEFORM 2 -#define EAXVOCALMORPHER_DEFAULTWAVEFORM 0 - -#define EAXVOCALMORPHER_MINRATE 0.0f -#define EAXVOCALMORPHER_MAXRATE 10.0f -#define EAXVOCALMORPHER_DEFAULTRATE 1.41f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Pitch Shifter Effect - -// EAX PITCH SHIFTER {E7905100-AFB2-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_PITCHSHIFTER_EFFECT, - 0xe7905100, - 0xafb2, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Pitch Shifter properties -typedef enum -{ - EAXPITCHSHIFTER_NONE, - EAXPITCHSHIFTER_ALLPARAMETERS, - EAXPITCHSHIFTER_COARSETUNE, - EAXPITCHSHIFTER_FINETUNE -} EAXPITCHSHIFTER_PROPERTY; - -// OR these flags with property id -#define EAXPITCHSHIFTER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXPITCHSHIFTER_DEFERRED 0x80000000 // changes take effect later -#define EAXPITCHSHIFTER_COMMITDEFERREDSETTINGS (EAXPITCHSHIFTER_NONE | \ - EAXPITCHSHIFTER_IMMEDIATE) - -// Use this structure for EAXPITCHSHIFTER_ALLPARAMETERS -typedef struct _EAXPITCHSHIFTERPROPERTIES -{ - long lCoarseTune; // Amount of pitch shift (semitones) - long lFineTune; // Amount of pitch shift (cents) -} EAXPITCHSHIFTERPROPERTIES, *LPEAXPITCHSHIFTERPROPERTIES; - -// Property ranges and defaults: - -#define EAXPITCHSHIFTER_MINCOARSETUNE (-12) -#define EAXPITCHSHIFTER_MAXCOARSETUNE 12 -#define EAXPITCHSHIFTER_DEFAULTCOARSETUNE 12 - -#define EAXPITCHSHIFTER_MINFINETUNE (-50) -#define EAXPITCHSHIFTER_MAXFINETUNE 50 -#define EAXPITCHSHIFTER_DEFAULTFINETUNE 0 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Ring Modulator Effect - -// EAX RING MODULATOR {B89FE60-AFB5-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_RINGMODULATOR_EFFECT, - 0xb89fe60, - 0xafb5, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Ring Modulator properties -typedef enum -{ - EAXRINGMODULATOR_NONE, - EAXRINGMODULATOR_ALLPARAMETERS, - EAXRINGMODULATOR_FREQUENCY, - EAXRINGMODULATOR_HIGHPASSCUTOFF, - EAXRINGMODULATOR_WAVEFORM -} EAXRINGMODULATOR_PROPERTY; - -// OR these flags with property id -#define EAXRINGMODULATOR_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXRINGMODULATOR_DEFERRED 0x80000000 // changes take effect later -#define EAXRINGMODULATOR_COMMITDEFERREDSETTINGS (EAXRINGMODULATOR_NONE | \ - EAXRINGMODULATOR_IMMEDIATE) - -// used by EAXRINGMODULATOR_WAVEFORM -enum -{ - EAX_RINGMODULATOR_SINUSOID, - EAX_RINGMODULATOR_SAWTOOTH, - EAX_RINGMODULATOR_SQUARE -}; - -// Use this structure for EAXRINGMODULATOR_ALLPARAMETERS -typedef struct _EAXRINGMODULATORPROPERTIES -{ - float flFrequency; // Frequency of modulation (Hz) - float flHighPassCutOff; // Cut-off frequency of high-pass filter (Hz) - unsigned long ulWaveform; // Waveform selector - see enum above -} EAXRINGMODULATORPROPERTIES, *LPEAXRINGMODULATORPROPERTIES; - -// Property ranges and defaults: - -#define EAXRINGMODULATOR_MINFREQUENCY 0.0f -#define EAXRINGMODULATOR_MAXFREQUENCY 8000.0f -#define EAXRINGMODULATOR_DEFAULTFREQUENCY 440.0f - -#define EAXRINGMODULATOR_MINHIGHPASSCUTOFF 0.0f -#define EAXRINGMODULATOR_MAXHIGHPASSCUTOFF 24000.0f -#define EAXRINGMODULATOR_DEFAULTHIGHPASSCUTOFF 800.0f - -#define EAXRINGMODULATOR_MINWAVEFORM 0 -#define EAXRINGMODULATOR_MAXWAVEFORM 2 -#define EAXRINGMODULATOR_DEFAULTWAVEFORM 0 - -//////////////////////////////////////////////////////////////////////////// - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif diff --git a/neo/openal/include/eax5.h b/neo/openal/include/eax5.h deleted file mode 100644 index e4cba6d9..00000000 --- a/neo/openal/include/eax5.h +++ /dev/null @@ -1,1792 +0,0 @@ -/*******************************************************************\ -* * -* EAX.H - Environmental Audio Extensions version 5.0 * -* for OpenAL and DirectSound3D * -* * -* File revision 0.9.6 version a (July 14th 2004) * -* EAX 5.0 API Spec version 1.5 * -* * -\*******************************************************************/ - -#ifndef EAX_H_INCLUDED -#define EAX_H_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#ifndef OPENAL - #include - - /* - * EAX Unified Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5} - */ - DEFINE_GUID(CLSID_EAXDirectSound, - 0x4ff53b81, - 0x1ce0, - 0x11d3, - 0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5); - - /* - * EAX Unified Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C} - */ - DEFINE_GUID(CLSID_EAXDirectSound8, - 0xca503b60, - 0xb176, - 0x11d4, - 0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc); - - - -#ifdef DIRECTSOUND_VERSION -#if DIRECTSOUND_VERSION >= 0x0800 - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate8(GUID*, LPDIRECTSOUND8*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE8)(GUID*, LPDIRECTSOUND8*, IUnknown FAR*); -#endif -#endif - - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate(GUID*, LPDIRECTSOUND*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE)(GUID*, LPDIRECTSOUND*, IUnknown FAR*); - -#else // OPENAL - #include - - #ifndef GUID_DEFINED - #define GUID_DEFINED - typedef struct _GUID - { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; - } GUID; - #endif // GUID_DEFINED - - #ifndef DEFINE_GUID - #ifndef INITGUID - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID /*FAR*/ name - #else - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - #endif // INITGUID - #endif // DEFINE_GUID - - /* - * EAX OpenAL Extensions - */ - typedef ALenum (*EAXSet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALenum (*EAXGet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALboolean (*EAXSetBufferMode)(ALsizei, ALuint*, ALint); - typedef ALenum (*EAXGetBufferMode)(ALuint, ALint*); -#endif - -#pragma pack(push, 4) - - - - -//////////////////////////////////////////////////////////////////////////// -// Constants - -#define EAX_MAX_FXSLOTS 4 -#define EAX_MAX_ACTIVE_FXSLOTS 4 - -// The EAX_NULL_GUID is used by EAXFXSLOT_LOADEFFECT, EAXCONTEXT_PRIMARYFXSLOTID -// and EAXSOURCE_ACTIVEFXSLOTID - -// {00000000-0000-0000-0000-000000000000} -DEFINE_GUID(EAX_NULL_GUID, - 0x00000000, - 0x0000, - 0x0000, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - -// The EAX_PrimaryFXSlotID GUID is used by EAXSOURCE_ACTIVEFXSLOTID -// {F317866D-924C-450C-861B-E6DAA25E7C20} -DEFINE_GUID(EAX_PrimaryFXSlotID, - 0xf317866d, - 0x924c, - 0x450c, - 0x86, 0x1b, 0xe6, 0xda, 0xa2, 0x5e, 0x7c, 0x20); - - - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Structures - -// Use this structure for EAXCONTEXT_EAXSESSION property -#ifndef EAXSESSIONPROPERTIES_DEFINED -#define EAXSESSIONPROPERTIES_DEFINED -typedef struct _EAXSESSIONPROPERTIES -{ - unsigned long ulEAXVersion; - unsigned long ulMaxActiveSends; -} EAXSESSIONPROPERTIES, *LPEAXSESSIONPROPERTIES; -#endif - -// Use this structure for EAXCONTEXT_ALL property. -#ifndef EAXCONTEXTPROPERTIES_DEFINED -#define EAXCONTEXTPROPERTIES_DEFINED -typedef struct _EAXCONTEXTPROPERTIES -{ - GUID guidPrimaryFXSlotID; - float flDistanceFactor; - float flAirAbsorptionHF; - float flHFReference; - float flMacroFXFactor; -} EAXCONTEXTPROPERTIES, *LPEAXCONTEXTPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myBuffer.lDirect = 0; -// myBuffer.lDirectHF = -200; -// ... -// myBuffer.dwFlags = myFlags /* see EAXSOURCEFLAGS below */ ; -// instead of: -// myBuffer = { 0, -200, ... , 0x00000003 }; -// -#ifndef EAXSOURCEPROPERTIES_DEFINED -#define EAXSOURCEPROPERTIES_DEFINED -typedef struct _EAXSOURCEPROPERTIES -{ - long lDirect; // direct path level (at low and mid frequencies) - long lDirectHF; // relative direct path level at high frequencies - long lRoom; // room effect level (at low and mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lObstruction; // main obstruction control (attenuation at high frequencies) - float flObstructionLFRatio; // obstruction low-frequency level re. main control - long lOcclusion; // main occlusion control (attenuation at high frequencies) - float flOcclusionLFRatio; // occlusion low-frequency level re. main control - float flOcclusionRoomRatio; // relative occlusion control for room effect - float flOcclusionDirectRatio; // relative occlusion control for direct path - long lExclusion; // main exlusion control (attenuation at high frequencies) - float flExclusionLFRatio; // exclusion low-frequency level re. main control - long lOutsideVolumeHF; // outside sound cone level at high frequencies - float flDopplerFactor; // like DS3D flDopplerFactor but per source - float flRolloffFactor; // like DS3D flRolloffFactor but per source - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - float flAirAbsorptionFactor; // multiplies EAXREVERB_AIRABSORPTIONHF - unsigned long ulFlags; // modifies the behavior of properties - float flMacroFXFactor; //###TODO### add comment here -} EAXSOURCEPROPERTIES, *LPEAXSOURCEPROPERTIES; -#endif - - -// Use this structure for EAXSOURCE_ALL2DPARAMETERS -// - all levels are hundredths of decibels -// - all delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myBuffer.lDirect = 0; -// myBuffer.lDirectHF = -200; -// ... -// myBuffer.dwFlags = myFlags /* see EAXSOURCEFLAGS below */ ; -// instead of: -// myBuffer = { 0, -200, ... , 0x00000003 }; -// -#ifndef EAXSOURCE2DPROPERTIES_DEFINED -#define EAXSOURCE2DPROPERTIES_DEFINED -typedef struct _EAXSOURCE2DPROPERTIES -{ - long lDirect; // direct path level (at low and mid frequencies) - long lDirectHF; // relative direct path level at high frequencies - long lRoom; // room effect level (at low and mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - unsigned long ulFlags; // modifies the behavior of properties -} EAXSOURCE2DPROPERTIES, *LPEAXSOURCE2DPROPERTIES; -#endif - - -// Use this structure for EAXSOURCE_ALLSENDPARAMETERS -// - all levels are hundredths of decibels -// -#ifndef EAXSOURCEALLSENDPROPERTIES_DEFINED -#define EAXSOURCEALLSENDPROPERTIES_DEFINED -typedef struct _EAXSOURCEALLSENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lSend; // send level (at low and mid frequencies) - long lSendHF; // relative send level at high frequencies - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; - long lExclusion; - float flExclusionLFRatio; -} EAXSOURCEALLSENDPROPERTIES, *LPEAXSOURCEALLSENDPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_SPEAKERLEVELS -// - level is in hundredths of decibels -// -#ifndef EAXSPEAKERLEVELPROPERTIES_DEFINED -#define EAXSPEAKERLEVELPROPERTIES_DEFINED -typedef struct _EAXSPEAKERLEVELPROPERTIES -{ - long lSpeakerID; - long lLevel; -} EAXSPEAKERLEVELPROPERTIES, *LPEAXSPEAKERLEVELPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_ACTIVEFXSLOTID -#ifndef EAXACTIVEFXSLOTS_DEFINED -#define EAXACTIVEFXSLOTS_DEFINED -typedef struct _EAXACTIVEFXSLOTS -{ - GUID guidActiveFXSlots[EAX_MAX_ACTIVE_FXSLOTS]; -} EAXACTIVEFXSLOTS, *LPEAXACTIVEFXSLOTS; -#endif - -// Use this structure for EAXSOURCE_OBSTRUCTIONPARAMETERS property. -#ifndef EAXOBSTRUCTIONPROPERTIES_DEFINED -#define EAXOBSTRUCTIONPROPERTIES_DEFINED -typedef struct _EAXOBSTRUCTIONPROPERTIES -{ - long lObstruction; - float flObstructionLFRatio; -} EAXOBSTRUCTIONPROPERTIES, *LPEAXOBSTRUCTIONPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_OCCLUSIONPARAMETERS property. -#ifndef EAXOCCLUSIONPROPERTIES_DEFINED -#define EAXOCCLUSIONPROPERTIES_DEFINED -typedef struct _EAXOCCLUSIONPROPERTIES -{ - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; -} EAXOCCLUSIONPROPERTIES, *LPEAXOCCLUSIONPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_EXCLUSIONPARAMETERS property. -#ifndef EAXEXCLUSIONPROPERTIES_DEFINED -#define EAXEXCLUSIONPROPERTIES_DEFINED -typedef struct _EAXEXCLUSIONPROPERTIES -{ - long lExclusion; - float flExclusionLFRatio; -} EAXEXCLUSIONPROPERTIES, *LPEAXEXCLUSIONPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_SENDPARAMETERS properties. -#ifndef EAXSOURCESENDPROPERTIES_DEFINED -#define EAXSOURCESENDPROPERTIES_DEFINED -typedef struct _EAXSOURCESENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lSend; - long lSendHF; -} EAXSOURCESENDPROPERTIES, *LPEAXSOURCESENDPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_OCCLUSIONSENDPARAMETERS -#ifndef EAXSOURCEOCCLUSIONSENDPROPERTIES_DEFINED -#define EAXSOURCEOCCLUSIONSENDPROPERTIES_DEFINED -typedef struct _EAXSOURCEOCCLUSIONSENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; -} EAXSOURCEOCCLUSIONSENDPROPERTIES, *LPEAXSOURCEOCCLUSIONSENDPROPERTIES; -#endif - -// Use this structure for EAXSOURCE_EXCLUSIONSENDPARAMETERS -#ifndef EAXSOURCEEXCLUSIONSENDPROPERTIES_DEFINED -#define EAXSOURCEEXCLUSIONSENDPROPERTIES_DEFINED -typedef struct _EAXSOURCEEXCLUSIONSENDPROPERTIES -{ - GUID guidReceivingFXSlotID; - long lExclusion; - float flExclusionLFRatio; -} EAXSOURCEEXCLUSIONSENDPROPERTIES, *LPEAXSOURCEEXCLUSIONSENDPROPERTIES; -#endif - -// Use this structure for EAXFXSLOT_ALLPARAMETERS -// - all levels are hundredths of decibels -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myFXSlot.guidLoadEffect = EAX_REVERB_EFFECT; -// myFXSlot.lVolume = 0; -// myFXSlot.lLock = 1; -// myFXSlot.ulFlags = myFlags /* see EAXFXSLOTFLAGS below */ ; -// instead of: -// myFXSlot = { EAX_REVERB_EFFECT, 0, 1, 0x00000001 }; -// -#ifndef EAXFXSLOTPROPERTIES_DEFINED -#define EAXFXSLOTPROPERTIES_DEFINED -typedef struct _EAXFXSLOTPROPERTIES -{ - GUID guidLoadEffect; - long lVolume; - long lLock; - unsigned long ulFlags; - long lOcclusion; - float flOcclusionLFRatio; -} EAXFXSLOTPROPERTIES, *LPEAXFXSLOTPROPERTIES; -#endif - - -// Use this structure for EAXREVERB_REFLECTIONSPAN and EAXREVERB_REVERBPAN properties. -#ifndef EAXVECTOR_DEFINED -#define EAXVECTOR_DEFINED -typedef struct _EAXVECTOR { - float x; - float y; - float z; -} EAXVECTOR; -#endif - - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Error Codes - -#define EAX_OK 0 -#define EAXERR_INVALID_OPERATION (-1) -#define EAXERR_INVALID_VALUE (-2) -#define EAXERR_NO_EFFECT_LOADED (-3) -#define EAXERR_UNKNOWN_EFFECT (-4) -#define EAXERR_INCOMPATIBLE_SOURCE_TYPE (-5) -#define EAXERR_INCOMPATIBLE_EAX_VERSION (-6) -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Context Object - -// {57E13437-B932-4ab2-B8BD-5266C1A887EE} -DEFINE_GUID(EAXPROPERTYID_EAX50_Context, - 0x57e13437, - 0xb932, - 0x4ab2, - 0xb8, 0xbd, 0x52, 0x66, 0xc1, 0xa8, 0x87, 0xee); - -// For compatibility with future EAX versions: -#define EAXPROPERTYID_EAX_Context EAXPROPERTYID_EAX50_Context - -typedef enum -{ - EAXCONTEXT_NONE = 0, - EAXCONTEXT_ALLPARAMETERS, - EAXCONTEXT_PRIMARYFXSLOTID, - EAXCONTEXT_DISTANCEFACTOR, - EAXCONTEXT_AIRABSORPTIONHF, - EAXCONTEXT_HFREFERENCE, - EAXCONTEXT_LASTERROR, - EAXCONTEXT_SPEAKERCONFIG, - EAXCONTEXT_EAXSESSION, - EAXCONTEXT_MACROFXFACTOR -} EAXCONTEXT_PROPERTY; - -// OR these flags with property id -#define EAXCONTEXT_PARAMETER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXCONTEXT_PARAMETER_DEFER 0x80000000 // changes take effect later -#define EAXCONTEXT_PARAMETER_COMMITDEFERREDSETTINGS (EAXCONTEXT_NONE | \ - EAXCONTEXT_PARAMETER_IMMEDIATE) - -// EAX Context property ranges and defaults: -#define EAXCONTEXT_DEFAULTPRIMARYFXSLOTID EAXPROPERTYID_EAX50_FXSlot0 - -#define EAXCONTEXT_MINDISTANCEFACTOR FLT_MIN //minimum positive value -#define EAXCONTEXT_MAXDISTANCEFACTOR FLT_MAX -#define EAXCONTEXT_DEFAULTDISTANCEFACTOR 1.0f - -#define EAXCONTEXT_MINAIRABSORPTIONHF (-100.0f) -#define EAXCONTEXT_MAXAIRABSORPTIONHF 0.0f -#define EAXCONTEXT_DEFAULTAIRABSORPTIONHF (-5.0f) - -#define EAXCONTEXT_MINHFREFERENCE 1000.0f -#define EAXCONTEXT_MAXHFREFERENCE 20000.0f -#define EAXCONTEXT_DEFAULTHFREFERENCE 5000.0f - -#define EAXCONTEXT_DEFAULTLASTERROR EAX_OK - -enum { - HEADPHONES = 0, - SPEAKERS_2, - SPEAKERS_4, - SPEAKERS_5, // 5.1 speakers - SPEAKERS_6, // 6.1 speakers - SPEAKERS_7, // 7.1 speakers -}; - -enum { - EAX_40 = 5, // EAX 4.0 - EAX_50 = 6, // EAX 5.0 -}; - -// min,max, default values for ulEAXVersion in struct EAXSESSIONPROPERTIES -#define EAXCONTEXT_MINEAXSESSION EAX_40 -#define EAXCONTEXT_MAXEAXSESSION EAX_50 -#define EAXCONTEXT_DEFAULTEAXSESSION EAX_40 - -// min,max, default values for ulMaxActiveSends in struct EAXSESSIONPROPERTIES -#define EAXCONTEXT_MINMAXACTIVESENDS 2 -#define EAXCONTEXT_MAXMAXACTIVESENDS 4 -#define EAXCONTEXT_DEFAULTMAXACTIVESENDS 2 - -#define EAXCONTEXT_MINMACROFXFACTOR 0.0f -#define EAXCONTEXT_MAXMACROFXFACTOR 1.0f -#define EAXCONTEXT_DEFAULTMACROFXFACTOR 0.0f - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Effect Slot Objects - -// {91F9590F-C388-407a-84B0-1BAE0EF71ABC} -DEFINE_GUID(EAXPROPERTYID_EAX50_FXSlot0, - 0x91f9590f, - 0xc388, - 0x407a, - 0x84, 0xb0, 0x1b, 0xae, 0xe, 0xf7, 0x1a, 0xbc); - -// {8F5F7ACA-9608-4965-8137-8213C7B9D9DE} -DEFINE_GUID(EAXPROPERTYID_EAX50_FXSlot1, - 0x8f5f7aca, - 0x9608, - 0x4965, - 0x81, 0x37, 0x82, 0x13, 0xc7, 0xb9, 0xd9, 0xde); - -// {3C0F5252-9834-46f0-A1D8-5B95C4A00A30} -DEFINE_GUID(EAXPROPERTYID_EAX50_FXSlot2, - 0x3c0f5252, - 0x9834, - 0x46f0, - 0xa1, 0xd8, 0x5b, 0x95, 0xc4, 0xa0, 0xa, 0x30); - -// {E2EB0EAA-E806-45e7-9F86-06C1571A6FA3} -DEFINE_GUID(EAXPROPERTYID_EAX50_FXSlot3, - 0xe2eb0eaa, - 0xe806, - 0x45e7, - 0x9f, 0x86, 0x6, 0xc1, 0x57, 0x1a, 0x6f, 0xa3); - - -// For compatibility with future EAX versions: -#define EAXPROPERTYID_EAX_FXSlot0 EAXPROPERTYID_EAX50_FXSlot0 -#define EAXPROPERTYID_EAX_FXSlot1 EAXPROPERTYID_EAX50_FXSlot1 -#define EAXPROPERTYID_EAX_FXSlot2 EAXPROPERTYID_EAX50_FXSlot2 -#define EAXPROPERTYID_EAX_FXSlot3 EAXPROPERTYID_EAX50_FXSlot3 - -// FXSlot object properties -typedef enum -{ - EAXFXSLOT_PARAMETER = 0, // range 0-0x40 reserved for loaded effect parameters - EAXFXSLOT_NONE = 0x10000, - EAXFXSLOT_ALLPARAMETERS, - EAXFXSLOT_LOADEFFECT, - EAXFXSLOT_VOLUME, - EAXFXSLOT_LOCK, - EAXFXSLOT_FLAGS, - EAXFXSLOT_OCCLUSION, - EAXFXSLOT_OCCLUSIONLFRATIO -} EAXFXSLOT_PROPERTY; - -// Note: The number and order of flags may change in future EAX versions. -// To insure future compatibility, use flag defines as follows: -// myFlags = EAXFXSLOTFLAGS_ENVIRONMENT; -// instead of: -// myFlags = 0x00000001; -// -#define EAXFXSLOTFLAGS_ENVIRONMENT 0x00000001 -#define EAXFXSLOTFLAGS_UPMIX 0x00000002 -#define EAXFXSLOTFLAGS_RESERVED 0xFFFFFFFC // reserved future use - -// EAX Effect Slot property ranges and defaults: -#define EAXFXSLOT_MINVOLUME (-10000) -#define EAXFXSLOT_MAXVOLUME 0 -#define EAXFXSLOT_DEFAULTVOLUME 0 - -enum -{ - EAXFXSLOT_UNLOCKED = 0, - EAXFXSLOT_LOCKED = 1 -}; - -#define EAXFXSLOT_MINLOCK 0 -#define EAXFXSLOT_MAXLOCK 1 - -#define EAXFXSLOT_MINOCCLUSION (-10000) -#define EAXFXSLOT_MAXOCCLUSION 0 -#define EAXFXSLOT_DEFAULTOCCLUSION 0 - -#define EAXFXSLOT_MINOCCLUSIONLFRATIO 0.0f -#define EAXFXSLOT_MAXOCCLUSIONLFRATIO 1.0f -#define EAXFXSLOT_DEFAULTOCCLUSIONLFRATIO 0.25f - -#define EAXFXSLOT_DEFAULTFLAGS (EAXFXSLOTFLAGS_ENVIRONMENT | \ - EAXFXSLOTFLAGS_UPMIX ) // ignored for reverb -//////////////////////////////////////////////////////////////////////////// - - - -//////////////////////////////////////////////////////////////////////////// -// Source Object - -// {5EDF82F0-24A7-4f38-8E64-2F09CA05DEE1} -DEFINE_GUID(EAXPROPERTYID_EAX50_Source, - 0x5edf82f0, - 0x24a7, - 0x4f38, - 0x8e, 0x64, 0x2f, 0x9, 0xca, 0x5, 0xde, 0xe1); - - -// For compatibility with future EAX versions: -#define EAXPROPERTYID_EAX_Source EAXPROPERTYID_EAX50_Source - -// Source object properties -typedef enum -{ - EAXSOURCE_NONE, - EAXSOURCE_ALLPARAMETERS, - EAXSOURCE_OBSTRUCTIONPARAMETERS, - EAXSOURCE_OCCLUSIONPARAMETERS, - EAXSOURCE_EXCLUSIONPARAMETERS, - EAXSOURCE_DIRECT, - EAXSOURCE_DIRECTHF, - EAXSOURCE_ROOM, - EAXSOURCE_ROOMHF, - EAXSOURCE_OBSTRUCTION, - EAXSOURCE_OBSTRUCTIONLFRATIO, - EAXSOURCE_OCCLUSION, - EAXSOURCE_OCCLUSIONLFRATIO, - EAXSOURCE_OCCLUSIONROOMRATIO, - EAXSOURCE_OCCLUSIONDIRECTRATIO, - EAXSOURCE_EXCLUSION, - EAXSOURCE_EXCLUSIONLFRATIO, - EAXSOURCE_OUTSIDEVOLUMEHF, - EAXSOURCE_DOPPLERFACTOR, - EAXSOURCE_ROLLOFFFACTOR, - EAXSOURCE_ROOMROLLOFFFACTOR, - EAXSOURCE_AIRABSORPTIONFACTOR, - EAXSOURCE_FLAGS, - EAXSOURCE_SENDPARAMETERS, - EAXSOURCE_ALLSENDPARAMETERS, - EAXSOURCE_OCCLUSIONSENDPARAMETERS, - EAXSOURCE_EXCLUSIONSENDPARAMETERS, - EAXSOURCE_ACTIVEFXSLOTID, - EAXSOURCE_MACROFXFACTOR, - EAXSOURCE_SPEAKERLEVELS, - EAXSOURCE_ALL2DPARAMETERS, -} EAXSOURCE_PROPERTY; - -// OR these flags with property id -#define EAXSOURCE_PARAMETER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXSOURCE_PARAMETER_DEFERRED 0x80000000 // changes take effect later -#define EAXSOURCE_PARAMETER_COMMITDEFERREDSETTINGS (EAXSOURCE_NONE | \ - EAXSOURCE_PARAMETER_IMMEDIATE) -// Used by EAXSOURCE_FLAGS for EAXSOURCEFLAGS_xxxAUTO -// TRUE: value is computed automatically - property is an offset -// FALSE: value is used directly -// -// Note: The number and order of flags may change in future EAX versions. -// To insure future compatibility, use flag defines as follows: -// myFlags = EAXSOURCE_DIRECTHFAUTO | EAXSOURCE_ROOMAUTO; -// instead of: -// myFlags = 0x00000003; -// -#define EAXSOURCEFLAGS_DIRECTHFAUTO 0x00000001 // relates to EAXSOURCE_DIRECTHF -#define EAXSOURCEFLAGS_ROOMAUTO 0x00000002 // relates to EAXSOURCE_ROOM -#define EAXSOURCEFLAGS_ROOMHFAUTO 0x00000004 // relates to EAXSOURCE_ROOMHF -#define EAXSOURCEFLAGS_3DELEVATIONFILTER 0x00000008 -#define EAXSOURCEFLAGS_UPMIX 0x00000010 -#define EAXSOURCEFLAGS_APPLYSPEAKERLEVELS 0x00000020 -#define EAXSOURCEFLAGS_RESERVED 0xFFFFFFC0 // reserved future use - -// EAX Source property ranges and defaults: -#define EAXSOURCE_MINSEND (-10000) -#define EAXSOURCE_MAXSEND 0 -#define EAXSOURCE_DEFAULTSEND 0 - -#define EAXSOURCE_MINSENDHF (-10000) -#define EAXSOURCE_MAXSENDHF 0 -#define EAXSOURCE_DEFAULTSENDHF 0 - -#define EAXSOURCE_MINDIRECT (-10000) -#define EAXSOURCE_MAXDIRECT 1000 -#define EAXSOURCE_DEFAULTDIRECT 0 - -#define EAXSOURCE_MINDIRECTHF (-10000) -#define EAXSOURCE_MAXDIRECTHF 0 -#define EAXSOURCE_DEFAULTDIRECTHF 0 - -#define EAXSOURCE_MINROOM (-10000) -#define EAXSOURCE_MAXROOM 1000 -#define EAXSOURCE_DEFAULTROOM 0 - -#define EAXSOURCE_MINROOMHF (-10000) -#define EAXSOURCE_MAXROOMHF 0 -#define EAXSOURCE_DEFAULTROOMHF 0 - -#define EAXSOURCE_MINOBSTRUCTION (-10000) -#define EAXSOURCE_MAXOBSTRUCTION 0 -#define EAXSOURCE_DEFAULTOBSTRUCTION 0 - -#define EAXSOURCE_MINOBSTRUCTIONLFRATIO 0.0f -#define EAXSOURCE_MAXOBSTRUCTIONLFRATIO 1.0f -#define EAXSOURCE_DEFAULTOBSTRUCTIONLFRATIO 0.0f - -#define EAXSOURCE_MINOCCLUSION (-10000) -#define EAXSOURCE_MAXOCCLUSION 0 -#define EAXSOURCE_DEFAULTOCCLUSION 0 - -#define EAXSOURCE_MINOCCLUSIONLFRATIO 0.0f -#define EAXSOURCE_MAXOCCLUSIONLFRATIO 1.0f -#define EAXSOURCE_DEFAULTOCCLUSIONLFRATIO 0.25f - -#define EAXSOURCE_MINOCCLUSIONROOMRATIO 0.0f -#define EAXSOURCE_MAXOCCLUSIONROOMRATIO 10.0f -#define EAXSOURCE_DEFAULTOCCLUSIONROOMRATIO 1.5f - -#define EAXSOURCE_MINOCCLUSIONDIRECTRATIO 0.0f -#define EAXSOURCE_MAXOCCLUSIONDIRECTRATIO 10.0f -#define EAXSOURCE_DEFAULTOCCLUSIONDIRECTRATIO 1.0f - -#define EAXSOURCE_MINEXCLUSION (-10000) -#define EAXSOURCE_MAXEXCLUSION 0 -#define EAXSOURCE_DEFAULTEXCLUSION 0 - -#define EAXSOURCE_MINEXCLUSIONLFRATIO 0.0f -#define EAXSOURCE_MAXEXCLUSIONLFRATIO 1.0f -#define EAXSOURCE_DEFAULTEXCLUSIONLFRATIO 1.0f - -#define EAXSOURCE_MINOUTSIDEVOLUMEHF (-10000) -#define EAXSOURCE_MAXOUTSIDEVOLUMEHF 0 -#define EAXSOURCE_DEFAULTOUTSIDEVOLUMEHF 0 - -#define EAXSOURCE_MINDOPPLERFACTOR 0.0f -#define EAXSOURCE_MAXDOPPLERFACTOR 10.f -#define EAXSOURCE_DEFAULTDOPPLERFACTOR 1.0f - -#define EAXSOURCE_MINROLLOFFFACTOR 0.0f -#define EAXSOURCE_MAXROLLOFFFACTOR 10.f -#define EAXSOURCE_DEFAULTROLLOFFFACTOR 0.0f - -#define EAXSOURCE_MINROOMROLLOFFFACTOR 0.0f -#define EAXSOURCE_MAXROOMROLLOFFFACTOR 10.f -#define EAXSOURCE_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXSOURCE_MINAIRABSORPTIONFACTOR 0.0f -#define EAXSOURCE_MAXAIRABSORPTIONFACTOR 10.0f -#define EAXSOURCE_DEFAULTAIRABSORPTIONFACTOR 0.0f - -#define EAXSOURCE_MINMACROFXFACTOR 0.0f -#define EAXSOURCE_MAXMACROFXFACTOR 1.0f -#define EAXSOURCE_DEFAULTMACROFXFACTOR 1.0f - -#define EAXSOURCE_MINSPEAKERLEVEL (-10000) -#define EAXSOURCE_MAXSPEAKERLEVEL 0 -#define EAXSOURCE_DEFAULTSPEAKERLEVEL (-10000) - -enum -{ - EAXSPEAKER_FRONT_LEFT = 1, - EAXSPEAKER_FRONT_CENTER = 2, - EAXSPEAKER_FRONT_RIGHT = 3, - EAXSPEAKER_SIDE_RIGHT = 4, - EAXSPEAKER_REAR_RIGHT = 5, - EAXSPEAKER_REAR_CENTER = 6, - EAXSPEAKER_REAR_LEFT = 7, - EAXSPEAKER_SIDE_LEFT = 8, - EAXSPEAKER_LOW_FREQUENCY = 9 -}; - - -// EAXSOURCEFLAGS_DIRECTHFAUTO, EAXSOURCEFLAGS_ROOMAUTO and EAXSOURCEFLAGS_ROOMHFAUTO are ignored for 2D sources -// EAXSOURCEFLAGS_UPMIX is ignored for 3D sources -#define EAXSOURCE_DEFAULTFLAGS (EAXSOURCEFLAGS_DIRECTHFAUTO | \ - EAXSOURCEFLAGS_ROOMAUTO | \ - EAXSOURCEFLAGS_ROOMHFAUTO | \ - EAXSOURCEFLAGS_UPMIX ) - - -// A 3D Source's default ACTIVEFXSLOTID is { EAX_NULL_GUID, EAX_PrimaryFXSlotID, EAX_NULL_GUID, EAX_NULL_GUID } -#define EAXSOURCE_3DDEFAULTACTIVEFXSLOTID {{ EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] }, \ - { EAX_PrimaryFXSlotID.Data1, EAX_PrimaryFXSlotID.Data2, \ - EAX_PrimaryFXSlotID.Data3, EAX_PrimaryFXSlotID.Data4[0], \ - EAX_PrimaryFXSlotID.Data4[1],EAX_PrimaryFXSlotID.Data4[2], \ - EAX_PrimaryFXSlotID.Data4[3],EAX_PrimaryFXSlotID.Data4[4], \ - EAX_PrimaryFXSlotID.Data4[5],EAX_PrimaryFXSlotID.Data4[6], \ - EAX_PrimaryFXSlotID.Data4[7] }, \ - { EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] }, \ - { EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] } } - -// A 2D Source's default ACTIVEFXSLOTID is { EAX_NULL_GUID, EAX_NULL_GUID, EAX_NULL_GUID, EAX_NULL_GUID } -#define EAXSOURCE_2DDEFAULTACTIVEFXSLOTID {{ EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] }, \ - { EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] }, \ - { EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] }, \ - { EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \ - EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\ - EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\ - EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] } } - - -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// -// Reverb Effect - -// EAX REVERB {0CF95C8F-A3CC-4849-B0B6-832ECC1822DF} -DEFINE_GUID(EAX_REVERB_EFFECT, - 0xcf95c8f, - 0xa3cc, - 0x4849, - 0xb0, 0xb6, 0x83, 0x2e, 0xcc, 0x18, 0x22, 0xdf); - -// Reverb effect properties -typedef enum -{ - EAXREVERB_NONE, - EAXREVERB_ALLPARAMETERS, - EAXREVERB_ENVIRONMENT, - EAXREVERB_ENVIRONMENTSIZE, - EAXREVERB_ENVIRONMENTDIFFUSION, - EAXREVERB_ROOM, - EAXREVERB_ROOMHF, - EAXREVERB_ROOMLF, - EAXREVERB_DECAYTIME, - EAXREVERB_DECAYHFRATIO, - EAXREVERB_DECAYLFRATIO, - EAXREVERB_REFLECTIONS, - EAXREVERB_REFLECTIONSDELAY, - EAXREVERB_REFLECTIONSPAN, - EAXREVERB_REVERB, - EAXREVERB_REVERBDELAY, - EAXREVERB_REVERBPAN, - EAXREVERB_ECHOTIME, - EAXREVERB_ECHODEPTH, - EAXREVERB_MODULATIONTIME, - EAXREVERB_MODULATIONDEPTH, - EAXREVERB_AIRABSORPTIONHF, - EAXREVERB_HFREFERENCE, - EAXREVERB_LFREFERENCE, - EAXREVERB_ROOMROLLOFFFACTOR, - EAXREVERB_FLAGS, -} EAXREVERB_PROPERTY; - -// OR these flags with property id -#define EAXREVERB_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXREVERB_DEFERRED 0x80000000 // changes take effect later -#define EAXREVERB_COMMITDEFERREDSETTINGS (EAXREVERB_NONE | \ - EAXREVERB_IMMEDIATE) - -// used by EAXREVERB_ENVIRONMENT -enum -{ - EAX_ENVIRONMENT_GENERIC, - EAX_ENVIRONMENT_PADDEDCELL, - EAX_ENVIRONMENT_ROOM, - EAX_ENVIRONMENT_BATHROOM, - EAX_ENVIRONMENT_LIVINGROOM, - EAX_ENVIRONMENT_STONEROOM, - EAX_ENVIRONMENT_AUDITORIUM, - EAX_ENVIRONMENT_CONCERTHALL, - EAX_ENVIRONMENT_CAVE, - EAX_ENVIRONMENT_ARENA, - EAX_ENVIRONMENT_HANGAR, - EAX_ENVIRONMENT_CARPETEDHALLWAY, - EAX_ENVIRONMENT_HALLWAY, - EAX_ENVIRONMENT_STONECORRIDOR, - EAX_ENVIRONMENT_ALLEY, - EAX_ENVIRONMENT_FOREST, - EAX_ENVIRONMENT_CITY, - EAX_ENVIRONMENT_MOUNTAINS, - EAX_ENVIRONMENT_QUARRY, - EAX_ENVIRONMENT_PLAIN, - EAX_ENVIRONMENT_PARKINGLOT, - EAX_ENVIRONMENT_SEWERPIPE, - EAX_ENVIRONMENT_UNDERWATER, - EAX_ENVIRONMENT_DRUGGED, - EAX_ENVIRONMENT_DIZZY, - EAX_ENVIRONMENT_PSYCHOTIC, - - EAX_ENVIRONMENT_UNDEFINED, - - EAX_ENVIRONMENT_COUNT -}; - -// Used by EAXREVERB_FLAGS -// -// Note: The number and order of flags may change in future EAX versions. -// It is recommended to use the flag defines as follows: -// myFlags = EAXREVERBFLAGS_DECAYTIMESCALE | EAXREVERBFLAGS_REVERBSCALE; -// instead of: -// myFlags = 0x00000009; -// -// These flags determine what properties are affected by environment size. -#define EAXREVERBFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time -#define EAXREVERBFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level -#define EAXREVERBFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time -#define EAXREVERBFLAGS_REVERBSCALE 0x00000008 // reflections level -#define EAXREVERBFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time -#define EAXREVERBFLAGS_ECHOTIMESCALE 0x00000040 // echo time -#define EAXREVERBFLAGS_MODULATIONTIMESCALE 0x00000080 // modulation time -// This flag limits high-frequency decay time according to air absorption. -#define EAXREVERBFLAGS_DECAYHFLIMIT 0x00000020 -#define EAXREVERBFLAGS_RESERVED 0xFFFFFF00 // reserved future use - -// Use this structure for EAXREVERB_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all times and delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myReverb.lRoom = -1000; -// myReverb.lRoomHF = -100; -// ... -// myReverb.dwFlags = myFlags /* see EAXREVERBFLAGS below */ ; -// instead of: -// myReverb = { -1000, -100, ... , 0x00000009 }; -// If you want to save and load presets in binary form, you -// should define your own structure to insure future compatibility. -// -#ifndef EAXREVERBPROPERTIES_DEFINED -#define EAXREVERBPROPERTIES_DEFINED -typedef struct _EAXREVERBPROPERTIES -{ - unsigned long ulEnvironment; // sets all reverb properties - float flEnvironmentSize; // environment size in meters - float flEnvironmentDiffusion; // environment diffusion - long lRoom; // room effect level (at mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lRoomLF; // relative room effect level at low frequencies - float flDecayTime; // reverberation decay time at mid frequencies - float flDecayHFRatio; // high-frequency to mid-frequency decay time ratio - float flDecayLFRatio; // low-frequency to mid-frequency decay time ratio - long lReflections; // early reflections level relative to room effect - float flReflectionsDelay; // initial reflection delay time - EAXVECTOR vReflectionsPan; // early reflections panning vector - long lReverb; // late reverberation level relative to room effect - float flReverbDelay; // late reverberation delay time relative to initial reflection - EAXVECTOR vReverbPan; // late reverberation panning vector - float flEchoTime; // echo time - float flEchoDepth; // echo depth - float flModulationTime; // modulation time - float flModulationDepth; // modulation depth - float flAirAbsorptionHF; // change in level per meter at high frequencies - float flHFReference; // reference high frequency - float flLFReference; // reference low frequency - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - unsigned long ulFlags; // modifies the behavior of properties -} EAXREVERBPROPERTIES, *LPEAXREVERBPROPERTIES; -#endif - -// Property ranges and defaults: -#define EAXREVERB_MINENVIRONMENT 0 -#define EAXREVERB_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1) -#define EAXREVERB_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC - -#define EAXREVERB_MINENVIRONMENTSIZE 1.0f -#define EAXREVERB_MAXENVIRONMENTSIZE 100.0f -#define EAXREVERB_DEFAULTENVIRONMENTSIZE 7.5f - -#define EAXREVERB_MINENVIRONMENTDIFFUSION 0.0f -#define EAXREVERB_MAXENVIRONMENTDIFFUSION 1.0f -#define EAXREVERB_DEFAULTENVIRONMENTDIFFUSION 1.0f - -#define EAXREVERB_MINROOM (-10000) -#define EAXREVERB_MAXROOM 0 -#define EAXREVERB_DEFAULTROOM (-1000) - -#define EAXREVERB_MINROOMHF (-10000) -#define EAXREVERB_MAXROOMHF 0 -#define EAXREVERB_DEFAULTROOMHF (-100) - -#define EAXREVERB_MINROOMLF (-10000) -#define EAXREVERB_MAXROOMLF 0 -#define EAXREVERB_DEFAULTROOMLF 0 - -#define EAXREVERB_MINDECAYTIME 0.1f -#define EAXREVERB_MAXDECAYTIME 20.0f -#define EAXREVERB_DEFAULTDECAYTIME 1.49f - -#define EAXREVERB_MINDECAYHFRATIO 0.1f -#define EAXREVERB_MAXDECAYHFRATIO 2.0f -#define EAXREVERB_DEFAULTDECAYHFRATIO 0.83f - -#define EAXREVERB_MINDECAYLFRATIO 0.1f -#define EAXREVERB_MAXDECAYLFRATIO 2.0f -#define EAXREVERB_DEFAULTDECAYLFRATIO 1.00f - -#define EAXREVERB_MINREFLECTIONS (-10000) -#define EAXREVERB_MAXREFLECTIONS 1000 -#define EAXREVERB_DEFAULTREFLECTIONS (-2602) - -#define EAXREVERB_MINREFLECTIONSDELAY 0.0f -#define EAXREVERB_MAXREFLECTIONSDELAY 0.3f -#define EAXREVERB_DEFAULTREFLECTIONSDELAY 0.007f - -#define EAXREVERB_DEFAULTREFLECTIONSPAN {0.0f, 0.0f, 0.0f} - -#define EAXREVERB_MINREVERB (-10000) -#define EAXREVERB_MAXREVERB 2000 -#define EAXREVERB_DEFAULTREVERB 200 - -#define EAXREVERB_MINREVERBDELAY 0.0f -#define EAXREVERB_MAXREVERBDELAY 0.1f -#define EAXREVERB_DEFAULTREVERBDELAY 0.011f - -#define EAXREVERB_DEFAULTREVERBPAN {0.0f, 0.0f, 0.0f} - -#define EAXREVERB_MINECHOTIME 0.075f -#define EAXREVERB_MAXECHOTIME 0.25f -#define EAXREVERB_DEFAULTECHOTIME 0.25f - -#define EAXREVERB_MINECHODEPTH 0.0f -#define EAXREVERB_MAXECHODEPTH 1.0f -#define EAXREVERB_DEFAULTECHODEPTH 0.0f - -#define EAXREVERB_MINMODULATIONTIME 0.04f -#define EAXREVERB_MAXMODULATIONTIME 4.0f -#define EAXREVERB_DEFAULTMODULATIONTIME 0.25f - -#define EAXREVERB_MINMODULATIONDEPTH 0.0f -#define EAXREVERB_MAXMODULATIONDEPTH 1.0f -#define EAXREVERB_DEFAULTMODULATIONDEPTH 0.0f - -#define EAXREVERB_MINAIRABSORPTIONHF (-100.0f) -#define EAXREVERB_MAXAIRABSORPTIONHF 0.0f -#define EAXREVERB_DEFAULTAIRABSORPTIONHF (-5.0f) - -#define EAXREVERB_MINHFREFERENCE 1000.0f -#define EAXREVERB_MAXHFREFERENCE 20000.0f -#define EAXREVERB_DEFAULTHFREFERENCE 5000.0f - -#define EAXREVERB_MINLFREFERENCE 20.0f -#define EAXREVERB_MAXLFREFERENCE 1000.0f -#define EAXREVERB_DEFAULTLFREFERENCE 250.0f - -#define EAXREVERB_MINROOMROLLOFFFACTOR 0.0f -#define EAXREVERB_MAXROOMROLLOFFFACTOR 10.0f -#define EAXREVERB_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXREVERB_DEFAULTFLAGS (EAXREVERBFLAGS_DECAYTIMESCALE | \ - EAXREVERBFLAGS_REFLECTIONSSCALE | \ - EAXREVERBFLAGS_REFLECTIONSDELAYSCALE | \ - EAXREVERBFLAGS_REVERBSCALE | \ - EAXREVERBFLAGS_REVERBDELAYSCALE | \ - EAXREVERBFLAGS_DECAYHFLIMIT) -//////////////////////////////////////////////////////////////////////////// - - - - -//////////////////////////////////////////////////////////////////////////// - -// New Effect Types - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// AGC Compressor Effect - -// EAX AGC COMPRESSOR {BFB7A01E-7825-4039-927F-3AABDA0C560} - -DEFINE_GUID(EAX_AGCCOMPRESSOR_EFFECT, - 0xbfb7a01e, - 0x7825, - 0x4039, - 0x92, 0x7f, 0x3, 0xaa, 0xbd, 0xa0, 0xc5, 0x60); - -// AGC Compressor properties -typedef enum -{ - EAXAGCCOMPRESSOR_NONE, - EAXAGCCOMPRESSOR_ALLPARAMETERS, - EAXAGCCOMPRESSOR_ONOFF -} EAXAGCCOMPRESSOR_PROPERTY; - -// OR these flags with property id -#define EAXAGCCOMPRESSOR_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXAGCCOMPRESSOR_DEFERRED 0x80000000 // changes take effect later -#define EAXAGCCOMPRESSOR_COMMITDEFERREDSETTINGS (EAXAGCCOMPRESSOR_NONE | \ - EAXAGCCOMPRESSOR_IMMEDIATE) - -// Use this structure for EAXAGCCOMPRESSOR_ALLPARAMETERS -#ifndef EAXAGCCOMPRESSORPROPERTIES_DEFINED -#define EAXAGCCOMPRESSORPROPERTIES_DEFINED -typedef struct _EAXAGCCOMPRESSORPROPERTIES -{ - unsigned long ulOnOff; // Switch Compressor on or off -} EAXAGCCOMPRESSORPROPERTIES, *LPEAXAGCCOMPRESSORPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXAGCCOMPRESSOR_MINONOFF 0 -#define EAXAGCCOMPRESSOR_MAXONOFF 1 -#define EAXAGCCOMPRESSOR_DEFAULTONOFF 1 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Autowah Effect - -// EAX AUTOWAH {EC3130C0-AC7A-11D2-88DD-A024D13CE1} -DEFINE_GUID(EAX_AUTOWAH_EFFECT, - 0xec3130c0, - 0xac7a, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Autowah properties -typedef enum -{ - EAXAUTOWAH_NONE, - EAXAUTOWAH_ALLPARAMETERS, - EAXAUTOWAH_ATTACKTIME, - EAXAUTOWAH_RELEASETIME, - EAXAUTOWAH_RESONANCE, - EAXAUTOWAH_PEAKLEVEL -} EAXAUTOWAH_PROPERTY; - -// OR these flags with property id -#define EAXAUTOWAH_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXAUTOWAH_DEFERRED 0x80000000 // changes take effect later -#define EAXAUTOWAH_COMMITDEFERREDSETTINGS (EAXAUTOWAH_NONE | \ - EAXAUTOWAH_IMMEDIATE) - -// Use this structure for EAXAUTOWAH_ALLPARAMETERS -#ifndef EAXAUTOWAHPROPERTIES_DEFINED -#define EAXAUTOWAHPROPERTIES_DEFINED -typedef struct _EAXAUTOWAHPROPERTIES -{ - float flAttackTime; // Attack time (seconds) - float flReleaseTime; // Release time (seconds) - long lResonance; // Resonance (mB) - long lPeakLevel; // Peak level (mB) -} EAXAUTOWAHPROPERTIES, *LPEAXAUTOWAHPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXAUTOWAH_MINATTACKTIME 0.0001f -#define EAXAUTOWAH_MAXATTACKTIME 1.0f -#define EAXAUTOWAH_DEFAULTATTACKTIME 0.06f - -#define EAXAUTOWAH_MINRELEASETIME 0.0001f -#define EAXAUTOWAH_MAXRELEASETIME 1.0f -#define EAXAUTOWAH_DEFAULTRELEASETIME 0.06f - -#define EAXAUTOWAH_MINRESONANCE 600 -#define EAXAUTOWAH_MAXRESONANCE 6000 -#define EAXAUTOWAH_DEFAULTRESONANCE 6000 - -#define EAXAUTOWAH_MINPEAKLEVEL (-9000) -#define EAXAUTOWAH_MAXPEAKLEVEL 9000 -#define EAXAUTOWAH_DEFAULTPEAKLEVEL 2100 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Chorus Effect - -// EAX CHORUS {DE6D6FE0-AC79-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_CHORUS_EFFECT, - 0xde6d6fe0, - 0xac79, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - - -// Chorus properties -typedef enum -{ - EAXCHORUS_NONE, - EAXCHORUS_ALLPARAMETERS, - EAXCHORUS_WAVEFORM, - EAXCHORUS_PHASE, - EAXCHORUS_RATE, - EAXCHORUS_DEPTH, - EAXCHORUS_FEEDBACK, - EAXCHORUS_DELAY -} EAXCHORUS_PROPERTY; - -// OR these flags with property id -#define EAXCHORUS_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXCHORUS_DEFERRED 0x80000000 // changes take effect later -#define EAXCHORUS_COMMITDEFERREDSETTINGS (EAXCHORUS_NONE | \ - EAXCHORUS_IMMEDIATE) - -// used by EAXCHORUS_WAVEFORM -enum -{ - EAX_CHORUS_SINUSOID, - EAX_CHORUS_TRIANGLE -}; - -// Use this structure for EAXCHORUS_ALLPARAMETERS -#ifndef EAXCHORUSPROPERTIES_DEFINED -#define EAXCHORUSPROPERTIES_DEFINED -typedef struct _EAXCHORUSPROPERTIES -{ - unsigned long ulWaveform; // Waveform selector - see enum above - long lPhase; // Phase (Degrees) - float flRate; // Rate (Hz) - float flDepth; // Depth (0 to 1) - float flFeedback; // Feedback (-1 to 1) - float flDelay; // Delay (seconds) -} EAXCHORUSPROPERTIES, *LPEAXCHORUSPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXCHORUS_MINWAVEFORM 0 -#define EAXCHORUS_MAXWAVEFORM 1 -#define EAXCHORUS_DEFAULTWAVEFORM 1 - -#define EAXCHORUS_MINPHASE (-180) -#define EAXCHORUS_MAXPHASE 180 -#define EAXCHORUS_DEFAULTPHASE 90 - -#define EAXCHORUS_MINRATE 0.0f -#define EAXCHORUS_MAXRATE 10.0f -#define EAXCHORUS_DEFAULTRATE 1.1f - -#define EAXCHORUS_MINDEPTH 0.0f -#define EAXCHORUS_MAXDEPTH 1.0f -#define EAXCHORUS_DEFAULTDEPTH 0.1f - -#define EAXCHORUS_MINFEEDBACK (-1.0f) -#define EAXCHORUS_MAXFEEDBACK 1.0f -#define EAXCHORUS_DEFAULTFEEDBACK 0.25f - -#define EAXCHORUS_MINDELAY 0.0002f -#define EAXCHORUS_MAXDELAY 0.016f -#define EAXCHORUS_DEFAULTDELAY 0.016f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Distortion Effect - -// EAX DISTORTION {975A4CE0-AC7E-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_DISTORTION_EFFECT, - 0x975a4ce0, - 0xac7e, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Distortion properties -typedef enum -{ - EAXDISTORTION_NONE, - EAXDISTORTION_ALLPARAMETERS, - EAXDISTORTION_EDGE, - EAXDISTORTION_GAIN, - EAXDISTORTION_LOWPASSCUTOFF, - EAXDISTORTION_EQCENTER, - EAXDISTORTION_EQBANDWIDTH -} EAXDISTORTION_PROPERTY; - -// OR these flags with property id -#define EAXDISTORTION_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXDISTORTION_DEFERRED 0x80000000 // changes take effect later -#define EAXDISTORTION_COMMITDEFERREDSETTINGS (EAXDISTORTION_NONE | \ - EAXDISTORTION_IMMEDIATE) - -// Use this structure for EAXDISTORTION_ALLPARAMETERS -#ifndef EAXDISTORTIONPROPERTIES_DEFINED -#define EAXDISTORTIONPROPERTIES_DEFINED -typedef struct _EAXDISTORTIONPROPERTIES -{ - float flEdge; // Controls the shape of the distortion (0 to 1) - long lGain; // Controls the post distortion gain (mB) - float flLowPassCutOff; // Controls the cut-off of the filter pre-distortion (Hz) - float flEQCenter; // Controls the center frequency of the EQ post-distortion (Hz) - float flEQBandwidth; // Controls the bandwidth of the EQ post-distortion (Hz) -} EAXDISTORTIONPROPERTIES, *LPEAXDISTORTIONPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXDISTORTION_MINEDGE 0.0f -#define EAXDISTORTION_MAXEDGE 1.0f -#define EAXDISTORTION_DEFAULTEDGE 0.2f - -#define EAXDISTORTION_MINGAIN (-6000) -#define EAXDISTORTION_MAXGAIN 0 -#define EAXDISTORTION_DEFAULTGAIN (-2600) - -#define EAXDISTORTION_MINLOWPASSCUTOFF 80.0f -#define EAXDISTORTION_MAXLOWPASSCUTOFF 24000.0f -#define EAXDISTORTION_DEFAULTLOWPASSCUTOFF 8000.0f - -#define EAXDISTORTION_MINEQCENTER 80.0f -#define EAXDISTORTION_MAXEQCENTER 24000.0f -#define EAXDISTORTION_DEFAULTEQCENTER 3600.0f - -#define EAXDISTORTION_MINEQBANDWIDTH 80.0f -#define EAXDISTORTION_MAXEQBANDWIDTH 24000.0f -#define EAXDISTORTION_DEFAULTEQBANDWIDTH 3600.0f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Echo Effect - -// EAX ECHO {E9F1BC0-AC82-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_ECHO_EFFECT, - 0xe9f1bc0, - 0xac82, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Echo properties -typedef enum -{ - EAXECHO_NONE, - EAXECHO_ALLPARAMETERS, - EAXECHO_DELAY, - EAXECHO_LRDELAY, - EAXECHO_DAMPING, - EAXECHO_FEEDBACK, - EAXECHO_SPREAD -} EAXECHO_PROPERTY; - -// OR these flags with property id -#define EAXECHO_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXECHO_DEFERRED 0x80000000 // changes take effect later -#define EAXECHO_COMMITDEFERREDSETTINGS (EAXECHO_NONE | \ - EAXECHO_IMMEDIATE) - -// Use this structure for EAXECHO_ALLPARAMETERS -#ifndef EAXECHOPROPERTIES_DEFINED -#define EAXECHOPROPERTIES_DEFINED -typedef struct _EAXECHOPROPERTIES -{ - float flDelay; // Controls the initial delay time (seconds) - float flLRDelay; // Controls the delay time between the first and second taps (seconds) - float flDamping; // Controls a low-pass filter that dampens the echoes (0 to 1) - float flFeedback; // Controls the duration of echo repetition (0 to 1) - float flSpread; // Controls the left-right spread of the echoes -} EAXECHOPROPERTIES, *LPEAXECHOPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXECHO_MINDAMPING 0.0f -#define EAXECHO_MAXDAMPING 0.99f -#define EAXECHO_DEFAULTDAMPING 0.5f - -#define EAXECHO_MINDELAY 0.002f -#define EAXECHO_MAXDELAY 0.207f -#define EAXECHO_DEFAULTDELAY 0.1f - -#define EAXECHO_MINLRDELAY 0.0f -#define EAXECHO_MAXLRDELAY 0.404f -#define EAXECHO_DEFAULTLRDELAY 0.1f - -#define EAXECHO_MINFEEDBACK 0.0f -#define EAXECHO_MAXFEEDBACK 1.0f -#define EAXECHO_DEFAULTFEEDBACK 0.5f - -#define EAXECHO_MINSPREAD (-1.0f) -#define EAXECHO_MAXSPREAD 1.0f -#define EAXECHO_DEFAULTSPREAD (-1.0f) - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Equalizer Effect - -// EAX EQUALIZER {65F94CE0-9793-11D3-939D-C0F02DD6F0} - -DEFINE_GUID(EAX_EQUALIZER_EFFECT, - 0x65f94ce0, - 0x9793, - 0x11d3, - 0x93, 0x9d, 0x0, 0xc0, 0xf0, 0x2d, 0xd6, 0xf0); - - -// Equalizer properties -typedef enum -{ - EAXEQUALIZER_NONE, - EAXEQUALIZER_ALLPARAMETERS, - EAXEQUALIZER_LOWGAIN, - EAXEQUALIZER_LOWCUTOFF, - EAXEQUALIZER_MID1GAIN, - EAXEQUALIZER_MID1CENTER, - EAXEQUALIZER_MID1WIDTH, - EAXEQUALIZER_MID2GAIN, - EAXEQUALIZER_MID2CENTER, - EAXEQUALIZER_MID2WIDTH, - EAXEQUALIZER_HIGHGAIN, - EAXEQUALIZER_HIGHCUTOFF -} EAXEQUALIZER_PROPERTY; - -// OR these flags with property id -#define EAXEQUALIZER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXEQUALIZER_DEFERRED 0x80000000 // changes take effect later -#define EAXEQUALIZER_COMMITDEFERREDSETTINGS (EAXEQUALIZER_NONE | \ - EAXEQUALIZER_IMMEDIATE) - -// Use this structure for EAXEQUALIZER_ALLPARAMETERS -#ifndef EAXEQUALIZERPROPERTIES_DEFINED -#define EAXEQUALIZERPROPERTIES_DEFINED -typedef struct _EAXEQUALIZERPROPERTIES -{ - long lLowGain; // (mB) - float flLowCutOff; // (Hz) - long lMid1Gain; // (mB) - float flMid1Center; // (Hz) - float flMid1Width; // (octaves) - long lMid2Gain; // (mB) - float flMid2Center; // (Hz) - float flMid2Width; // (octaves) - long lHighGain; // (mB) - float flHighCutOff; // (Hz) -} EAXEQUALIZERPROPERTIES, *LPEAXEQUALIZERPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXEQUALIZER_MINLOWGAIN (-1800) -#define EAXEQUALIZER_MAXLOWGAIN 1800 -#define EAXEQUALIZER_DEFAULTLOWGAIN 0 - -#define EAXEQUALIZER_MINLOWCUTOFF 50.0f -#define EAXEQUALIZER_MAXLOWCUTOFF 800.0f -#define EAXEQUALIZER_DEFAULTLOWCUTOFF 200.0f - -#define EAXEQUALIZER_MINMID1GAIN (-1800) -#define EAXEQUALIZER_MAXMID1GAIN 1800 -#define EAXEQUALIZER_DEFAULTMID1GAIN 0 - -#define EAXEQUALIZER_MINMID1CENTER 200.0f -#define EAXEQUALIZER_MAXMID1CENTER 3000.0f -#define EAXEQUALIZER_DEFAULTMID1CENTER 500.0f - -#define EAXEQUALIZER_MINMID1WIDTH 0.01f -#define EAXEQUALIZER_MAXMID1WIDTH 1.0f -#define EAXEQUALIZER_DEFAULTMID1WIDTH 1.0f - -#define EAXEQUALIZER_MINMID2GAIN (-1800) -#define EAXEQUALIZER_MAXMID2GAIN 1800 -#define EAXEQUALIZER_DEFAULTMID2GAIN 0 - -#define EAXEQUALIZER_MINMID2CENTER 1000.0f -#define EAXEQUALIZER_MAXMID2CENTER 8000.0f -#define EAXEQUALIZER_DEFAULTMID2CENTER 3000.0f - -#define EAXEQUALIZER_MINMID2WIDTH 0.01f -#define EAXEQUALIZER_MAXMID2WIDTH 1.0f -#define EAXEQUALIZER_DEFAULTMID2WIDTH 1.0f - -#define EAXEQUALIZER_MINHIGHGAIN (-1800) -#define EAXEQUALIZER_MAXHIGHGAIN 1800 -#define EAXEQUALIZER_DEFAULTHIGHGAIN 0 - -#define EAXEQUALIZER_MINHIGHCUTOFF 4000.0f -#define EAXEQUALIZER_MAXHIGHCUTOFF 16000.0f -#define EAXEQUALIZER_DEFAULTHIGHCUTOFF 6000.0f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Flanger Effect - -// EAX FLANGER {A70007C0-7D2-11D3-9B1E-A024D13CE1} - -DEFINE_GUID(EAX_FLANGER_EFFECT, - 0xa70007c0, - 0x7d2, - 0x11d3, - 0x9b, 0x1e, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Flanger properties -typedef enum -{ - EAXFLANGER_NONE, - EAXFLANGER_ALLPARAMETERS, - EAXFLANGER_WAVEFORM, - EAXFLANGER_PHASE, - EAXFLANGER_RATE, - EAXFLANGER_DEPTH, - EAXFLANGER_FEEDBACK, - EAXFLANGER_DELAY -} EAXFLANGER_PROPERTY; - -// OR these flags with property id -#define EAXFLANGER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXFLANGER_DEFERRED 0x80000000 // changes take effect later -#define EAXFLANGER_COMMITDEFERREDSETTINGS (EAXFLANGER_NONE | \ - EAXFLANGER_IMMEDIATE) - -// used by EAXFLANGER_WAVEFORM -enum -{ - EAX_FLANGER_SINUSOID, - EAX_FLANGER_TRIANGLE -}; - -// Use this structure for EAXFLANGER_ALLPARAMETERS -#ifndef EAXFLANGERPROPERTIES_DEFINED -#define EAXFLANGERPROPERTIES_DEFINED -typedef struct _EAXFLANGERPROPERTIES -{ - unsigned long ulWaveform; // Waveform selector - see enum above - long lPhase; // Phase (Degrees) - float flRate; // Rate (Hz) - float flDepth; // Depth (0 to 1) - float flFeedback; // Feedback (0 to 1) - float flDelay; // Delay (seconds) -} EAXFLANGERPROPERTIES, *LPEAXFLANGERPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXFLANGER_MINWAVEFORM 0 -#define EAXFLANGER_MAXWAVEFORM 1 -#define EAXFLANGER_DEFAULTWAVEFORM 1 - -#define EAXFLANGER_MINPHASE (-180) -#define EAXFLANGER_MAXPHASE 180 -#define EAXFLANGER_DEFAULTPHASE 0 - -#define EAXFLANGER_MINRATE 0.0f -#define EAXFLANGER_MAXRATE 10.0f -#define EAXFLANGER_DEFAULTRATE 0.27f - -#define EAXFLANGER_MINDEPTH 0.0f -#define EAXFLANGER_MAXDEPTH 1.0f -#define EAXFLANGER_DEFAULTDEPTH 1.0f - -#define EAXFLANGER_MINFEEDBACK (-1.0f) -#define EAXFLANGER_MAXFEEDBACK 1.0f -#define EAXFLANGER_DEFAULTFEEDBACK (-0.5f) - -#define EAXFLANGER_MINDELAY 0.0002f -#define EAXFLANGER_MAXDELAY 0.004f -#define EAXFLANGER_DEFAULTDELAY 0.002f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Frequency Shifter Effect - -// EAX FREQUENCY SHIFTER {DC3E1880-9212-11D3-939D-C0F02DD6F0} - -DEFINE_GUID(EAX_FREQUENCYSHIFTER_EFFECT, - 0xdc3e1880, - 0x9212, - 0x11d3, - 0x93, 0x9d, 0x0, 0xc0, 0xf0, 0x2d, 0xd6, 0xf0); - -// Frequency Shifter properties -typedef enum -{ - EAXFREQUENCYSHIFTER_NONE, - EAXFREQUENCYSHIFTER_ALLPARAMETERS, - EAXFREQUENCYSHIFTER_FREQUENCY, - EAXFREQUENCYSHIFTER_LEFTDIRECTION, - EAXFREQUENCYSHIFTER_RIGHTDIRECTION -} EAXFREQUENCYSHIFTER_PROPERTY; - -// OR these flags with property id -#define EAXFREQUENCYSHIFTER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXFREQUENCYSHIFTER_DEFERRED 0x80000000 // changes take effect later -#define EAXFREQUENCYSHIFTER_COMMITDEFERREDSETTINGS (EAXFREQUENCYSHIFTER_NONE | \ - EAXFREQUENCYSHIFTER_IMMEDIATE) - -// used by EAXFREQUENCYSHIFTER_LEFTDIRECTION and EAXFREQUENCYSHIFTER_RIGHTDIRECTION -enum -{ - EAX_FREQUENCYSHIFTER_DOWN, - EAX_FREQUENCYSHIFTER_UP, - EAX_FREQUENCYSHIFTER_OFF -}; - -// Use this structure for EAXFREQUENCYSHIFTER_ALLPARAMETERS -#ifndef EAXFREQUENCYSHIFTERPROPERTIES_DEFINED -#define EAXFREQUENCYSHIFTERPROPERTIES_DEFINED -typedef struct _EAXFREQUENCYSHIFTERPROPERTIES -{ - float flFrequency; // (Hz) - unsigned long ulLeftDirection; // see enum above - unsigned long ulRightDirection; // see enum above -} EAXFREQUENCYSHIFTERPROPERTIES, *LPEAXFREQUENCYSHIFTERPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXFREQUENCYSHIFTER_MINFREQUENCY 0.0f -#define EAXFREQUENCYSHIFTER_MAXFREQUENCY 24000.0f -#define EAXFREQUENCYSHIFTER_DEFAULTFREQUENCY 0.0f - -#define EAXFREQUENCYSHIFTER_MINLEFTDIRECTION 0 -#define EAXFREQUENCYSHIFTER_MAXLEFTDIRECTION 2 -#define EAXFREQUENCYSHIFTER_DEFAULTLEFTDIRECTION 0 - -#define EAXFREQUENCYSHIFTER_MINRIGHTDIRECTION 0 -#define EAXFREQUENCYSHIFTER_MAXRIGHTDIRECTION 2 -#define EAXFREQUENCYSHIFTER_DEFAULTRIGHTDIRECTION 0 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Vocal Morpher Effect - -// EAX VOCAL MORPHER {E41CF10C-3383-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_VOCALMORPHER_EFFECT, - 0xe41cf10c, - 0x3383, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Vocal Morpher properties -typedef enum -{ - EAXVOCALMORPHER_NONE, - EAXVOCALMORPHER_ALLPARAMETERS, - EAXVOCALMORPHER_PHONEMEA, - EAXVOCALMORPHER_PHONEMEACOARSETUNING, - EAXVOCALMORPHER_PHONEMEB, - EAXVOCALMORPHER_PHONEMEBCOARSETUNING, - EAXVOCALMORPHER_WAVEFORM, - EAXVOCALMORPHER_RATE -} EAXVOCALMORPHER_PROPERTY; - -// OR these flags with property id -#define EAXVOCALMORPHER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXVOCALMORPHER_DEFERRED 0x80000000 // changes take effect later -#define EAXVOCALMORPHER_COMMITDEFERREDSETTINGS (EAXVOCALMORPHER_NONE | \ - EAXVOCALMORPHER_IMMEDIATE) - -// used by EAXVOCALMORPHER_PHONEMEA and EAXVOCALMORPHER_PHONEMEB -enum -{ - A, E, I, O, U, AA, AE, AH, AO, EH, ER, IH, IY, UH, UW, B, D, F, G, - J, K, L, M, N, P, R, S, T, V, Z -}; - -// used by EAXVOCALMORPHER_WAVEFORM -enum -{ - EAX_VOCALMORPHER_SINUSOID, - EAX_VOCALMORPHER_TRIANGLE, - EAX_VOCALMORPHER_SAWTOOTH -}; - -// Use this structure for EAXVOCALMORPHER_ALLPARAMETERS -#ifndef EAXVOCALMORPHERPROPERTIES_DEFINED -#define EAXVOCALMORPHERPROPERTIES_DEFINED -typedef struct _EAXVOCALMORPHERPROPERTIES -{ - unsigned long ulPhonemeA; // see enum above - long lPhonemeACoarseTuning; // (semitones) - unsigned long ulPhonemeB; // see enum above - long lPhonemeBCoarseTuning; // (semitones) - unsigned long ulWaveform; // Waveform selector - see enum above - float flRate; // (Hz) -} EAXVOCALMORPHERPROPERTIES, *LPEAXVOCALMORPHERPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXVOCALMORPHER_MINPHONEMEA 0 -#define EAXVOCALMORPHER_MAXPHONEMEA 29 -#define EAXVOCALMORPHER_DEFAULTPHONEMEA 0 - -#define EAXVOCALMORPHER_MINPHONEMEACOARSETUNING (-24) -#define EAXVOCALMORPHER_MAXPHONEMEACOARSETUNING 24 -#define EAXVOCALMORPHER_DEFAULTPHONEMEACOARSETUNING 0 - -#define EAXVOCALMORPHER_MINPHONEMEB 0 -#define EAXVOCALMORPHER_MAXPHONEMEB 29 -#define EAXVOCALMORPHER_DEFAULTPHONEMEB 10 - -#define EAXVOCALMORPHER_MINPHONEMEBCOARSETUNING (-24) -#define EAXVOCALMORPHER_MAXPHONEMEBCOARSETUNING 24 -#define EAXVOCALMORPHER_DEFAULTPHONEMEBCOARSETUNING 0 - -#define EAXVOCALMORPHER_MINWAVEFORM 0 -#define EAXVOCALMORPHER_MAXWAVEFORM 2 -#define EAXVOCALMORPHER_DEFAULTWAVEFORM 0 - -#define EAXVOCALMORPHER_MINRATE 0.0f -#define EAXVOCALMORPHER_MAXRATE 10.0f -#define EAXVOCALMORPHER_DEFAULTRATE 1.41f - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Pitch Shifter Effect - -// EAX PITCH SHIFTER {E7905100-AFB2-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_PITCHSHIFTER_EFFECT, - 0xe7905100, - 0xafb2, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Pitch Shifter properties -typedef enum -{ - EAXPITCHSHIFTER_NONE, - EAXPITCHSHIFTER_ALLPARAMETERS, - EAXPITCHSHIFTER_COARSETUNE, - EAXPITCHSHIFTER_FINETUNE -} EAXPITCHSHIFTER_PROPERTY; - -// OR these flags with property id -#define EAXPITCHSHIFTER_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXPITCHSHIFTER_DEFERRED 0x80000000 // changes take effect later -#define EAXPITCHSHIFTER_COMMITDEFERREDSETTINGS (EAXPITCHSHIFTER_NONE | \ - EAXPITCHSHIFTER_IMMEDIATE) - -// Use this structure for EAXPITCHSHIFTER_ALLPARAMETERS -#ifndef EAXPITCHSHIFTERPROPERTIES_DEFINED -#define EAXPITCHSHIFTERPROPERTIES_DEFINED -typedef struct _EAXPITCHSHIFTERPROPERTIES -{ - long lCoarseTune; // Amount of pitch shift (semitones) - long lFineTune; // Amount of pitch shift (cents) -} EAXPITCHSHIFTERPROPERTIES, *LPEAXPITCHSHIFTERPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXPITCHSHIFTER_MINCOARSETUNE (-12) -#define EAXPITCHSHIFTER_MAXCOARSETUNE 12 -#define EAXPITCHSHIFTER_DEFAULTCOARSETUNE 12 - -#define EAXPITCHSHIFTER_MINFINETUNE (-50) -#define EAXPITCHSHIFTER_MAXFINETUNE 50 -#define EAXPITCHSHIFTER_DEFAULTFINETUNE 0 - -//////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////// -// Ring Modulator Effect - -// EAX RING MODULATOR {B89FE60-AFB5-11D2-88DD-A024D13CE1} - -DEFINE_GUID(EAX_RINGMODULATOR_EFFECT, - 0xb89fe60, - 0xafb5, - 0x11d2, - 0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1); - -// Ring Modulator properties -typedef enum -{ - EAXRINGMODULATOR_NONE, - EAXRINGMODULATOR_ALLPARAMETERS, - EAXRINGMODULATOR_FREQUENCY, - EAXRINGMODULATOR_HIGHPASSCUTOFF, - EAXRINGMODULATOR_WAVEFORM -} EAXRINGMODULATOR_PROPERTY; - -// OR these flags with property id -#define EAXRINGMODULATOR_IMMEDIATE 0x00000000 // changes take effect immediately -#define EAXRINGMODULATOR_DEFERRED 0x80000000 // changes take effect later -#define EAXRINGMODULATOR_COMMITDEFERREDSETTINGS (EAXRINGMODULATOR_NONE | \ - EAXRINGMODULATOR_IMMEDIATE) - -// used by EAXRINGMODULATOR_WAVEFORM -enum -{ - EAX_RINGMODULATOR_SINUSOID, - EAX_RINGMODULATOR_SAWTOOTH, - EAX_RINGMODULATOR_SQUARE -}; - -// Use this structure for EAXRINGMODULATOR_ALLPARAMETERS -#ifndef EAXRINGMODULATORPROPERTIES_DEFINED -#define EAXRINGMODULATORPROPERTIES_DEFINED -typedef struct _EAXRINGMODULATORPROPERTIES -{ - float flFrequency; // Frequency of modulation (Hz) - float flHighPassCutOff; // Cut-off frequency of high-pass filter (Hz) - unsigned long ulWaveform; // Waveform selector - see enum above -} EAXRINGMODULATORPROPERTIES, *LPEAXRINGMODULATORPROPERTIES; -#endif - -// Property ranges and defaults: - -#define EAXRINGMODULATOR_MINFREQUENCY 0.0f -#define EAXRINGMODULATOR_MAXFREQUENCY 8000.0f -#define EAXRINGMODULATOR_DEFAULTFREQUENCY 440.0f - -#define EAXRINGMODULATOR_MINHIGHPASSCUTOFF 0.0f -#define EAXRINGMODULATOR_MAXHIGHPASSCUTOFF 24000.0f -#define EAXRINGMODULATOR_DEFAULTHIGHPASSCUTOFF 800.0f - -#define EAXRINGMODULATOR_MINWAVEFORM 0 -#define EAXRINGMODULATOR_MAXWAVEFORM 2 -#define EAXRINGMODULATOR_DEFAULTWAVEFORM 0 - -//////////////////////////////////////////////////////////////////////////// - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif diff --git a/neo/openal/include/eaxac3.h b/neo/openal/include/eaxac3.h deleted file mode 100644 index 450224e7..00000000 --- a/neo/openal/include/eaxac3.h +++ /dev/null @@ -1,232 +0,0 @@ -/************************************************************************************************ -/ -/ EAX-AC3 Open AL Extension Header file -/ -/ Description : The EAX-AC3 extension to Open AL provides a way to playback Dolby Digital AC3 -/ files on systems equipped with a SB Live! card. The packaged AC3 data is output -/ via the MMSYSTEM Wave device. -/ If a SB Live! 5.1 card is installed then the AC3 data will be decoded by the -/ audio card. -/ If a legacy SB Live! card is installed then the AC3 data will be sent directly -/ to the S/PDIF Out. -/ The API supports multiple EAX-AC3 devices, and multiple AC3 streams. However -/ the current implementation provides one EAX-AC3 device capable of playing -/ one AC3 Stream at a time. -/ -/ Programmer : Daniel Peacock Creative Labs, Inc February 2001 -/ -/************************************************************************************************/ - -#ifndef _EAXAC3_H_ -#define _EAXAC3_H_ - -// Do not define the symbol EAXAC3_EXPORTS in any projects that use the EAX-AC3 Open AL Extension -#ifdef EAXAC3_EXPORTS -#define EAXAC3_API __declspec(dllexport) -#else -#define EAXAC3_API __declspec(dllimport) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _HRESULT_DEFINED -#define _HRESULT_DEFINED -typedef signed long HRESULT; -#endif - -enum POSFORMAT { MILLISECONDS, BYTES, AC3FRAMES }; - -enum SOURCE { AC3FILE, MEMORY }; - -// Success Codes -#define EAXAC3_OK 0 -#define EAXAC3_ALREADYPLAYING 1 -#define EAXAC3_EOF 2 - -// Error Codes -#define EAXAC3ERR_UNABLETOOPENEAXAC3DEVICE -1 -#define EAXAC3ERR_WAVEOUTPREPAREHEADERFAILURE -2 -#define EAXAC3ERR_OUTOFMEMORY -3 -#define EAXAC3ERR_FILENOTFOUND -4 -#define EAXAC3ERR_AC3FILETOBIG -5 -#define EAXAC3ERR_AC3FRAMENOTFOUND -6 -#define EAXAC3ERR_AC3NOTAT48KHZ -7 -#define EAXAC3ERR_INVALIDAC3FRAME -8 -#define EAXAC3ERR_AC3FILENOTOPEN -9 -#define EAXAC3ERR_BUFFERNOTMULTIPLEOFAC3FRAMESIZE -10 -#define EAXAC3ERR_WAVEOUTERROR -11 -#define EAXAC3ERR_FAILEDTOCREATEEVENT -12 -#define EAXAC3ERR_EAXAC3DEVICENOTOPEN -13 -#define EAXAC3ERR_AC3STREAMALREADYOPEN -14 -#define EAXAC3ERR_POSITIONOUTOFRANGE -15 -#define EAXAC3ERR_NOTATSTARTOFAC3FRAME -16 -#define EAXAC3ERR_AC3STREAMNOTOPEN -17 -#define EAXAC3ERR_SETPOSITIONONLYWORKSONAC3FILES -18 -#define EAXAC3ERR_WRITEDATAONLYWORKSWITHMEMORYSTREAMS -19 -#define EAXAC3ERR_INVALIDPARAMETER -20 -#define EAXAC3ERR_NOTENOUGHAC3DATAINAC3DATABUFFER -21 -#define EAXAC3ERR_NOTENOUGHDATA -22 -#define EAXAC3ERR_EAXAC3DEVICEALREADYOPEN -23 -#define EAXAC3ERR_EAXAC3DEVICENOTFOUND -24 -#define EAXAC3ERR_UNSUPPORTED -25 -#define EAXAC3ERR_FAILEDTOCREATEFNTABLE -26 - -#define DEFAULTEAXAC3DEVICE 0 - -#define ENTIREBUFFER 0 -#define FROMWRITECURSOR 1 - -#define LOOPING 1 - -#define ENDOFDATA 1 - -typedef unsigned int EAXAC3HANDLE; - -typedef unsigned int AC3STREAM; - -// Callback function -typedef void (__stdcall *LPAC3CALLBACK)(AC3STREAM AC3Stream, int msg); - -// Callback messages -#define EAXAC3NEEDMOREDATA 0 -#define EAXAC3REACHEDEND 1 - -typedef struct -{ - unsigned int nNumOfAC3Frames; - unsigned int nAC3FrameSize; - unsigned int nSizeOfFile; - unsigned int nDuration; - unsigned int nFrequency; -} AC3FILEINFO, *LPAC3FILEINFO; - -#define UNKNOWN 1 -#define SPDIFPASSTHRU 2 -#define FULLDECODE 4 - -typedef struct -{ - char szDeviceName[256]; - unsigned int uFlags; - unsigned int uStreams; - unsigned int uReserved; -} EAXAC3DEVICEINFO, *LPEAXAC3DEVICEINFO; - -// Function typedefs - -typedef int (*LPEAXAC3QUERYNUMBEROFDEVICES) (void); -typedef HRESULT (*LPEAXAC3QUERYFILE) (char *, LPAC3FILEINFO, int); -typedef HRESULT (*LPEAXAC3QUERYMEMORY) (char *, int, LPAC3FILEINFO, int); -typedef int (*LPEAXAC3QUERYNOOFFRAMESREQFORPLAYBACK) (AC3STREAM); -typedef HRESULT (*LPEAXAC3OPENPLAYBACKDEVICE) (EAXAC3HANDLE); -typedef HRESULT (*LPEAXAC3CLOSEPLAYBACKDEVICE) (EAXAC3HANDLE); -typedef HRESULT (*LPEAXAC3QUERYDEVICECAPS) (EAXAC3HANDLE, LPEAXAC3DEVICEINFO, int); -typedef HRESULT (*LPEAXAC3GETPOSITION) (AC3STREAM, enum POSFORMAT, int *); -typedef HRESULT (*LPEAXAC3SETFILEPOSITION) (AC3STREAM, enum POSFORMAT, int); -typedef HRESULT (*LPEAXAC3OPENSTREAM) (EAXAC3HANDLE, AC3STREAM *, LPAC3CALLBACK, char *, enum SOURCE); -typedef HRESULT (*LPEAXAC3CLOSESTREAM) (AC3STREAM); -typedef HRESULT (*LPEAXAC3PREPLAYSTREAM) (AC3STREAM); -typedef HRESULT (*LPEAXAC3PLAYSTREAM) (AC3STREAM, int); -typedef HRESULT (*LPEAXAC3STOPSTREAM) (AC3STREAM); -typedef HRESULT (*LPEAXAC3PAUSESTREAM) (AC3STREAM); -typedef HRESULT (*LPEAXAC3RESUMESTREAM) (AC3STREAM); -typedef HRESULT (*LPEAXAC3LOCKBUFFER) (AC3STREAM, unsigned long, void **, unsigned long *, void **, - unsigned long *, unsigned long); -typedef HRESULT (*LPEAXAC3UNLOCKBUFFER) (AC3STREAM, void *, unsigned long, void *, unsigned long, int); -typedef HRESULT (*LPEAXAC3SETPLAYBACKMODE) (EAXAC3HANDLE, unsigned int); -typedef char * (*LPEAXAC3GETERRORSTRING) (HRESULT, char *, int); -typedef HRESULT (*LPEAXAC3GETLASTERROR) (HRESULT *); - -// Function table declaration -typedef struct -{ - LPEAXAC3QUERYNUMBEROFDEVICES EAXAC3QueryNumberOfDevices; - LPEAXAC3QUERYFILE EAXAC3QueryFile; - LPEAXAC3QUERYMEMORY EAXAC3QueryMemory; - LPEAXAC3QUERYNOOFFRAMESREQFORPLAYBACK EAXAC3QueryNoOfFramesReqForPlayback; - LPEAXAC3OPENPLAYBACKDEVICE EAXAC3OpenPlaybackDevice; - LPEAXAC3CLOSEPLAYBACKDEVICE EAXAC3ClosePlaybackDevice; - LPEAXAC3QUERYDEVICECAPS EAXAC3QueryDeviceCaps; - LPEAXAC3GETPOSITION EAXAC3GetPosition; - LPEAXAC3SETFILEPOSITION EAXAC3SetFilePosition; - LPEAXAC3OPENSTREAM EAXAC3OpenStream; - LPEAXAC3CLOSESTREAM EAXAC3CloseStream; - LPEAXAC3PREPLAYSTREAM EAXAC3PrePlayStream; - LPEAXAC3PLAYSTREAM EAXAC3PlayStream; - LPEAXAC3STOPSTREAM EAXAC3StopStream; - LPEAXAC3PAUSESTREAM EAXAC3PauseStream; - LPEAXAC3RESUMESTREAM EAXAC3ResumeStream; - LPEAXAC3LOCKBUFFER EAXAC3LockBuffer; - LPEAXAC3UNLOCKBUFFER EAXAC3UnLockBuffer; - LPEAXAC3SETPLAYBACKMODE EAXAC3SetPlaybackMode; - LPEAXAC3GETERRORSTRING EAXAC3GetErrorString; - LPEAXAC3GETLASTERROR EAXAC3GetLastError; -} EAXAC3FNTABLE, *LPEAXAC3FNTABLE; - - -#ifndef OPENAL -typedef EAXAC3_API HRESULT (*LPEAXAC3GETFUNCTIONTABLE) (LPEAXAC3FNTABLE); -#else -typedef ALboolean (*LPALEAXAC3GETFUNCTIONTABLE) (LPEAXAC3FNTABLE); -#endif - -// Functions exposed in the DLL - -EAXAC3_API HRESULT EAXAC3GetFunctionTable(LPEAXAC3FNTABLE lpEAXAC3FnTable); - -EAXAC3_API int EAXAC3QueryNumberOfDevices(); - -EAXAC3_API HRESULT EAXAC3QueryFile(char *szAC3Filename, LPAC3FILEINFO lpAC3Caps, int nSizeOfAC3FileInfoStruct); - -EAXAC3_API HRESULT EAXAC3QueryMemory(char *lpBuffer, int nSizeOfBuffer, LPAC3FILEINFO lpAC3FileInfo, - int nSizeOfAC3FileInfoStruct); - -EAXAC3_API int EAXAC3QueryNoOfFramesReqForPlayback(AC3STREAM AC3Stream); - -EAXAC3_API HRESULT EAXAC3OpenPlaybackDevice(EAXAC3HANDLE EAXAC3Handle); - -EAXAC3_API HRESULT EAXAC3ClosePlaybackDevice(EAXAC3HANDLE EAXAC3Handle); - -EAXAC3_API HRESULT EAXAC3QueryDeviceCaps(EAXAC3HANDLE EAXAC3Handle, LPEAXAC3DEVICEINFO lpEAXAC3DeviceInfo, - int nSizeOfAC3DeviceInfoStruct); - -EAXAC3_API HRESULT EAXAC3GetPosition(AC3STREAM AC3Stream, enum POSFORMAT posFormat, int *lpAmount); - -EAXAC3_API HRESULT EAXAC3SetFilePosition(AC3STREAM AC3Stream, enum POSFORMAT posFormat, int nAmount); - -EAXAC3_API HRESULT EAXAC3OpenStream(EAXAC3HANDLE EAXAC3Handle, AC3STREAM *lpAC3Stream, - LPAC3CALLBACK pAC3CallbackFn, char *szAC3Filename, enum SOURCE src); - -EAXAC3_API HRESULT EAXAC3CloseStream(AC3STREAM AC3Stream); - -EAXAC3_API HRESULT EAXAC3PrePlayStream(AC3STREAM AC3Stream); - -EAXAC3_API HRESULT EAXAC3PlayStream(AC3STREAM AC3Stream, int nLooping); - -EAXAC3_API HRESULT EAXAC3StopStream(AC3STREAM AC3Stream); - -EAXAC3_API HRESULT EAXAC3PauseStream(AC3STREAM AC3Stream); - -EAXAC3_API HRESULT EAXAC3ResumeStream(AC3STREAM AC3Stream); - -EAXAC3_API HRESULT EAXAC3LockBuffer(AC3STREAM AC3Stream, unsigned long ulBytes, void **ppvPointer1, - unsigned long *pdwBytes1, void **ppvPointer2, unsigned long *pdwBytes2, - unsigned long ulFlags); - -EAXAC3_API HRESULT EAXAC3UnLockBuffer(AC3STREAM AC3Stream, void *pvPointer1, unsigned long ulSize1, - void *pvPointer2, unsigned long ulSize2, int nFinished); - -EAXAC3_API HRESULT EAXAC3SetPlaybackMode(EAXAC3HANDLE EAXAC3Handle, unsigned int ulPlayMode); - -EAXAC3_API char * EAXAC3GetErrorString(HRESULT hr, char *szErrorString, int nSizeOfErrorString); - -EAXAC3_API HRESULT EAXAC3GetLastError(HRESULT *hr); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/include/eaxman.h b/neo/openal/include/eaxman.h deleted file mode 100644 index b54ea1d8..00000000 --- a/neo/openal/include/eaxman.h +++ /dev/null @@ -1,171 +0,0 @@ -/* -*/ -#ifndef __EAXMANH -#define __EAXMANH - -#define COM_NO_WINDOWS_H -#include -#include "eax3.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -//#define CLSID_EAXMANAGER CLSID_EAX20_Manager -//#define IID_IEaxManager IID_EAX20_Manager -#define EM_MAX_NAME 32 - -#define EMFLAG_IDDEFAULT (-1) -#define EMFLAG_IDNONE (-2) -#define EMFLAG_LOCKPOSITION 1 -#define EMFLAG_LOADFROMMEMORY 2 -#define EMFLAG_NODIFFRACTION 4 - -typedef struct _EMPOINT { - float fX; - float fY; - float fZ; -} EMPOINT; -typedef EMPOINT FAR *LPEMPOINT; - -typedef struct _LISTENERATTRIBUTES { - float fDistanceFactor; - float fRolloffFactor; - float fDopplerFactor; -} LISTENERATTRIBUTES; -typedef LISTENERATTRIBUTES FAR *LPLISTENERATTRIBUTES; - -typedef struct _SOURCEATTRIBUTES { - EAXBUFFERPROPERTIES eaxAttributes; - unsigned long ulInsideConeAngle; - unsigned long ulOutsideConeAngle; - long lConeOutsideVolume; - float fConeXdir; - float fConeYdir; - float fConeZdir; - float fMinDistance; - float fMaxDistance; - long lDupCount; - long lPriority; -} SOURCEATTRIBUTES; -typedef SOURCEATTRIBUTES FAR *LPSOURCEATTRIBUTES; - -typedef struct _MATERIALATTRIBUTES { - long lLevel; - float fLFRatio; - float fRoomRatio; - DWORD dwFlags; -} MATERIALATTRIBUTES; -typedef MATERIALATTRIBUTES FAR *LPMATERIALATTRIBUTES; - -#define EMMATERIAL_OBSTRUCTS 1 -#define EMMATERIAL_OCCLUDES 3 - -typedef struct _DIFFRACTIONBOX { - long lSubspaceID; - EMPOINT empMin; - EMPOINT empMax; -} DIFFRACTIONBOX; -typedef DIFFRACTIONBOX FAR *LPDIFFRACTIONBOX; - -// {7CE4D6E6-562F-11d3-8812-005004062F83} -DEFINE_GUID(CLSID_EAXMANAGER, 0x60b721a1, 0xf7c8, 0x11d2, 0xa0, 0x2e, 0x0, 0x50, 0x4, 0x6, 0x18, 0xb8); - -#ifdef __cplusplus -struct IEaxManager; -#endif // __cplusplus - -typedef struct IEaxManager *LPEAXMANAGER; - -// {7CE4D6E8-562F-11d3-8812-005004062F83} -DEFINE_GUID(IID_IEaxManager, 0x60b721a2, 0xf7c8, 0x11d2, 0xa0, 0x2e, 0x0, 0x50, 0x4, 0x6, 0x18, 0xb8); - -#undef INTERFACE -#define INTERFACE IEaxManager - -extern HRESULT __stdcall EaxManagerCreate(LPEAXMANAGER*); -typedef HRESULT (__stdcall *LPEAXMANAGERCREATE)(LPEAXMANAGER*); - -DECLARE_INTERFACE_(IEaxManager, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - STDMETHOD(GetDataSetSize) (THIS_ unsigned long*, DWORD) PURE; - STDMETHOD(LoadDataSet) (THIS_ char*, DWORD) PURE; - STDMETHOD(FreeDataSet) (THIS_ DWORD) PURE; - STDMETHOD(GetListenerAttributes) (THIS_ LPLISTENERATTRIBUTES) PURE; - STDMETHOD(GetSourceID) (THIS_ char*, long*) PURE; - STDMETHOD(GetSourceAttributes) (THIS_ long, LPSOURCEATTRIBUTES) PURE; - STDMETHOD(GetSourceNumInstances) (THIS_ long, long*) PURE; - STDMETHOD(GetSourceInstancePos) (THIS_ long, long, LPEMPOINT) PURE; - STDMETHOD(GetEnvironmentID) (THIS_ char*, long*) PURE; - STDMETHOD(GetEnvironmentAttributes) (THIS_ long, LPEAXLISTENERPROPERTIES) PURE; - STDMETHOD(GetMaterialID) (THIS_ char*, long*) PURE; - STDMETHOD(GetMaterialAttributes) (THIS_ long, LPMATERIALATTRIBUTES) PURE; - STDMETHOD(GetGeometrySetID) (THIS_ char*, long*) PURE; - STDMETHOD(GetListenerDynamicAttributes) (THIS_ long, LPEMPOINT, long*, DWORD) PURE; - STDMETHOD(GetSourceDynamicAttributes) (THIS_ long, LPEMPOINT, long*, float*, long*, float*, float*, LPEMPOINT, DWORD) PURE; -// STDMETHOD(GetSubSpaceID) (THIS_ long, LPEMPOINT, long *) PURE; - STDMETHOD(GetEnvironmentName) (THIS_ long, char *szString, long lStrlen) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IEaxManager_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IEaxManager_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IEaxManager_Release(p) (p)->lpVtbl->Release(p) -#define IEaxManager_GetDataSetSize(p,a,b) (p)->lpVtbl->GetDataSetSize(p,a,b) -#define IEaxManager_LoadDataSet(p,a,b) (p)->lpVtbl->LoadDataSet(p,a,b) -#define IEaxManager_FreeDataSet(p,a) (p)->lpVtbl->FreeDataSet(p,a) -#define IEaxManager_GetListenerAttributes(p,a) (p)->lpVtbl->GetListenerAttributes(p,a) -#define IEaxManager_GetSourceID(p,a,b) (p)->lpVtbl->GetSourceID(p,a,b) -#define IEaxManager_GetSourceAttributes(p,a,b) (p)->lpVtbl->GetSourceAttributes(p,a,b) -#define IEaxManager_GetSourceNumInstances(p,a,b) (p)->lpVtbl->GetSourceNumInstances(p,a,b) -#define IEaxManager_GetSourceInstancePos(p,a,b,c) (p)->lpVtbl->GetSourceInstancePos(p,a,b,c) -#define IEaxManager_GetEnvironmentID(p,a,b) (p)->lpVtbl->GetEnvironmentID(p,a,b) -#define IEaxManager_GetEnvironmentAttributes(p,a,b) (p)->lpVtbl->GetEnvironmentAttributes(p,a,b) -#define IEaxManager_GetMaterialID(p,a,b) (p)->lpVtbl->GetMaterialID(p,a,b) -#define IEaxManager_GetMaterialAttributes(p,a,b) (p)->lpVtbl->GetMaterialAttributes(p,a,b) -#define IEaxManager_GetGeometrySetID(p,a,b) (p)->lpVtbl->GetGeometrySetID(p,a,b) -#define IEaxManager_GetListenerDynamicAttributes(p,a,b,c,d) (p)->lpVtbl->GetListenerDynamicAttributes(p,a,b,c,d) -#define IEaxManager_GetSourceDynamicAttributes(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->GetSourceDynamicAttributes(p,a,b,c,d,e,f,g,h,i) -//#define IEaxManager_GetSubSpaceID(p,a,b,c) (p)->lpVtbl->GetSubSpaceID(p,a,b,c) -#define IEaxManager_GetEnvironmentName(p,a,b,c) (p)->lpVtbl->GetEnvironmentName(p,a,b,c) -#else -#define IEaxManager_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IEaxManager_AddRef(p) (p)->AddRef() -#define IEaxManager_Release(p) (p)->Release() -#define IEaxManager_GetDataSetSize(p,a,b) (p)->GetDataSetSize(a,b) -#define IEaxManager_LoadDataSet(p,a,b) (p)->LoadDataSet(a,b) -#define IEaxManager_FreeDataSet(p,a) (p)->FreeDataSet(a) -#define IEaxManager_GetListenerAttributes(p,a) (p)->GetListenerAttributes(a) -#define IEaxManager_GetSourceID(p,a,b) (p)->GetSourceID(a,b) -#define IEaxManager_GetSourceAttributes(p,a,b) (p)->GetSourceAttributes(a,b) -#define IEaxManager_GetSourceNumInstances(p,a,b) (p)->GetSourceNumInstances(a,b) -#define IEaxManager_GetSourceInstancePos(p,a,b,c) (p)->GetSourceInstancePos(a,b,c) -#define IEaxManager_GetEnvironmentID(p,a,b) (p)->GetEnvironmentID(a,b) -#define IEaxManager_GetEnvironmentAttributes(p,a,b) (p)->GetEnvironmentAttributes(a,b) -#define IEaxManager_GetMaterialID(p,a,b) (p)->GetMaterialID(a,b) -#define IEaxManager_GetMaterialAttributes(p,a,b) (p)->GetMaterialAttributes(a,b) -#define IEaxManager_GetGeometrySetID(p,a,b) (p)->GetGeometrySetID(a,b) -#define IEaxManager_GetListenerDynamicAttributes(p,a,b,c,d) (p)->GetListenerDynamicAttributes(a,b,c,d) -#define IEaxManager_GetSourceDynamicAttributes(p,a,b,c,d,e,f,g,h,i) (p)->GetSourceDynamicAttributes(a,b,c,d,e,f,g,h,i) -//#define IEaxManager_GetSubSpaceID(p,a,b,c) (p)->GetSubSpaceID(a,b,c) -#define IEaxManager_GetEnvironmentName(p,a,b,c) (p)->GetEnvironmentName(a,b,c) -#endif - -#define EM_OK 0 -#define EM_INVALIDID MAKE_HRESULT(1, FACILITY_ITF, 1) -#define EM_IDNOTFOUND MAKE_HRESULT(1, FACILITY_ITF, 2) -#define EM_FILENOTFOUND MAKE_HRESULT(1, FACILITY_ITF, 3) -#define EM_FILEINVALID MAKE_HRESULT(1, FACILITY_ITF, 4) -#define EM_VERSIONINVALID MAKE_HRESULT(1, FACILITY_ITF, 5) -#define EM_INSTANCENOTFOUND MAKE_HRESULT(1, FACILITY_ITF, 6) - -#ifdef __cplusplus -}; -#endif // __cplusplus - -#endif diff --git a/neo/openal/lib/eaxguid.lib b/neo/openal/lib/eaxguid.lib deleted file mode 100644 index 83618ae59ccc3ad8b438569aa3db31fde68276f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4426 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 H&B6O0pT{z5 diff --git a/neo/openal/osx/OpenAL.framework/Headers b/neo/openal/osx/OpenAL.framework/Headers deleted file mode 100644 index a177d2a6..00000000 --- a/neo/openal/osx/OpenAL.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/neo/openal/osx/OpenAL.framework/OpenAL b/neo/openal/osx/OpenAL.framework/OpenAL deleted file mode 100644 index 7a4d340e..00000000 --- a/neo/openal/osx/OpenAL.framework/OpenAL +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/OpenAL \ No newline at end of file diff --git a/neo/openal/osx/OpenAL.framework/Resources b/neo/openal/osx/OpenAL.framework/Resources deleted file mode 100644 index 953ee36f..00000000 --- a/neo/openal/osx/OpenAL.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/al.h b/neo/openal/osx/OpenAL.framework/Versions/A/Headers/al.h deleted file mode 100644 index 8759876a..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/al.h +++ /dev/null @@ -1,498 +0,0 @@ -#ifndef _AL_H_ -#define _AL_H_ - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "altypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - #ifdef _LIB - #define ALAPI __declspec(dllexport) - #else - #define ALAPI __declspec(dllimport) - #endif - #define ALAPIENTRY __cdecl - #define AL_CALLBACK -#else - #ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export on - #endif - #endif - #define ALAPI - #define ALAPIENTRY - #define AL_CALLBACK -#endif - -#define OPENAL - -#ifndef AL_NO_PROTOTYPES - -/** - * OpenAL Maintenance Functions - * Initialization and exiting. - * State Management and Query. - * Error Handling. - * Extension Support. - */ - -/** State management. */ -ALAPI ALvoid ALAPIENTRY alEnable( ALenum capability ); -ALAPI ALvoid ALAPIENTRY alDisable( ALenum capability ); -ALAPI ALboolean ALAPIENTRY alIsEnabled( ALenum capability ); - -/** Application preferences for driver performance choices. */ -ALAPI ALvoid ALAPIENTRY alHint( ALenum target, ALenum mode ); - -/** State retrieval. */ -ALAPI ALboolean ALAPIENTRY alGetBoolean( ALenum param ); -ALAPI ALint ALAPIENTRY alGetInteger( ALenum param ); -ALAPI ALfloat ALAPIENTRY alGetFloat( ALenum param ); -ALAPI ALdouble ALAPIENTRY alGetDouble( ALenum param ); -ALAPI ALvoid ALAPIENTRY alGetBooleanv( ALenum param, ALboolean* data ); -ALAPI ALvoid ALAPIENTRY alGetIntegerv( ALenum param, ALint* data ); -ALAPI ALvoid ALAPIENTRY alGetFloatv( ALenum param, ALfloat* data ); -ALAPI ALvoid ALAPIENTRY alGetDoublev( ALenum param, ALdouble* data ); -ALAPI ALubyte* ALAPIENTRY alGetString( ALenum param ); - -ALAPI ALvoid ALAPIENTRY alSetInteger( ALenum pname, ALint value ); -ALAPI ALvoid ALAPIENTRY alSetDouble( ALenum pname, ALdouble value ); - -/** - * Error support. - * Obtain the most recent error generated in the AL state machine. - */ -ALAPI ALenum ALAPIENTRY alGetError(); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALboolean ALAPIENTRY alIsExtensionPresent( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALvoid* ALAPIENTRY alGetProcAddress( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the integer value of an enumeration (usually an extension) with the name ename. - */ -ALAPI ALenum ALAPIENTRY alGetEnumValue( ALubyte* ename ); - - - - -/** - * LISTENER - * Listener is the sample position for a given context. - * The multi-channel (usually stereo) output stream generated - * by the mixer is parametrized by this Listener object: - * its position and velocity relative to Sources, within - * occluder and reflector geometry. - */ - - - -/** - * - * Listener Environment: default 0. - */ -ALAPI ALvoid ALAPIENTRY alListeneri( ALenum param, ALint value ); - - -/** - * - * Listener Gain: default 1.0f. - */ -ALAPI ALvoid ALAPIENTRY alListenerf( ALenum param, ALfloat value ); - - -/** - * - * Listener Position. - * Listener Velocity. - */ -ALAPI ALvoid ALAPIENTRY alListener3f( ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); - - -/** - * - * Listener Position: ALfloat[3] - * Listener Velocity: ALfloat[3] - * Listener Orientation: ALfloat[6] (forward and up vector). - */ -ALAPI ALvoid ALAPIENTRY alListenerfv( ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY alGetListeneri( ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY alGetListenerf( ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY alGetListener3f( ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 ); -ALAPI ALvoid ALAPIENTRY alGetListenerfv( ALenum param, ALfloat* values ); - - -/** - * SOURCE - * Source objects are by default localized. Sources - * take the PCM data provided in the specified Buffer, - * apply Source-specific modifications, and then - * submit them to be mixed according to spatial - * arrangement etc. - */ - - - -/** Create Source objects. */ -ALAPI ALvoid ALAPIENTRY alGenSources( ALsizei n, ALuint* sources ); - -/** Delete Source objects. */ -ALAPI ALvoid ALAPIENTRY alDeleteSources( ALsizei n, ALuint* sources ); - -/** Verify a handle is a valid Source. */ -ALAPI ALboolean ALAPIENTRY alIsSource( ALuint id ); - -/** Set an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY alSourcei( ALuint source, ALenum param, ALint value ); -ALAPI ALvoid ALAPIENTRY alSourcef( ALuint source, ALenum param, ALfloat value ); -ALAPI ALvoid ALAPIENTRY alSource3f( ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); -ALAPI ALvoid ALAPIENTRY alSourcefv( ALuint source, ALenum param, ALfloat* values ); - -/** Get an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY alGetSourcei( ALuint source, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY alGetSourcef( ALuint source, ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY alGetSource3f( ALuint source, ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 ); -ALAPI ALvoid ALAPIENTRY alGetSourcefv( ALuint source, ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY alSourcePlayv( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY alSourcePausev( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY alSourceStopv( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n,ALuint *sources); - -/** Activate a source, start replay. */ -ALAPI ALvoid ALAPIENTRY alSourcePlay( ALuint source ); - -/** - * Pause a source, - * temporarily remove it from the mixer list. - */ -ALAPI ALvoid ALAPIENTRY alSourcePause( ALuint source ); - -/** - * Stop a source, - * temporarily remove it from the mixer list, - * and reset its internal state to pre-Play. - * To remove a Source completely, it has to be - * deleted following Stop, or before Play. - */ -ALAPI ALvoid ALAPIENTRY alSourceStop( ALuint source ); - -/** - * Rewinds a source, - * temporarily remove it from the mixer list, - * and reset its internal state to pre-Play. - */ -ALAPI ALvoid ALAPIENTRY alSourceRewind( ALuint source ); - - - -/** - * BUFFER - * Buffer objects are storage space for sample data. - * Buffers are referred to by Sources. There can be more than - * one Source using the same Buffer data. If Buffers have - * to be duplicated on a per-Source basis, the driver has to - * take care of allocation, copying, and deallocation as well - * as propagating buffer data changes. - */ - - - - -/** Buffer object generation. */ -ALAPI ALvoid ALAPIENTRY alGenBuffers( ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY alDeleteBuffers( ALsizei n, ALuint* buffers ); -ALAPI ALboolean ALAPIENTRY alIsBuffer( ALuint buffer ); - -/** - * Specify the data to be filled into a buffer. - */ -ALAPI ALvoid ALAPIENTRY alBufferData( ALuint buffer, - ALenum format, - ALvoid* data, - ALsizei size, - ALsizei freq ); - - -ALAPI ALvoid ALAPIENTRY alGetBufferi( ALuint buffer, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY alGetBufferf( ALuint buffer, ALenum param, ALfloat* value ); - - - - -/** - * Queue stuff - */ - -ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers( ALuint source, ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers( ALuint source, ALsizei n, ALuint* buffers ); - -/** - * Knobs and dials - */ -ALAPI ALvoid ALAPIENTRY alDistanceModel( ALenum value ); -ALAPI ALvoid ALAPIENTRY alDopplerFactor( ALfloat value ); -ALAPI ALvoid ALAPIENTRY alDopplerVelocity( ALfloat value ); - -#else /* AL_NO_PROTOTYPES */ - -/** - * OpenAL Maintenance Functions - * Initialization and exiting. - * State Management and Query. - * Error Handling. - * Extension Support. - */ - -/** State management. */ -ALAPI ALvoid ALAPIENTRY (*alEnable)( ALenum capability ); -ALAPI ALvoid ALAPIENTRY (*alDisable)( ALenum capability ); -ALAPI ALboolean ALAPIENTRY (*alIsEnabled)( ALenum capability ); - -/** Application preferences for driver performance choices. */ -ALAPI ALvoid ALAPIENTRY (*alHint)( ALenum target, ALenum mode ); - -/** State retrieval. */ -ALAPI ALboolean ALAPIENTRY (*alGetBoolean)( ALenum param ); -ALAPI ALint ALAPIENTRY (*alGetInteger)( ALenum param ); -ALAPI ALfloat ALAPIENTRY (*alGetFloat)( ALenum param ); -ALAPI ALdouble ALAPIENTRY (*alGetDouble)( ALenum param ); -ALAPI ALvoid ALAPIENTRY (*alGetBooleanv)( ALenum param, ALboolean* data ); -ALAPI ALvoid ALAPIENTRY (*alGetIntegerv)( ALenum param, ALint* data ); -ALAPI ALvoid ALAPIENTRY (*alGetFloatv)( ALenum param, ALfloat* data ); -ALAPI ALvoid ALAPIENTRY (*alGetDoublev)( ALenum param, ALdouble* data ); -ALAPI ALubyte* ALAPIENTRY (*alGetString)( ALenum param ); - -ALAPI ALvoid ALAPIENTRY (*alSetInteger)( ALenum pname, ALint value ); -ALAPI ALvoid ALAPIENTRY (*alSetDouble)( ALenum pname, ALdouble value ); - -/** - * Error support. - * Obtain the most recent error generated in the AL state machine. - */ -ALAPI ALenum ALAPIENTRY (*alGetError)( ALvoid ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALboolean ALAPIENTRY (*alIsExtensionPresent)( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the address of a function (usually an extension) - * with the name fname. All addresses are context-independent. - */ -ALAPI ALvoid* ALAPIENTRY (*alGetProcAddress)( ALubyte* fname ); - - -/** - * Extension support. - * Obtain the integer value of an enumeration (usually an extension) with the name ename. - */ -ALAPI ALenum ALAPIENTRY (*alGetEnumValue)( ALubyte* ename ); - - - - -/** - * LISTENER - * Listener is the sample position for a given context. - * The multi-channel (usually stereo) output stream generated - * by the mixer is parametrized by this Listener object: - * its position and velocity relative to Sources, within - * occluder and reflector geometry. - */ - - - -/** - * - * Listener Environment: default 0. - */ -ALAPI ALvoid ALAPIENTRY (*alListeneri)( ALenum param, ALint value ); - - -/** - * - * Listener Gain: default 1.0f. - */ -ALAPI ALvoid ALAPIENTRY (*alListenerf)( ALenum param, ALfloat value ); - - -/** - * - * Listener Position. - * Listener Velocity. - */ -ALAPI ALvoid ALAPIENTRY (*alListener3f)( ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); - - -/** - * - * Listener Position: ALfloat[3] - * Listener Velocity: ALfloat[3] - * Listener Orientation: ALfloat[6] (forward and up vector). - */ -ALAPI ALvoid ALAPIENTRY (*alListenerfv)( ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY (*alGetListeneri)( ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY (*alGetListenerf)( ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY (*alGetListener3f)( ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 ); -ALAPI ALvoid ALAPIENTRY (*alGetListenerfv)( ALenum param, ALfloat* values ); - - -/** - * SOURCE - * Source objects are by default localized. Sources - * take the PCM data provided in the specified Buffer, - * apply Source-specific modifications, and then - * submit them to be mixed according to spatial - * arrangement etc. - */ - - - -/** Create Source objects. */ -ALAPI ALvoid ALAPIENTRY (*alGenSources)( ALsizei n, ALuint* sources ); - -/** Delete Source objects. */ -ALAPI ALvoid ALAPIENTRY (*alDeleteSources)( ALsizei n, ALuint* sources ); - -/** Verify a handle is a valid Source. */ -ALAPI ALboolean ALAPIENTRY (*alIsSource)( ALuint id ); - -/** Set an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY (*alSourcei)( ALuint source, ALenum param, ALint value ); -ALAPI ALvoid ALAPIENTRY (*alSourcef)( ALuint source, ALenum param, ALfloat value ); -ALAPI ALvoid ALAPIENTRY (*alSource3f)( ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 ); -ALAPI ALvoid ALAPIENTRY (*alSourcefv)( ALuint source, ALenum param, ALfloat* values ); - -/** Get an integer parameter for a Source object. */ -ALAPI ALvoid ALAPIENTRY (*alGetSourcei)( ALuint source, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY (*alGetSourcef)( ALuint source, ALenum param, ALfloat* value ); -ALAPI ALvoid ALAPIENTRY (*alGetSourcefv)( ALuint source, ALenum param, ALfloat* values ); - -ALAPI ALvoid ALAPIENTRY (*alSourcePlayv)( ALsizei n, ALuint *sources ); -ALAPI ALvoid ALAPIENTRY (*alSourceStopv)( ALsizei n, ALuint *sources ); - -/** Activate a source, start replay. */ -ALAPI ALvoid ALAPIENTRY (*alSourcePlay)( ALuint source ); - -/** - * Pause a source, - * temporarily remove it from the mixer list. - */ -ALAPI ALvoid ALAPIENTRY (*alSourcePause)( ALuint source ); - -/** - * Stop a source, - * temporarily remove it from the mixer list, - * and reset its internal state to pre-Play. - * To remove a Source completely, it has to be - * deleted following Stop, or before Play. - */ -ALAPI ALvoid ALAPIENTRY (*alSourceStop)( ALuint source ); - - - -/** - * BUFFER - * Buffer objects are storage space for sample data. - * Buffers are referred to by Sources. There can be more than - * one Source using the same Buffer data. If Buffers have - * to be duplicated on a per-Source basis, the driver has to - * take care of allocation, copying, and deallocation as well - * as propagating buffer data changes. - */ - - - - -/** Buffer object generation. */ -ALAPI ALvoid ALAPIENTRY (*alGenBuffers)( ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY (*alDeleteBuffers)( ALsizei n, ALuint* buffers ); -ALAPI ALboolean ALAPIENTRY (*alIsBuffer)( ALuint buffer ); - -/** - * Specify the data to be filled into a buffer. - */ -ALAPI ALvoid ALAPIENTRY (*alBufferData)( ALuint buffer, - ALenum format, - ALvoid* data, - ALsizei size, - ALsizei freq ); - -ALAPI ALvoid ALAPIENTRY (*alGetBufferi)( ALuint buffer, ALenum param, ALint* value ); -ALAPI ALvoid ALAPIENTRY (*alGetBufferf)( ALuint buffer, ALenum param, ALfloat* value ); - - - - -/** - * Queue stuff - */ -ALAPI ALvoid ALAPIENTRY (*alSourceQueueBuffers)( ALuint source, ALsizei n, ALuint* buffers ); -ALAPI ALvoid ALAPIENTRY (*alSourceUnqueueBuffers)( ALuint source, ALsizei n, ALuint* buffers ); - -/** - * Knobs and dials - */ -ALAPI ALvoid ALAPIENTRY (*alDistanceModel)( ALenum value ); -ALAPI ALvoid ALAPIENTRY (*alDopplerFactor)( ALfloat value ); -ALAPI ALvoid ALAPIENTRY (*alDopplerVelocity)( ALfloat value ); - - -#endif /* AL_NO_PROTOTYPES */ - -#ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export off - #endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h b/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h deleted file mode 100644 index 641e2fd8..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef _ALC_H_ -#define _ALC_H_ - -#include "altypes.h" -#include "alctypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - #ifdef _LIB - #define ALCAPI __declspec(dllexport) - #else - #define ALCAPI __declspec(dllimport) - typedef ALCvoid ALCdevice; - typedef ALCvoid ALCcontext; - #endif - #define ALCAPIENTRY __cdecl -#else - #ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export on - #endif - #endif - #define ALCAPI - #define ALCAPIENTRY - typedef ALCvoid ALCdevice; - typedef ALCvoid ALCcontext; -#endif - -#ifndef ALC_NO_PROTOTYPES - -ALCAPI ALCubyte* ALCAPIENTRY alcGetString(ALCdevice *device,ALCenum param); -ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALCsizei size,ALCint *data); - -ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(ALCubyte *deviceName); -ALCAPI ALCvoid ALCAPIENTRY alcCloseDevice(ALCdevice *device); - -ALCAPI ALCcontext*ALCAPIENTRY alcCreateContext(ALCdevice *device,ALCint *attrList); -ALCAPI ALCboolean ALCAPIENTRY alcMakeContextCurrent(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY alcProcessContext(ALCcontext *context); -ALCAPI ALCcontext*ALCAPIENTRY alcGetCurrentContext(); -ALCAPI ALCdevice* ALCAPIENTRY alcGetContextsDevice(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY alcSuspendContext(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY alcDestroyContext(ALCcontext *context); - -ALCAPI ALCenum ALCAPIENTRY alcGetError(ALCdevice *device); - -ALCAPI ALCboolean ALCAPIENTRY alcIsExtensionPresent(ALCdevice *device,ALCubyte *extName); -ALCAPI ALCvoid * ALCAPIENTRY alcGetProcAddress(ALCdevice *device,ALCubyte *funcName); -ALCAPI ALCenum ALCAPIENTRY alcGetEnumValue(ALCdevice *device,ALCubyte *enumName); - -#else /* AL_NO_PROTOTYPES */ - -ALCAPI ALCubyte* ALCAPIENTRY (*alcGetString)(ALCdevice *device,ALCenum param); -ALCAPI ALCvoid ALCAPIENTRY (*alcGetIntegerv)(ALCdevice * device,ALCenum param,ALCsizei size,ALCint *data); - -ALCAPI ALCdevice* ALCAPIENTRY (*alcOpenDevice)(ALubyte *deviceName); -ALCAPI ALCvoid ALCAPIENTRY (*alcCloseDevice)(ALCdevice *device); - -ALCAPI ALCcontext*ALCAPIENTRY (*alcCreateContext)(ALCdevice *device,ALCint *attrList); -ALCAPI ALCboolean ALCAPIENTRY (*alcMakeContextCurrent)(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY (*alcProcessContext)(ALCcontext *context); -ALCAPI ALCcontext*ALCAPIENTRY (*alcGetCurrentContext)(ALCvoid); -ALCAPI ALCdevice* ALCAPIENTRY (*alcGetContextsDevice)(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY (*alcSuspendContext)(ALCcontext *context); -ALCAPI ALCvoid ALCAPIENTRY (*alcDestroyContext)(ALCcontext *context); - -ALCAPI ALCenum ALCAPIENTRY (*alcGetError)(ALCdevice *device); - -ALCAPI ALCboolean ALCAPIENTRY (*alcIsExtensionPresent)(ALCdevice *device,ALCubyte *extName); -ALCAPI ALCvoid * ALCAPIENTRY (*alcGetProcAddress)(ALCdevice *device,ALCubyte *funcName); -ALCAPI ALCenum ALCAPIENTRY (*alcGetEnumValue)(ALCdevice *device,ALCubyte *enumName); - -#endif /* AL_NO_PROTOTYPES */ - -#ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export off - #endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h b/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h deleted file mode 100644 index 90364609..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h +++ /dev/null @@ -1,165 +0,0 @@ -#ifndef _ALCTYPES_H_ -#define _ALCTYPES_H_ - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * Portions Copyright (C) 2004 by Apple Computer Inc. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -/** ALC boolean type. */ -typedef char ALCboolean; - -/** ALC 8bit signed byte. */ -typedef char ALCbyte; - -/** ALC 8bit unsigned byte. */ -typedef unsigned char ALCubyte; - -/** ALC 16bit signed short integer type. */ -typedef short ALCshort; - -/** ALC 16bit unsigned short integer type. */ -typedef unsigned short ALCushort; - -/** ALC 32bit unsigned integer type. */ -typedef unsigned ALCuint; - -/** ALC 32bit signed integer type. */ -typedef int ALCint; - -/** ALC 32bit floating point type. */ -typedef float ALCfloat; - -/** ALC 64bit double point type. */ -typedef double ALCdouble; - -/** ALC 32bit type. */ -typedef unsigned int ALCsizei; - -/** ALC void type */ -typedef void ALCvoid; - -/** ALC enumerations. */ -typedef int ALCenum; - -/* Bad value. */ -#define ALC_INVALID (-1) - -/* Boolean False. */ -#define ALC_FALSE 0 - -/* Boolean True. */ -#define ALC_TRUE 1 - -/** Errors: No Error. */ -#define ALC_NO_ERROR ALC_FALSE - -#define ALC_MAJOR_VERSION 0x1000 -#define ALC_MINOR_VERSION 0x1001 -#define ALC_ATTRIBUTES_SIZE 0x1002 -#define ALC_ALL_ATTRIBUTES 0x1003 - -#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004 -#define ALC_DEVICE_SPECIFIER 0x1005 -#define ALC_EXTENSIONS 0x1006 - -#define ALC_FREQUENCY 0x1007 -#define ALC_REFRESH 0x1008 -#define ALC_SYNC 0x1009 - -/** - * The device argument does not name a valid dvice. - */ -#define ALC_INVALID_DEVICE 0xA001 - -/** - * The context argument does not name a valid context. - */ -#define ALC_INVALID_CONTEXT 0xA002 - -/** - * A function was called at inappropriate time, - * or in an inappropriate way, causing an illegal state. - * This can be an incompatible ALenum, object ID, - * and/or function. - */ -#define ALC_INVALID_ENUM 0xA003 - -/** - * Illegal value passed as an argument to an AL call. - * Applies to parameter values, but not to enumerations. - */ -#define ALC_INVALID_VALUE 0xA004 - -/** - * A function could not be completed, - * because there is not enough memory available. - */ -#define ALC_OUT_OF_MEMORY 0xA005 - - -//********************************************************************************* -// OSX Specific Properties -//********************************************************************************* - -/** - * Convert Data When Loading. Default false, currently applies only to monophonic sounds - */ -#define ALC_CONVERT_DATA_UPON_LOADING 0xF001 - -/** - * Render Quality. - */ -#define ALC_SPATIAL_RENDERING_QUALITY 0xF002 - #define ALC_SPATIAL_RENDERING_QUALITY_HIGH 'rqhi' - #define ALC_SPATIAL_RENDERING_QUALITY_LOW 'rdlo' - -/** - * Mixer Output Rate. - */ -#define ALC_MIXER_OUTPUT_RATE 0xF003 - -/** - * Maximum Mixer Busses. - * Set this before opening a new OAL device to indicate how many busses on the mixer - * are desired. Get returns either the current devices bus count value, or the value - * that will be used to open a device - */ -#define ALC_MIXER_MAXIMUM_BUSSES 0xF004 - -/** - * Render Channels. - * Allows a user to force OpenAL to render to stereo, regardless of the audio hardware being used - */ -#define ALC_RENDER_CHANNEL_COUNT 0xF005 - #define ALC_RENDER_CHANNEL_COUNT_STEREO 'rcst' - #define ALC_RENDER_CHANNEL_COUNT_MULTICHANNEL 'rcmc' - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h b/neo/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h deleted file mode 100644 index 6e96d334..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h +++ /dev/null @@ -1,326 +0,0 @@ -#ifndef _ALTYPES_H_ -#define _ALTYPES_H_ - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -/** OpenAL boolean type. */ -typedef char ALboolean; - -/** OpenAL 8bit signed byte. */ -typedef char ALbyte; - -/** OpenAL 8bit unsigned byte. */ -typedef unsigned char ALubyte; - -/** OpenAL 16bit signed short integer type. */ -typedef short ALshort; - -/** OpenAL 16bit unsigned short integer type. */ -typedef unsigned short ALushort; - -/** OpenAL 32bit unsigned integer type. */ -typedef unsigned ALuint; - -/** OpenAL 32bit signed integer type. */ -typedef int ALint; - -/** OpenAL 32bit floating point type. */ -typedef float ALfloat; - -/** OpenAL 64bit double point type. */ -typedef double ALdouble; - -/** OpenAL 32bit type. */ -typedef unsigned int ALsizei; - -/** OpenAL void type */ -typedef void ALvoid; - -/** OpenAL enumerations. */ -typedef int ALenum; - -/* Bad value. */ -#define AL_INVALID (-1) - -/* Disable value. */ -#define AL_NONE 0 - -/* Boolean False. */ -#define AL_FALSE 0 - -/* Boolean True. */ -#define AL_TRUE 1 - -/** - * Indicate the type of AL_SOURCE. - * Sources can be spatialized - */ -#define AL_SOURCE_TYPE 0x200 - -/** Indicate source has absolute coordinates. */ -#define AL_SOURCE_ABSOLUTE 0x201 - -/** Indicate Source has listener relative coordinates. */ -#define AL_SOURCE_RELATIVE 0x202 - -/** - * Directional source, inner cone angle, in degrees. - * Range: [0-360] - * Default: 360 - */ -#define AL_CONE_INNER_ANGLE 0x1001 - -/** - * Directional source, outer cone angle, in degrees. - * Range: [0-360] - * Default: 360 - */ -#define AL_CONE_OUTER_ANGLE 0x1002 - -/** - * Specify the pitch to be applied, either at source, - * or on mixer results, at listener. - * Range: [0.5-2.0] - * Default: 1.0 - */ -#define AL_PITCH 0x1003 - -/** - * Specify the current location in three dimensional space. - * OpenAL, like OpenGL, uses a right handed coordinate system, - * where in a frontal default view X (thumb) points right, - * Y points up (index finger), and Z points towards the - * viewer/camera (middle finger). - * To switch from a left handed coordinate system, flip the - * sign on the Z coordinate. - * Listener position is always in the world coordinate system. - */ -#define AL_POSITION 0x1004 - -/** Specify the current direction as forward vector. */ -#define AL_DIRECTION 0x1005 - -/** Specify the current velocity in three dimensional space. */ -#define AL_VELOCITY 0x1006 - -/** - * Indicate whether source has to loop infinite. - * Type: ALboolean - * Range: [AL_TRUE, AL_FALSE] - * Default: AL_FALSE - */ -#define AL_LOOPING 0x1007 - -/** - * Indicate the buffer to provide sound samples. - * Type: ALuint. - * Range: any valid Buffer id. - */ -#define AL_BUFFER 0x1009 - -/** - * Indicate the gain (volume amplification) applied. - * Type: ALfloat. - * Range: ]0.0- ] - * A value of 1.0 means un-attenuated/unchanged. - * Each division by 2 equals an attenuation of -6dB. - * Each multiplicaton with 2 equals an amplification of +6dB. - * A value of 0.0 is meaningless with respect to a logarithmic - * scale; it is interpreted as zero volume - the channel - * is effectively disabled. - */ -#define AL_GAIN 0x100A - -/** - * Indicate minimum source attenuation. - * Type: ALfloat - * Range: [0.0 - 1.0] - */ -#define AL_MIN_GAIN 0x100D - -/** - * Indicate maximum source attenuation. - * Type: ALfloat - * Range: [0.0 - 1.0] - */ -#define AL_MAX_GAIN 0x100E - -/** - * Specify the current orientation. - * Type: ALfv6 (at/up) - * Range: N/A - */ -#define AL_ORIENTATION 0x100F - -/* byte offset into source (in canon format). -1 if source - * is not playing. Don't set this, get this. - * - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - */ -#define AL_REFERENCE_DISTANCE 0x1020 - - /** - * Indicate the rolloff factor for the source. - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - */ -#define AL_ROLLOFF_FACTOR 0x1021 - -/** - * Indicate the gain (volume amplification) applied. - * Type: ALfloat. - * Range: ]0.0- ] - * A value of 1.0 means un-attenuated/unchanged. - * Each division by 2 equals an attenuation of -6dB. - * Each multiplicaton with 2 equals an amplification of +6dB. - * A value of 0.0 is meaningless with respect to a logarithmic - * scale; it is interpreted as zero volume - the channel - * is effectively disabled. - */ -#define AL_CONE_OUTER_GAIN 0x1022 - -/** - * Specify the maximum distance. - * Type: ALfloat - * Range: [0.0 - ] - */ -#define AL_MAX_DISTANCE 0x1023 - -/** - * Source state information - */ -#define AL_SOURCE_STATE 0x1010 -#define AL_INITIAL 0x1011 -#define AL_PLAYING 0x1012 -#define AL_PAUSED 0x1013 -#define AL_STOPPED 0x1014 - -/** - * Buffer Queue params - */ -#define AL_BUFFERS_QUEUED 0x1015 -#define AL_BUFFERS_PROCESSED 0x1016 - -/** Sound buffers: format specifier. */ -#define AL_FORMAT_MONO8 0x1100 -#define AL_FORMAT_MONO16 0x1101 -#define AL_FORMAT_STEREO8 0x1102 -#define AL_FORMAT_STEREO16 0x1103 - -/** - * Sound buffers: frequency, in units of Hertz [Hz]. - * This is the number of samples per second. Half of the - * sample frequency marks the maximum significant - * frequency component. - */ -#define AL_FREQUENCY 0x2001 -#define AL_BITS 0x2002 -#define AL_CHANNELS 0x2003 -#define AL_SIZE 0x2004 -#define AL_DATA 0x2005 - -/** - * Buffer state. - * - * Not supported for public use (yet). - */ -#define AL_UNUSED 0x2010 -#define AL_PENDING 0x2011 -#define AL_PROCESSED 0x2012 - -/** Errors: No Error. */ -#define AL_NO_ERROR AL_FALSE - -/** - * Illegal name passed as an argument to an AL call. - */ -#define AL_INVALID_NAME 0xA001 - -/** - * Illegal enum passed as an argument to an AL call. - */ -#define AL_INVALID_ENUM 0xA002 -/** - * Illegal value passed as an argument to an AL call. - * Applies to parameter values, but not to enumerations. - */ -#define AL_INVALID_VALUE 0xA003 - -/** - * A function was called at inappropriate time, - * or in an inappropriate way, causing an illegal state. - * This can be an incompatible ALenum, object ID, - * and/or function. - */ -#define AL_INVALID_OPERATION 0xA004 - -/** - * A function could not be completed, - * because there is not enough memory available. - */ -#define AL_OUT_OF_MEMORY 0xA005 - -/** Context strings: Vendor Name. */ -#define AL_VENDOR 0xB001 -#define AL_VERSION 0xB002 -#define AL_RENDERER 0xB003 -#define AL_EXTENSIONS 0xB004 - -/** Global tweakage. */ - -/** - * Doppler scale. Default 1.0 - */ -#define AL_DOPPLER_FACTOR 0xC000 - -/** - * Doppler velocity. Default 1.0 - */ -#define AL_DOPPLER_VELOCITY 0xC001 - -/** - * Distance model. Default AL_INVERSE_DISTANCE_CLAMPED - */ -#define AL_DISTANCE_MODEL 0xD000 - -/** Distance models. */ - -#define AL_INVERSE_DISTANCE 0xD001 -#define AL_INVERSE_DISTANCE_CLAMPED 0xD002 - - /** - * enables - */ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h b/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h deleted file mode 100644 index 0b1baea4..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#ifndef _ALUT_H_ -#define _ALUT_H_ - -#define ALUTAPI -#define ALUTAPIENTRY - -#include "al.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export on - #endif -#endif - -ALUTAPI ALvoid ALUTAPIENTRY alutInit(ALint *argc,ALbyte **argv); -ALUTAPI ALvoid ALUTAPIENTRY alutExit(ALvoid); -ALUTAPI ALvoid ALUTAPIENTRY alutLoadWAVFile(ALbyte *file,ALenum *format,ALvoid **data,ALsizei *size,ALsizei *freq); -ALUTAPI ALvoid ALUTAPIENTRY alutLoadWAVMemory(ALbyte *memory,ALenum *format,ALvoid **data,ALsizei *size,ALsizei *freq); -ALUTAPI ALvoid ALUTAPIENTRY alutUnloadWAV(ALenum format,ALvoid *data,ALsizei size,ALsizei freq); - -#ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export off - #endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/OpenAL b/neo/openal/osx/OpenAL.framework/Versions/A/OpenAL deleted file mode 100644 index b03b04f17d6aaf2492c27e9eace8a9f0b377d3f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256696 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ÐgC|Gmu}0IQ>iZ-;x(_oXNzy?QbY*x* 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

`shNz+JJ?>h(tTrfr6KkqZ}8`ofy(^_5q6 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 diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings b/neo/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings deleted file mode 100644 index fa858023ea538216b8928a45db9220c8d9e2f684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmbu5OKZYV5Jt~h=zj<9Y4lY;VFyjg>jz)u{5}jKtfH1XW&2--OIm%T<}!`%4sB$)(Gfmd?B1AfP34(|DGq z^{3vOD!bd3|5bUEttbCRcP_M3x4HQBBuSI@jbcQ|yH2fiC}S)`BxS^B;ak~+tAk}X H_p^ThA7)Pz diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist b/neo/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index a811c8bf..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - OpenAL - CFBundleGetInfoString - OpenAL - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - OpenAL - CFBundlePackageType - FMWK - CFBundleShortVersionString - OpenAL - CFBundleSignature - ???? - CFBundleVersion - 1.0.1d1 - CSResourcesFileMapped - - - diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME b/neo/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME deleted file mode 100644 index 378b7817..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME +++ /dev/null @@ -1,86 +0,0 @@ - -February 13th, 2004 - Apple Computer Inc. -updated: March 15th, 2004 - Apple Computer Inc. - ----------------------------------------------------------------------------------------------------------------------- -READ ME: OPEN AL - OSX IMPLEMENTATION USING THE 3DMIXER AUDIOUNIT ----------------------------------------------------------------------------------------------------------------------- - -This Read Me should accompany the 3DMixer implementation of OpenAL (Open Audio Library). - -CoreAUdio SDK Requirements ------------------------ -Building this implementation of OpenAL for Mac OSX requires the latest CoreAudio SDK (version 1.3.1), due to it use -of new CoreAudio Public Utility classes. - -CoreAudio Version requirements ------------------------ -There are Recommended and Minimum CoreAudio framework and component pieces for running this implementation -of OpenAL for Mac OSX: - - Recommended: - ------------ - OSX: version 10.2.6 AND - QuickTime: version 6.5.1 - AudioToolbox.framework (version 1.3.2) - AudioUnit.framework (version 1.3.2) - CoreAudio.component (version 1.3.2 - this version contains the 2.0 version of the 3DMixer AudioUnit) - - Minimum: - ------------ - OSX: version 10.2 (Jaguar) AND - QuickTime: version 6.4 - AudioToolbox.framework (version 1.2xxxxx) - AudioUnit.framework (version 1.2xxxxx) - CoreAudio.component (version 1.2xxxxxx - this version contains the 1.3 version of the 3DMixer AudioUnit) - ----------------------------------------------------------------------------------------------------------------------- -OpenAL Extensions: ----------------------------------------------------------------------------------------------------------------------- - -This implementation has the following OpenAL extensions. These constants can be found in the included "alctypes.h" header. - -***** ALC_CONVERT_DATA_UPON_LOADING -This extension allows the caller to tell OpenAL to preconvert to the native CoreAudio format, the audio data passed to the -library with the alBufferData() call. Preconverting the audio data, reduces CPU usage by removing an audio data conversion -(per source) at render timem at the expense of a larger memory footprint. - -This feature is toggled on/off by using the alDisable() & alEnable() APIs. This setting will be applied to all subsequent -calls to alBufferData(). - -***** ALC_SPATIAL_RENDERING_QUALITY -This extension allows the application to specify the quality of spatial rendering to better suit the resources of the CPU. -At this time, the quality settings are only applied when rendering to stereo hw. All multichannel rendering uses the same -spatilaization setting on the 3DMixer. Use the alSetInteger() & alGetInteger() APIs to specify and retrieve this setting. -This implmentation provides 2 setting constants: ALC_SPATIAL_RENDERING_QUALITY_HIGH (HRTF) - ALC_SPATIAL_RENDERING_QUALITY_LOW (EqualPowerPanning) - -note: This implementation applies the setting to all the OAL Sources of an OAL Context. However, spatial settings can be applied to -each input bus of the 3DMixer, so it is possible to have this setting on a per OAL Source basis, allowing the developer to give -quality priorities to the various sounds used in an application. - -note: Currently, all stereo sounds are 'passed thru' with no spatial rendering applied. This has the best output quality for rendering -what are typically background sound tracks. However, the 3DMixer has the ability to render a stereo source to a spatial coordinate -if this was desired and support to do so would be trivial. - -***** ALC_MIXER_OUTPUT_RATE -This extension allows the developer to let the AudioGraph be efficient about sample rate conversion. If for example, all sounds -being played have a sample rate of 44k, but the output hardware is set to 48k, then it is best for the 3DMixer to leave the -the audio data (Mixer Outputut Rate) at 44k, letting the output AU rate convert the streams after they have been mixed. By default, -this is set to 44k which is very common sample rate for sound hw. - -***** ALC_MIXER_MAXIMUM_BUSSES -This extension allows the developer to optimize the 3DMixer by setting it available input bus count. This allows the 3DMixer to be as -efficient as possible in resource allocations. By default, the 3DMixer currently defaults to 64 busses (note: the 1.3 version of the -3DMixer does not respect this setting, so always confirm the bus count with a get call, after setting the bus count and creating a new device). -Use: set the bus count before making a call to alOpenDevice(). This will cause the library to set the mixer to you desired bus count. -as it creates the AUGraph. Use the alSetInteger() & alGetInteger() APIs to specify and retrieve this setting. - -***** ALC_RENDER_CHANNEL_COUNT -Because the audio system has no way to know if a user has actually connected a speaker to an output of the audio hardware, it may be desired -to allow the user to clamp all rendering to stereo. Use the alSetInteger() & alGetInteger() APIs to specify and retrieve this setting. -This implmentation provides 2 setting constants: ALC_RENDER_CHANNEL_COUNT_STEREO (clamp the 3DMixer output rendering to stereo, regardless of the hw capabilities) - ALC_RENDER_CHANNEL_COUNT_MULTICHANNEL (try and render to the maximum speakers possible by interrogating the device) - ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist b/neo/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist deleted file mode 100644 index 151e2d61..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PBXProjectSourcePath - /Users/mmarks/Development/OpenAL/openal/macosx/al_osx.xcode - - diff --git a/neo/openal/osx/OpenAL.framework/Versions/Current b/neo/openal/osx/OpenAL.framework/Versions/Current deleted file mode 100644 index 8c7e5a66..00000000 --- a/neo/openal/osx/OpenAL.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/neo/sound/efxlib.h b/neo/sound/efxlib.h index 97de084c..a6331a84 100644 --- a/neo/sound/efxlib.h +++ b/neo/sound/efxlib.h @@ -5,7 +5,7 @@ #define __EFXLIBH #if ID_OPENAL_EAX -#include "../openal/include/eax4.h" +#include #endif diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index a2a45543..f6a85736 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -31,8 +31,8 @@ If you have questions concerning this license or the applicable additional terms // you need the OpenAL headers for build, even if AL is not enabled - http://www.openal.org/ #ifdef _WIN32 -#include "../openal/include/al.h" -#include "../openal/include/alc.h" +#include +#include #include "../sys/win32/idal.h" // broken OpenAL SDK ? #define ID_ALCHAR (ALubyte *) diff --git a/neo/sys/win32/eax.h b/neo/sys/win32/eax.h deleted file mode 100644 index d857cc01..00000000 --- a/neo/sys/win32/eax.h +++ /dev/null @@ -1,533 +0,0 @@ -/****************************************************************** -* -* EAX.H - Environmental Audio Extensions version 3.0 -* for OpenAL and DirectSound3D -* Updated May 22, 2001 by Jean-Marc Jot, Sam Dicker (version 1.0). -* -******************************************************************* -*/ - -#ifndef EAX_H_INCLUDED -#define EAX_H_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#ifndef OPENAL - #include - - /* - * EAX Wrapper Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5} - */ - DEFINE_GUID(CLSID_EAXDirectSound, - 0x4ff53b81, - 0x1ce0, - 0x11d3, - 0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5); - - /* - * EAX Wrapper Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C} - */ - DEFINE_GUID(CLSID_EAXDirectSound8, - 0xca503b60, - 0xb176, - 0x11d4, - 0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc); - - - -#ifdef DIRECTSOUND_VERSION -#if DIRECTSOUND_VERSION == 0x0800 - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate8(GUID*, LPDIRECTSOUND8*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE8)(GUID*, LPDIRECTSOUND*, IUnknown FAR*); -#endif -#endif - - __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate(GUID*, LPDIRECTSOUND*, IUnknown FAR *); - typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE)(GUID*, LPDIRECTSOUND*, IUnknown FAR*); - -#else // OPENAL - #include "..\Sdk\OpenAL\Include\al.h" - - #ifndef GUID_DEFINED - #define GUID_DEFINED - typedef struct _GUID - { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; - } GUID; - #endif // !GUID_DEFINED - - #ifndef DEFINE_GUID - #ifndef INITGUID - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID FAR name - #else - #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - #endif // INITGUID - #endif // DEFINE_GUID - - - /* - * EAX OpenAL Extension - */ - typedef ALenum (*EAXSet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); - typedef ALenum (*EAXGet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint); -#endif - -#pragma pack(push, 4) - -/* - * EAX 3.0 listener property set {A8FA6880-B476-11d3-BDB9-00C0F02DDF87} - */ -DEFINE_GUID(DSPROPSETID_EAX30_ListenerProperties, - 0xa8fa6882, - 0xb476, - 0x11d3, - 0xbd, 0xb9, 0x00, 0xc0, 0xf0, 0x2d, 0xdf, 0x87); - -// For compatibility with future EAX versions: -#define DSPROPSETID_EAX_ListenerProperties DSPROPSETID_EAX30_ListenerProperties - -typedef enum -{ - DSPROPERTY_EAXLISTENER_NONE, - DSPROPERTY_EAXLISTENER_ALLPARAMETERS, - DSPROPERTY_EAXLISTENER_ENVIRONMENT, - DSPROPERTY_EAXLISTENER_ENVIRONMENTSIZE, - DSPROPERTY_EAXLISTENER_ENVIRONMENTDIFFUSION, - DSPROPERTY_EAXLISTENER_ROOM, - DSPROPERTY_EAXLISTENER_ROOMHF, - DSPROPERTY_EAXLISTENER_ROOMLF, - DSPROPERTY_EAXLISTENER_DECAYTIME, - DSPROPERTY_EAXLISTENER_DECAYHFRATIO, - DSPROPERTY_EAXLISTENER_DECAYLFRATIO, - DSPROPERTY_EAXLISTENER_REFLECTIONS, - DSPROPERTY_EAXLISTENER_REFLECTIONSDELAY, - DSPROPERTY_EAXLISTENER_REFLECTIONSPAN, - DSPROPERTY_EAXLISTENER_REVERB, - DSPROPERTY_EAXLISTENER_REVERBDELAY, - DSPROPERTY_EAXLISTENER_REVERBPAN, - DSPROPERTY_EAXLISTENER_ECHOTIME, - DSPROPERTY_EAXLISTENER_ECHODEPTH, - DSPROPERTY_EAXLISTENER_MODULATIONTIME, - DSPROPERTY_EAXLISTENER_MODULATIONDEPTH, - DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF, - DSPROPERTY_EAXLISTENER_HFREFERENCE, - DSPROPERTY_EAXLISTENER_LFREFERENCE, - DSPROPERTY_EAXLISTENER_ROOMROLLOFFFACTOR, - DSPROPERTY_EAXLISTENER_FLAGS -} DSPROPERTY_EAX_LISTENERPROPERTY; - -// OR these flags with property id -#define DSPROPERTY_EAXLISTENER_IMMEDIATE 0x00000000 // changes take effect immediately -#define DSPROPERTY_EAXLISTENER_DEFERRED 0x80000000 // changes take effect later -#define DSPROPERTY_EAXLISTENER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXLISTENER_NONE | \ - DSPROPERTY_EAXLISTENER_IMMEDIATE) - -typedef struct _EAXVECTOR { - float x; - float y; - float z; -} EAXVECTOR; - -// Use this structure for DSPROPERTY_EAXLISTENER_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all times and delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myListener.lRoom = -1000; -// myListener.lRoomHF = -100; -// ... -// myListener.dwFlags = myFlags /* see EAXLISTENERFLAGS below */ ; -// instead of: -// myListener = { -1000, -100, ... , 0x00000009 }; -// If you want to save and load presets in binary form, you -// should define your own structure to insure future compatibility. -// -typedef struct _EAXLISTENERPROPERTIES -{ - unsigned long ulEnvironment; // sets all listener properties - float flEnvironmentSize; // environment size in meters - float flEnvironmentDiffusion; // environment diffusion - long lRoom; // room effect level (at mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lRoomLF; // relative room effect level at low frequencies - float flDecayTime; // reverberation decay time at mid frequencies - float flDecayHFRatio; // high-frequency to mid-frequency decay time ratio - float flDecayLFRatio; // low-frequency to mid-frequency decay time ratio - long lReflections; // early reflections level relative to room effect - float flReflectionsDelay; // initial reflection delay time - EAXVECTOR vReflectionsPan; // early reflections panning vector - long lReverb; // late reverberation level relative to room effect - float flReverbDelay; // late reverberation delay time relative to initial reflection - EAXVECTOR vReverbPan; // late reverberation panning vector - float flEchoTime; // echo time - float flEchoDepth; // echo depth - float flModulationTime; // modulation time - float flModulationDepth; // modulation depth - float flAirAbsorptionHF; // change in level per meter at high frequencies - float flHFReference; // reference high frequency - float flLFReference; // reference low frequency - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - unsigned long ulFlags; // modifies the behavior of properties -} EAXLISTENERPROPERTIES, *LPEAXLISTENERPROPERTIES; - -// used by DSPROPERTY_EAXLISTENER_ENVIRONMENT -enum -{ - EAX_ENVIRONMENT_GENERIC, - EAX_ENVIRONMENT_PADDEDCELL, - EAX_ENVIRONMENT_ROOM, - EAX_ENVIRONMENT_BATHROOM, - EAX_ENVIRONMENT_LIVINGROOM, - EAX_ENVIRONMENT_STONEROOM, - EAX_ENVIRONMENT_AUDITORIUM, - EAX_ENVIRONMENT_CONCERTHALL, - EAX_ENVIRONMENT_CAVE, - EAX_ENVIRONMENT_ARENA, - EAX_ENVIRONMENT_HANGAR, - EAX_ENVIRONMENT_CARPETEDHALLWAY, - EAX_ENVIRONMENT_HALLWAY, - EAX_ENVIRONMENT_STONECORRIDOR, - EAX_ENVIRONMENT_ALLEY, - EAX_ENVIRONMENT_FOREST, - EAX_ENVIRONMENT_CITY, - EAX_ENVIRONMENT_MOUNTAINS, - EAX_ENVIRONMENT_QUARRY, - EAX_ENVIRONMENT_PLAIN, - EAX_ENVIRONMENT_PARKINGLOT, - EAX_ENVIRONMENT_SEWERPIPE, - EAX_ENVIRONMENT_UNDERWATER, - EAX_ENVIRONMENT_DRUGGED, - EAX_ENVIRONMENT_DIZZY, - EAX_ENVIRONMENT_PSYCHOTIC, - - EAX_ENVIRONMENT_UNDEFINED, - - EAX_ENVIRONMENT_COUNT -}; - -// Used by DSPROPERTY_EAXLISTENER_FLAGS -// -// Note: The number and order of flags may change in future EAX versions. -// It is recommended to use the flag defines as follows: -// myFlags = EAXLISTENERFLAGS_DECAYTIMESCALE | EAXLISTENERFLAGS_REVERBSCALE; -// instead of: -// myFlags = 0x00000009; -// -// These flags determine what properties are affected by environment size. -#define EAXLISTENERFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time -#define EAXLISTENERFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level -#define EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time -#define EAXLISTENERFLAGS_REVERBSCALE 0x00000008 // reflections level -#define EAXLISTENERFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time -#define EAXLISTENERFLAGS_ECHOTIMESCALE 0x00000040 // echo time -#define EAXLISTENERFLAGS_MODULATIONTIMESCALE 0x00000080 // modulation time - -// This flag limits high-frequency decay time according to air absorption. -#define EAXLISTENERFLAGS_DECAYHFLIMIT 0x00000020 - -#define EAXLISTENERFLAGS_RESERVED 0xFFFFFF00 // reserved future use - -// Property ranges and defaults: - -#define EAXLISTENER_MINENVIRONMENT 0 -#define EAXLISTENER_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1) -#define EAXLISTENER_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC - -#define EAXLISTENER_MINENVIRONMENTSIZE 1.0f -#define EAXLISTENER_MAXENVIRONMENTSIZE 100.0f -#define EAXLISTENER_DEFAULTENVIRONMENTSIZE 7.5f - -#define EAXLISTENER_MINENVIRONMENTDIFFUSION 0.0f -#define EAXLISTENER_MAXENVIRONMENTDIFFUSION 1.0f -#define EAXLISTENER_DEFAULTENVIRONMENTDIFFUSION 1.0f - -#define EAXLISTENER_MINROOM (-10000) -#define EAXLISTENER_MAXROOM 0 -#define EAXLISTENER_DEFAULTROOM (-1000) - -#define EAXLISTENER_MINROOMHF (-10000) -#define EAXLISTENER_MAXROOMHF 0 -#define EAXLISTENER_DEFAULTROOMHF (-100) - -#define EAXLISTENER_MINROOMLF (-10000) -#define EAXLISTENER_MAXROOMLF 0 -#define EAXLISTENER_DEFAULTROOMLF 0 - -#define EAXLISTENER_MINDECAYTIME 0.1f -#define EAXLISTENER_MAXDECAYTIME 20.0f -#define EAXLISTENER_DEFAULTDECAYTIME 1.49f - -#define EAXLISTENER_MINDECAYHFRATIO 0.1f -#define EAXLISTENER_MAXDECAYHFRATIO 2.0f -#define EAXLISTENER_DEFAULTDECAYHFRATIO 0.83f - -#define EAXLISTENER_MINDECAYLFRATIO 0.1f -#define EAXLISTENER_MAXDECAYLFRATIO 2.0f -#define EAXLISTENER_DEFAULTDECAYLFRATIO 1.00f - -#define EAXLISTENER_MINREFLECTIONS (-10000) -#define EAXLISTENER_MAXREFLECTIONS 1000 -#define EAXLISTENER_DEFAULTREFLECTIONS (-2602) - -#define EAXLISTENER_MINREFLECTIONSDELAY 0.0f -#define EAXLISTENER_MAXREFLECTIONSDELAY 0.3f -#define EAXLISTENER_DEFAULTREFLECTIONSDELAY 0.007f - -#define EAXLISTENER_MINREVERB (-10000) -#define EAXLISTENER_MAXREVERB 2000 -#define EAXLISTENER_DEFAULTREVERB 200 - -#define EAXLISTENER_MINREVERBDELAY 0.0f -#define EAXLISTENER_MAXREVERBDELAY 0.1f -#define EAXLISTENER_DEFAULTREVERBDELAY 0.011f - -#define EAXLISTENER_MINECHOTIME 0.075f -#define EAXLISTENER_MAXECHOTIME 0.25f -#define EAXLISTENER_DEFAULTECHOTIME 0.25f - -#define EAXLISTENER_MINECHODEPTH 0.0f -#define EAXLISTENER_MAXECHODEPTH 1.0f -#define EAXLISTENER_DEFAULTECHODEPTH 0.0f - -#define EAXLISTENER_MINMODULATIONTIME 0.04f -#define EAXLISTENER_MAXMODULATIONTIME 4.0f -#define EAXLISTENER_DEFAULTMODULATIONTIME 0.25f - -#define EAXLISTENER_MINMODULATIONDEPTH 0.0f -#define EAXLISTENER_MAXMODULATIONDEPTH 1.0f -#define EAXLISTENER_DEFAULTMODULATIONDEPTH 0.0f - -#define EAXLISTENER_MINAIRABSORPTIONHF (-100.0f) -#define EAXLISTENER_MAXAIRABSORPTIONHF 0.0f -#define EAXLISTENER_DEFAULTAIRABSORPTIONHF (-5.0f) - -#define EAXLISTENER_MINHFREFERENCE 1000.0f -#define EAXLISTENER_MAXHFREFERENCE 20000.0f -#define EAXLISTENER_DEFAULTHFREFERENCE 5000.0f - -#define EAXLISTENER_MINLFREFERENCE 20.0f -#define EAXLISTENER_MAXLFREFERENCE 1000.0f -#define EAXLISTENER_DEFAULTLFREFERENCE 250.0f - -#define EAXLISTENER_MINROOMROLLOFFFACTOR 0.0f -#define EAXLISTENER_MAXROOMROLLOFFFACTOR 10.0f -#define EAXLISTENER_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXLISTENER_DEFAULTFLAGS (EAXLISTENERFLAGS_DECAYTIMESCALE | \ - EAXLISTENERFLAGS_REFLECTIONSSCALE | \ - EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE | \ - EAXLISTENERFLAGS_REVERBSCALE | \ - EAXLISTENERFLAGS_REVERBDELAYSCALE | \ - EAXLISTENERFLAGS_DECAYHFLIMIT) - - - -/* -* EAX 3.0 buffer property set {A8FA6881-B476-11d3-BDB9-00C0F02DDF87} -*/ -DEFINE_GUID(DSPROPSETID_EAX30_BufferProperties, - 0xa8fa6881, - 0xb476, - 0x11d3, - 0xbd, 0xb9, 0x0, 0xc0, 0xf0, 0x2d, 0xdf, 0x87); - -// For compatibility with future EAX versions: -#define DSPROPSETID_EAX_BufferProperties DSPROPSETID_EAX30_BufferProperties -#define DSPROPSETID_EAX_SourceProperties DSPROPSETID_EAX30_BufferProperties - -typedef enum -{ - DSPROPERTY_EAXBUFFER_NONE, - DSPROPERTY_EAXBUFFER_ALLPARAMETERS, - DSPROPERTY_EAXBUFFER_OBSTRUCTIONPARAMETERS, - DSPROPERTY_EAXBUFFER_OCCLUSIONPARAMETERS, - DSPROPERTY_EAXBUFFER_EXCLUSIONPARAMETERS, - DSPROPERTY_EAXBUFFER_DIRECT, - DSPROPERTY_EAXBUFFER_DIRECTHF, - DSPROPERTY_EAXBUFFER_ROOM, - DSPROPERTY_EAXBUFFER_ROOMHF, - DSPROPERTY_EAXBUFFER_OBSTRUCTION, - DSPROPERTY_EAXBUFFER_OBSTRUCTIONLFRATIO, - DSPROPERTY_EAXBUFFER_OCCLUSION, - DSPROPERTY_EAXBUFFER_OCCLUSIONLFRATIO, - DSPROPERTY_EAXBUFFER_OCCLUSIONROOMRATIO, - DSPROPERTY_EAXBUFFER_OCCLUSIONDIRECTRATIO, - DSPROPERTY_EAXBUFFER_EXCLUSION, - DSPROPERTY_EAXBUFFER_EXCLUSIONLFRATIO, - DSPROPERTY_EAXBUFFER_OUTSIDEVOLUMEHF, - DSPROPERTY_EAXBUFFER_DOPPLERFACTOR, - DSPROPERTY_EAXBUFFER_ROLLOFFFACTOR, - DSPROPERTY_EAXBUFFER_ROOMROLLOFFFACTOR, - DSPROPERTY_EAXBUFFER_AIRABSORPTIONFACTOR, - DSPROPERTY_EAXBUFFER_FLAGS -} DSPROPERTY_EAX_BUFFERPROPERTY; - -// OR these flags with property id -#define DSPROPERTY_EAXBUFFER_IMMEDIATE 0x00000000 // changes take effect immediately -#define DSPROPERTY_EAXBUFFER_DEFERRED 0x80000000 // changes take effect later -#define DSPROPERTY_EAXBUFFER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXBUFFER_NONE | \ - DSPROPERTY_EAXBUFFER_IMMEDIATE) - -// Use this structure for DSPROPERTY_EAXBUFFER_ALLPARAMETERS -// - all levels are hundredths of decibels -// - all delays are in seconds -// -// NOTE: This structure may change in future EAX versions. -// It is recommended to initialize fields by name: -// myBuffer.lDirect = 0; -// myBuffer.lDirectHF = -200; -// ... -// myBuffer.dwFlags = myFlags /* see EAXBUFFERFLAGS below */ ; -// instead of: -// myBuffer = { 0, -200, ... , 0x00000003 }; -// -typedef struct _EAXBUFFERPROPERTIES -{ - long lDirect; // direct path level (at low and mid frequencies) - long lDirectHF; // relative direct path level at high frequencies - long lRoom; // room effect level (at low and mid frequencies) - long lRoomHF; // relative room effect level at high frequencies - long lObstruction; // main obstruction control (attenuation at high frequencies) - float flObstructionLFRatio; // obstruction low-frequency level re. main control - long lOcclusion; // main occlusion control (attenuation at high frequencies) - float flOcclusionLFRatio; // occlusion low-frequency level re. main control - float flOcclusionRoomRatio; // relative occlusion control for room effect - float flOcclusionDirectRatio; // relative occlusion control for direct path - long lExclusion; // main exlusion control (attenuation at high frequencies) - float flExclusionLFRatio; // exclusion low-frequency level re. main control - long lOutsideVolumeHF; // outside sound cone level at high frequencies - float flDopplerFactor; // like DS3D flDopplerFactor but per source - float flRolloffFactor; // like DS3D flRolloffFactor but per source - float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - float flAirAbsorptionFactor; // multiplies DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF - unsigned long ulFlags; // modifies the behavior of properties -} EAXBUFFERPROPERTIES, *LPEAXBUFFERPROPERTIES; - -// Use this structure for DSPROPERTY_EAXBUFFER_OBSTRUCTION, -typedef struct _EAXOBSTRUCTIONPROPERTIES -{ - long lObstruction; - float flObstructionLFRatio; -} EAXOBSTRUCTIONPROPERTIES, *LPEAXOBSTRUCTIONPROPERTIES; - -// Use this structure for DSPROPERTY_EAXBUFFER_OCCLUSION -typedef struct _EAXOCCLUSIONPROPERTIES -{ - long lOcclusion; - float flOcclusionLFRatio; - float flOcclusionRoomRatio; - float flOcclusionDirectRatio; -} EAXOCCLUSIONPROPERTIES, *LPEAXOCCLUSIONPROPERTIES; - -// Use this structure for DSPROPERTY_EAXBUFFER_EXCLUSION -typedef struct _EAXEXCLUSIONPROPERTIES -{ - long lExclusion; - float flExclusionLFRatio; -} EAXEXCLUSIONPROPERTIES, *LPEAXEXCLUSIONPROPERTIES; - -// Used by DSPROPERTY_EAXBUFFER_FLAGS -// TRUE: value is computed automatically - property is an offset -// FALSE: value is used directly -// -// Note: The number and order of flags may change in future EAX versions. -// To insure future compatibility, use flag defines as follows: -// myFlags = EAXBUFFERFLAGS_DIRECTHFAUTO | EAXBUFFERFLAGS_ROOMAUTO; -// instead of: -// myFlags = 0x00000003; -// -#define EAXBUFFERFLAGS_DIRECTHFAUTO 0x00000001 // affects DSPROPERTY_EAXBUFFER_DIRECTHF -#define EAXBUFFERFLAGS_ROOMAUTO 0x00000002 // affects DSPROPERTY_EAXBUFFER_ROOM -#define EAXBUFFERFLAGS_ROOMHFAUTO 0x00000004 // affects DSPROPERTY_EAXBUFFER_ROOMHF - -#define EAXBUFFERFLAGS_RESERVED 0xFFFFFFF8 // reserved future use - -// Property ranges and defaults: - -#define EAXBUFFER_MINDIRECT (-10000) -#define EAXBUFFER_MAXDIRECT 1000 -#define EAXBUFFER_DEFAULTDIRECT 0 - -#define EAXBUFFER_MINDIRECTHF (-10000) -#define EAXBUFFER_MAXDIRECTHF 0 -#define EAXBUFFER_DEFAULTDIRECTHF 0 - -#define EAXBUFFER_MINROOM (-10000) -#define EAXBUFFER_MAXROOM 1000 -#define EAXBUFFER_DEFAULTROOM 0 - -#define EAXBUFFER_MINROOMHF (-10000) -#define EAXBUFFER_MAXROOMHF 0 -#define EAXBUFFER_DEFAULTROOMHF 0 - -#define EAXBUFFER_MINOBSTRUCTION (-10000) -#define EAXBUFFER_MAXOBSTRUCTION 0 -#define EAXBUFFER_DEFAULTOBSTRUCTION 0 - -#define EAXBUFFER_MINOBSTRUCTIONLFRATIO 0.0f -#define EAXBUFFER_MAXOBSTRUCTIONLFRATIO 1.0f -#define EAXBUFFER_DEFAULTOBSTRUCTIONLFRATIO 0.0f - -#define EAXBUFFER_MINOCCLUSION (-10000) -#define EAXBUFFER_MAXOCCLUSION 0 -#define EAXBUFFER_DEFAULTOCCLUSION 0 - -#define EAXBUFFER_MINOCCLUSIONLFRATIO 0.0f -#define EAXBUFFER_MAXOCCLUSIONLFRATIO 1.0f -#define EAXBUFFER_DEFAULTOCCLUSIONLFRATIO 0.25f - -#define EAXBUFFER_MINOCCLUSIONROOMRATIO 0.0f -#define EAXBUFFER_MAXOCCLUSIONROOMRATIO 10.0f -#define EAXBUFFER_DEFAULTOCCLUSIONROOMRATIO 1.5f - -#define EAXBUFFER_MINOCCLUSIONDIRECTRATIO 0.0f -#define EAXBUFFER_MAXOCCLUSIONDIRECTRATIO 10.0f -#define EAXBUFFER_DEFAULTOCCLUSIONDIRECTRATIO 1.0f - -#define EAXBUFFER_MINEXCLUSION (-10000) -#define EAXBUFFER_MAXEXCLUSION 0 -#define EAXBUFFER_DEFAULTEXCLUSION 0 - -#define EAXBUFFER_MINEXCLUSIONLFRATIO 0.0f -#define EAXBUFFER_MAXEXCLUSIONLFRATIO 1.0f -#define EAXBUFFER_DEFAULTEXCLUSIONLFRATIO 1.0f - -#define EAXBUFFER_MINOUTSIDEVOLUMEHF (-10000) -#define EAXBUFFER_MAXOUTSIDEVOLUMEHF 0 -#define EAXBUFFER_DEFAULTOUTSIDEVOLUMEHF 0 - -#define EAXBUFFER_MINDOPPLERFACTOR 0.0f -#define EAXBUFFER_MAXDOPPLERFACTOR 10.f -#define EAXBUFFER_DEFAULTDOPPLERFACTOR 0.0f - -#define EAXBUFFER_MINROLLOFFFACTOR 0.0f -#define EAXBUFFER_MAXROLLOFFFACTOR 10.f -#define EAXBUFFER_DEFAULTROLLOFFFACTOR 0.0f - -#define EAXBUFFER_MINROOMROLLOFFFACTOR 0.0f -#define EAXBUFFER_MAXROOMROLLOFFFACTOR 10.f -#define EAXBUFFER_DEFAULTROOMROLLOFFFACTOR 0.0f - -#define EAXBUFFER_MINAIRABSORPTIONFACTOR 0.0f -#define EAXBUFFER_MAXAIRABSORPTIONFACTOR 10.0f -#define EAXBUFFER_DEFAULTAIRABSORPTIONFACTOR 1.0f - -#define EAXBUFFER_DEFAULTFLAGS (EAXBUFFERFLAGS_DIRECTHFAUTO | \ - EAXBUFFERFLAGS_ROOMAUTO | \ - EAXBUFFERFLAGS_ROOMHFAUTO ) - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif diff --git a/neo/sys/win32/eaxguid.lib b/neo/sys/win32/eaxguid.lib deleted file mode 100644 index 5247dd7ed1e3309add0a13ac4a4df85cfee68145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 zcmY$iNi0gvu;bEKKn0eTh9<^FmWD>C!U_gZzOjipl$F56z`y{+%yq=zcxRtrPnURC z#|R^Xc;Cdl#Prl6285tXW>IQ#NpOB?UJ66JOK?Dte?YKn2wa0xXFMRT&$^6Eq2^h6t0KLfzb4gW`iy%TkMy@VE<$3QxGN;K2YBGKGf> z>G5K03Xc~?V8qlhgCmE55eq~F`)FKXBuQ*>ftE=KagZ3f*ryjdHv=_ z>#zO~WG)M?+QG2kWTfX+y|m06Sg`#2&%lt*+X5;wztpe|;V5C-KhW=2pLgMf4GHhTyQIdqwTLd=W{AQB8cf-8HWOd!Pq z#1nuRqy~f;7^Hx>0f-SIxKC?bb}JOvby zmq4BXiijY{i*ONRAP-SypcK`Zxg{PZgsqrIE^p9EdFqwTKuZXg@<25-E#