mirror of
https://github.com/dhewm/dhewm3.git
synced 2025-03-24 03:22:10 +00:00
Use system OpenAL
This commit is contained in:
parent
690967c276
commit
db65f7a61d
59 changed files with 3 additions and 15418 deletions
|
@ -1,378 +0,0 @@
|
|||
2001-02-06 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* chp-rendering.sgml: added annotation about CONE calculation.
|
||||
* chp-state.sgml: added more annotation on log vs. linear GAIN.
|
||||
|
||||
2001-01-09 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* chp-state.sgml: ungrep of scratched DISTANCE_SCALE.
|
||||
|
||||
2001-01-08 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* chp-operation.sgml: INVALID_ENUM for getters and enable,
|
||||
not INVALID_OPERATION. Later: Delete{Object}s accepts zero.
|
||||
|
||||
2000-12-04 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* Makefile: added HTML ZIP targets ("update" for website).
|
||||
|
||||
2000-11-10 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* Makefile (full): full rendering target added.
|
||||
* ent-marks-full.sgml: created.
|
||||
|
||||
2000-10-27 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* Makefile: rendering targets for cronjob driven update.
|
||||
|
||||
2000-10-26 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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 <literallayout> and <programlisting>,
|
||||
I also had to recover accidentally deleted files.
|
||||
|
||||
2000-10-24 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* ent-examples.sgml: experimenting with external sample.c
|
||||
files as CDATA entities, to no avail.
|
||||
* oalspecs.sgml: example entities.
|
||||
|
||||
2000-10-16 Bernd Kreimeier <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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 <bk@lokigames.com>
|
||||
|
||||
* 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.
|
|
@ -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
|
||||
|
||||
|
|
@ -1,846 +0,0 @@
|
|||
|
||||
|
||||
<chapter id="alc">
|
||||
<title>AL Contexts and the ALC API</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
ALC defines the following objects: Contexts.
|
||||
</para>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (ALC entry points)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (ALC OS independend)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001024-02"><title>RFC/ Issues </title><para>
|
||||
Hardware init/deinit, mapping many processes with
|
||||
multiple contexts to many devices, sharing resources
|
||||
among processes.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Managing Devices</title>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Network transparency)</title><para>
|
||||
&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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Device Enumeration)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (X11 Audio)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<sect2>
|
||||
<title>Connecting to a Device</title>
|
||||
<para>
|
||||
The alcOpenDevice function allows the application (i.e. the
|
||||
client program) to connect to a device (i.e. the server).
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &device; * <function>alcOpenDevice</function></funcdef>
|
||||
<paramdef> const &ubyte;* <parameter>deviceSpecifier</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Operating system dependencies)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Disconnecting from a Device</title>
|
||||
<para>
|
||||
The alcCloseDevice function allows the application (i.e. the
|
||||
client program) to disconnect from a device (i.e. the server).
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function>alcCloseDevice</function></funcdef>
|
||||
<paramdef> &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
If deviceHandle is NULL or invalid, an ALC_INVALID_DEVICE error
|
||||
will be generated. Once closed, a deviceHandle is invalid.
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Managing Rendering Contexts</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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").
|
||||
</para>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Context Attributes</title>
|
||||
<para>
|
||||
The application can choose to specify certain attributes for
|
||||
a context. Attributes not specified explicitely are set to
|
||||
implementation dependend defaults.
|
||||
</para>
|
||||
<para>
|
||||
<table>
|
||||
<title>Context Attributes</title>
|
||||
<tgroup cols="2" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</>
|
||||
<entry>Description</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ALC_FREQUENCY</>
|
||||
<entry>Frequency for mixing output buffer, in units of Hz.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_REFRESH</>
|
||||
<entry>Refresh intervalls, in units of Hz.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_SYNC</>
|
||||
<entry>Flag, indicating a synchronous context.</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Refresh Control)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001026-05"><title>RFC / Mixing Buffer Configuration </title><para>
|
||||
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).
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001026-01"><title>RFC / LOKI extensions </title><para>
|
||||
<programlisting>
|
||||
|
||||
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 */
|
||||
|
||||
</programlisting>
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Creating a Context</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &context; * <function> alcCreateContext </function></funcdef>
|
||||
<paramdef> const &device; * <parameter> deviceHandle </parameter></paramdef>
|
||||
<paramdef> ∫ * <parameter> attrList </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Selecting a Context for Operation</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &bool; <function> alcMakeContextCurrent </function></funcdef>
|
||||
<paramdef> &context; * <parameter> context </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No Explicit Device)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No Multiple Current)</title><para>
|
||||
There is only one current context per process, even
|
||||
in multithreaded applications, even if multiple
|
||||
devices are used.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Current NULL)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Shared Objects)</title><para>
|
||||
Buffers are shared among contexts. As mutiple contexts
|
||||
can exist at the same time, the state of shared objects
|
||||
is also shared among contexts.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001026-06"><title>RFC / Buffer Deletion </title><para>
|
||||
Buffers that have not yet been processed in another context
|
||||
can not be deleted from any other context.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Initiate Context Processing</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function>alcProcessContext</function></funcdef>
|
||||
<paramdef> &context; * <parameter> context </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Sync and async implementations)</title><para>
|
||||
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.
|
||||
</para><para>
|
||||
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.
|
||||
</para><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Multiple Contexts and SYNC refresh)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001024-03"><title>RFC/ Implications for Networking</title><para>
|
||||
What does alcProcessContext imply for networking?
|
||||
For AL, will we add alFlush/alFinish?
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Suspend Context Processing</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function>alcSuspendContext</function></funcdef>
|
||||
<paramdef> &context; * <parameter> context </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Sync and async implementations)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Suspending vs. Muting a context)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Current Context Suspended)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Release of Hardware Resources)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Destroying a Context</title>
|
||||
<para>
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> alcDestroyContext </function></funcdef>
|
||||
<paramdef> &context; * <parameter> context </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>ALC Queries</title>
|
||||
|
||||
<sect2>
|
||||
<title>Query for Current Context</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &context; * <function>alcGetCurrentContext</function></funcdef>
|
||||
<void>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Query for a Context's Device</title>
|
||||
<para>
|
||||
The application can query for, and obtain an handle to, the device
|
||||
of a given context.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &device; * <function>alcGetContextsDevice</function></funcdef>
|
||||
<paramdef> &context; * <parameter> context </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Query For Extensions</title>
|
||||
<para>
|
||||
To verify that a given extension is available for the current
|
||||
context and the device it is associated with, use
|
||||
<funcsynopsis>
|
||||
<funcprototype>
|
||||
<funcdef>&bool;<function>IsExtensionPresent</function></funcdef>
|
||||
<paramdef> const &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
<paramdef>const &ubyte; * <parameter> extName </parameter></paramdef>
|
||||
</funcprototype>
|
||||
</funcsynopsis>
|
||||
A NULL name argument returns FALSE, as do invalid and unsupported string
|
||||
tokens. A NULL deviceHandle will result in an INVALID_DEVICE error.
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Exlicit Device Parameter)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Query for Function Entry Addresses</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; * <function> alcGetProcAddress</function></funcdef>
|
||||
<paramdef> const &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
<paramdef> const &ubyte; * <parameter> funcName </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>Retrieving Enumeration Values</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &uint; <function> alcGetEnumValue </function></funcdef>
|
||||
<paramdef> const &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
<paramdef> const &ubyte; <parameter> enumName </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
Specifying a NULL name parameter will cause an
|
||||
ALC_INVALID_VALUE error.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Query for Error Conditions</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef>&enum;<function>alcGetError</function></funcdef>
|
||||
<paramdef> &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
Error conditions are specific to the device.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>Error Conditions</title>
|
||||
<tgroup cols="2" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</>
|
||||
<entry>Description</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ALC_NO_ERROR</>
|
||||
<entry>The device handle or specifier does name an accessible driver/server.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_INVALID_DEVICE</>
|
||||
<entry>The Context argument does not name a valid context.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_INVALID_CONTEXT</>
|
||||
<entry>The Context argument does not name a valid context.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_INVALID_ENUM</>
|
||||
<entry>A token used is not valid, or not applicable.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_INVALID_VALUE</>
|
||||
<entry>An value (e.g. attribute) is not valid, or not applicable.</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No UNDERFLOW error)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>String Query</title>
|
||||
<para>
|
||||
The application can obtain certain strings from ALC.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef>const &ubyte; * <function>alcGetString</function></funcdef>
|
||||
<paramdef> &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter> token </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
<table>
|
||||
<title>String Query Tokens</title>
|
||||
<tgroup cols="2" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</>
|
||||
<entry>Description</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ALC_DEFAULT_DEVICE_SPECIFIER</>
|
||||
<entry>The specifier string for the default device (NULL handle is legal).</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_DEVICE_SPECIFIER</>
|
||||
<entry>The specifier string for the device (NULL handle is not legal).</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_EXTENSIONS</>
|
||||
<entry>The extensions string for diagnostics and printing.</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Integer Query</title>
|
||||
<para>
|
||||
The application can query ALC for information using an integer
|
||||
query function.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function>alcGetIntegerv</function></funcdef>
|
||||
<paramdef> &device; * <parameter>deviceHandle</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter> token </parameter></paramdef>
|
||||
<paramdef> &sizei; <parameter> size </parameter></paramdef>
|
||||
<paramdef> ∫ <parameter> dest </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>Integer Query Tokens</title>
|
||||
<tgroup cols="2" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</>
|
||||
<entry>Description</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ALC_MAJOR_VERSION</>
|
||||
<entry>Major version query.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_MINOR_VERSION</>
|
||||
<entry>Minor version query.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_ATTRIBUTES_SIZE</>
|
||||
<entry>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.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ALC_ALL_ATTRIBUTES</>
|
||||
<entry>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.</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Backward Compatibility)</title><para>
|
||||
Backward compatibility is guaranteed only for minor revisions.
|
||||
Breaking ABI backwards compatibility will require a issuing
|
||||
major revision.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001026-02"><title>RFC / Version Matching </title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001027-03"><title>RFC / Device Enumeration </title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Shared Objects</title>
|
||||
<para>
|
||||
For efficiency reasons, certain AL objects are shared across
|
||||
ALC contexts. At this time, AL buffers are the only shared
|
||||
objects.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk001024-01"><title>RFC/ Sharing Sources?</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
<sect2>
|
||||
<title>Shared Buffers</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
</chapter>
|
|
@ -1,15 +0,0 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
|
||||
<title>OpenAL API Reference</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>OpenAL API Reference</h1>
|
||||
<p>
|
||||
This document has been removed.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,297 +0,0 @@
|
|||
|
||||
<appendix>
|
||||
<title>Miscellaneous Annotations</title>
|
||||
|
||||
<section id="reverb-objects">
|
||||
<title>Reverberation Objects?</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
Environment properties:
|
||||
Early reflections level and delay.
|
||||
Late reverberation level and delay, low- and high-frequency decay time.
|
||||
Reverberation diffusion, density and spectrum.
|
||||
</para>
|
||||
<para>
|
||||
Source properties:
|
||||
Direct path intensity and spectrum.
|
||||
Reverberation intensity and spectrum.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="al-objects-filters">
|
||||
<title>On Filters</title>
|
||||
<para>
|
||||
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?
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
RFC/nn: Atmospheric/ambient properties?
|
||||
REF/nn: A3D 2.0 IA3dMaterial
|
||||
</para>
|
||||
|
||||
<section id="al-objects-filters-atmospheric">
|
||||
<title>Atmospheric Filter</title>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="al-objects-filters-listenerreverb">
|
||||
<title>Listener Reverb</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="al-objects-filters-sourcereverb">
|
||||
<title>Source Reverb</title>
|
||||
<para>
|
||||
There is currently no support for reverb at the source position.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="al-objects-filters-reflection">
|
||||
<title>Reflection Filter</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="al-objects-filters-transmission">
|
||||
<title>Transmission Filter</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Parameterization over Time</title>
|
||||
<para>
|
||||
Fading and cross-fading. There are three ways to handle any kind
|
||||
of gain control as a function of time:
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
manipulate gain per frame/sufficiently often
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
parameterize, i.e. specify a target gain,
|
||||
a duration over which to interpolate, and an interpolation function
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
provide an buffer that indicates amplitude, stretched over
|
||||
a duration/by a frequency
|
||||
</para>
|
||||
</listitem>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>On Geometry</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
Second and higher order reflections seem to be irrelevant.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
Transmission loss through dense media is equivalent to
|
||||
the distance attenuation model.
|
||||
</para>
|
||||
<para>
|
||||
Refraction/reflection loss at border surfaces separating
|
||||
media....
|
||||
</para>
|
||||
<para>
|
||||
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....
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>No ALU</title>
|
||||
<note id="bk000019-01"><title>RFC</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
RFC/nn: Er, what else does the world of 2D sound usually need?
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>No ALUT</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<!-- Driver DDK section
|
||||
http://www.microsoft.com/directx/
|
||||
http://www.microsoft.com/DDK/DDKdocs/win98ddk/ds-ddk_8eas.htm
|
||||
-->
|
||||
|
||||
</appendix>
|
|
@ -1,43 +0,0 @@
|
|||
|
||||
<appendix>
|
||||
<title>Global Constants</title>
|
||||
<para>
|
||||
<table>
|
||||
<title>Misc. &AL; Global Constants</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name </>
|
||||
<entry>&OAL; datatype </>
|
||||
<entry>Description </>
|
||||
<entry>Literal value </>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry> ALenum </entry>
|
||||
<entry> FALSE </entry>
|
||||
<entry> boolean false </entry>
|
||||
<entry> 0 </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALenum </entry>
|
||||
<entry> TRUE </entry>
|
||||
<entry> boolean true </entry>
|
||||
<entry> 1 </entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="bk000621-01"><title>RFC</title><para>
|
||||
NONE, ONE, ZERO needed?
|
||||
</para></note>
|
||||
]]>
|
||||
</appendix>
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
|
||||
<appendix>
|
||||
<title>Extension Process</title>
|
||||
<para>
|
||||
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:
|
||||
|
||||
<literallayout>
|
||||
|
||||
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
|
||||
|
||||
</literallayout>
|
||||
|
||||
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.
|
||||
</para>
|
||||
</appendix>
|
|
@ -1,754 +0,0 @@
|
|||
|
||||
<appendix>
|
||||
<title>Extensions</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<sect1>
|
||||
<title>Extension Query</title>
|
||||
<para>
|
||||
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.
|
||||
|
||||
<funcsynopsis>
|
||||
<funcprototype>
|
||||
<funcdef> &bool; <function>IsExtensionPresent</function></funcdef>
|
||||
<paramdef> const &ubyte; * <parameter>extName</parameter></paramdef>
|
||||
</funcprototype>
|
||||
</funcsynopsis>
|
||||
|
||||
Returns TRUE if the given extension is supported for the current
|
||||
context, FALSE otherwise.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note id="ann-bk000721-22"><title>Annotation (IsExtensionPresent)</title><para>
|
||||
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 ).
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation/ EXTENSIONS</title><para>
|
||||
GetString( EXTENSIONS ) is supported as well, as it allows for
|
||||
easy archiving and priting of the list of supported extensions.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
<title>Retrieving Function Entry Addresses</title>
|
||||
<para>
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void;* <function>GetProcAddress</function></funcdef>
|
||||
<paramdef> const &ubyte; * <parameter>funcName</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note><title>RFC/bk000504:</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Retrieving Enumeration Values</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &uint; <function> GetEnumValue </function></funcdef>
|
||||
<paramdef> const &ubyte;<parameter> enumName </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation/ enums with value zero</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
<title>Naming Conventions</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
<title>ARB Extensions</title>
|
||||
<para>
|
||||
There are no ARB Extensions defined yet, as the ARB has
|
||||
yet to be installed.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
|
||||
<![ %Ext1 [
|
||||
<sect1>
|
||||
<title>Other Extension</title>
|
||||
<para>
|
||||
For the time being this section
|
||||
will list externally proposed extensions, namely
|
||||
the extension based on the IASIG Level 2 guideline.
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<sect2>
|
||||
|
||||
<title>IA-SIG I3DL2 Extension</title>
|
||||
|
||||
<para>
|
||||
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
|
||||
<ulink
|
||||
url="http://www.iasig.org/wg/3dwg/3dwg.htm"
|
||||
type="http">IA-SIG 3D Level 2 rendering guideline</ulink>
|
||||
provides related information.
|
||||
</para>
|
||||
|
||||
<![ %Scratch [
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000626-07"><title>RFC: Global Attributes</title><para>
|
||||
Do we need global setters for these:
|
||||
DIRECT_IASIG/DIRECT_HIGH_FREQUENCY_IASIG?
|
||||
ROOM_IASIG/ROOM_HIGH_FREQUENCY_IASIG?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<sect3>
|
||||
<title>Listener Environment Attributes</title>
|
||||
<para>
|
||||
|
||||
|
||||
|
||||
<table>
|
||||
<title>ENV_ROOM Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_ROOM_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 1.0]</>
|
||||
<entry> 1.0f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_ROOM_HIGH_FREQUENCY Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_ROOM_HIGH_FREQUENCY_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 1.0]</>
|
||||
<entry> 0.1f ???</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_DECAY_TIME Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_DECAY_TIME_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.1, 20.0]</>
|
||||
<entry> 1.0f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>NV_DECAY_HIGH_FREQUENCY_RATIO Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_DECAY_HIGH_FREQUENCY_RATIO_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.1, 2.0]</>
|
||||
<entry> 0.5f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_REFLECTIONS Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_REFLECTIONS_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.1, 3.0]</>
|
||||
<entry> 1.0f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_REFLECTIONS_DELAY Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_REFLECTIONS_DELAY_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 0.3]</>
|
||||
<entry> 0.02f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_REVERB Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_REVERB_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 10.0]</>
|
||||
<entry> 1.0f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_REVERB_DELAY Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_REVERB_DELAY_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 0.1]</>
|
||||
<entry> 0.04f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_DIFFUSION Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_DIFFUSION_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 100.0]</>
|
||||
<entry> 100.0f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_DENSITY Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_DENSITY_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[0.0, 100.0]</>
|
||||
<entry> 100.0f</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>ENV_HIGH_FREQUENCY_REFERENCE Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>ENV_HIGH_FREQUENCY_REFERENCE_EXT</>
|
||||
<entry>f</>
|
||||
<entry>[20.0, 20000.0]</>
|
||||
<entry>5000.0</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description: ???
|
||||
What's up with the defaults? Not a normalized range
|
||||
and a global Scale to set?
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>Source Environment Attributes</title>
|
||||
<para>
|
||||
TBA.
|
||||
</para>
|
||||
</sect3>
|
||||
]]>
|
||||
</sect2>
|
||||
</sect1>
|
||||
]]> <!-- Environment -->
|
||||
|
||||
|
||||
|
||||
<![ %Ext2 [
|
||||
|
||||
<sect1>
|
||||
<title>Compatibility Extensions</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Loki Buffer InternalFormat Extension</title>
|
||||
<para>
|
||||
&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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> BufferWriteData</function></funcdef>
|
||||
<paramdef> &uint; <parameter>bufferName</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter>format</parameter></paramdef>
|
||||
<paramdef> &void;* <parameter> data </parameter></paramdef>
|
||||
<paramdef> &sizei; <parameter> size </parameter></paramdef>
|
||||
<paramdef> &uint; <parameter>frequency</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter>internalFormat</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
Valid formats for internalFormat are FORMAT_MONO8, FORMAT_MONO16,
|
||||
FORMAT_STEREO8, and FORMAT_STEREO16.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Loki BufferAppendData Extension</title>
|
||||
<para>
|
||||
Experimental implementation to append data to an existing
|
||||
buffer. Obsoleted by Buffer Queueing. TBA.
|
||||
</para>
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (GenStreamingBuffers):</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk0000507-09"><title>RFC: alBufferAppendData</title><para>
|
||||
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 );
|
||||
|
||||
|
||||
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-briareaos0006XX-01"><title>RFC: GenStreamingBuffers</title><para>
|
||||
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()?
|
||||
</para><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Loki Decoding Callback Extension</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
TBA.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Loki Infinite Loop Extension</title>
|
||||
<para>
|
||||
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
|
||||
<literallayout>
|
||||
Source( sName, PLAY_COUNT, MAX_INTEGER )
|
||||
</literallayout>
|
||||
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.
|
||||
<table>
|
||||
<title>Source LOOP_LOKI Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<colspec colname=c3>
|
||||
<colspec colname=c4>
|
||||
<spanspec spanname=hspan namest=c1 nameend=c4 align=left>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>LOOP_LOKI</>
|
||||
<entry>b</>
|
||||
<entry> &TRUE; &FALSE;</>
|
||||
<entry> &FALSE; </>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description:
|
||||
&TRUE; indicates that the Source will perform an inifinite
|
||||
loop over the content of the current Buffer it refers to.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Loki Byte Offset Extension</title>
|
||||
<para>
|
||||
The following has been obsoleted by explicit Source State query.
|
||||
hack.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>Buffer BYTE Offset attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>BYTE_LOKI</>
|
||||
<entry>ui</>
|
||||
<entry> n/a </>
|
||||
<entry> n/a </>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Current byte for the buffer bound to the source interpreted
|
||||
as an offset from the beginning of the buffer.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
</sect1>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Ext2 [
|
||||
<sect1>
|
||||
<title>Loop Point Extension</title>
|
||||
<para>
|
||||
|
||||
In external file now.
|
||||
|
||||
</para>
|
||||
</sect1>
|
||||
]]>
|
||||
|
||||
</appendix>
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>OpenAL Architecture</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>OpenAL Architecture</h1>
|
||||
<p>
|
||||
This document has been removed.
|
||||
See <a href="index.html">Index</a>
|
||||
for the specification.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,691 +0,0 @@
|
|||
|
||||
|
||||
<chapter id="buffers">
|
||||
<title>Buffers</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
The simplest supported format for buffer data is PCM.
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note id="ann-bk000721-01"><title>Annotation/ Compressed Buffers</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000721-18"><title>RFC: Compressed Buffers</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Scratch [
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
]]>
|
||||
|
||||
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Buffer States</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
A Buffer is considered to be in one of the following States, with respect
|
||||
to all Sources:
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
A single queue entry
|
||||
with a single Source for which the Buffer is not yet
|
||||
PROCESSED propagates the buffer's queueing state to
|
||||
PENDING.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No CURRENT State)</title><para>
|
||||
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).
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (State Query and Shared Buffers)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000927-02"><title>RFC: IsBufferProcessed? </title><para>
|
||||
Instead of exposing the internal state, a simple boolean query
|
||||
whether a buffer can be deleted or refilled can be used.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000731-04"><title>RFC: BufferData on QUEUED</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000731-05"><title>RFC: Buffer State Query</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Managing Buffer Names</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
|
||||
<sect2>
|
||||
<title>Requesting Buffers Names</title>
|
||||
<para>
|
||||
The application requests a number of Buffers using GenBuffers.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> GenBuffers </function></funcdef>
|
||||
<paramdef> &sizei; <parameter> n </parameter></paramdef>
|
||||
<paramdef> &uint;* <parameter> bufferNames </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000803-02"><title>RFC: Buffer Name 0</title><para>
|
||||
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"?
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Releasing Buffer Names</title>
|
||||
<para>
|
||||
The application requests deletion of a number of Buffers
|
||||
by calling DeleteBuffers.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> DeleteBuffers </function></funcdef>
|
||||
<paramdef> &sizei; <parameter> n </parameter></paramdef>
|
||||
<paramdef> &uint;* <parameter> bufferNames </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000803-01"><title>RFC: Force Deletion</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000731-07"><title>RFC: Relasing used Buffers</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000731-06"><title>RFC: Deferred Buffer Release</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000927-03"><title>RFC: sourceName 0 </title><para>
|
||||
Is there a useful application for this? Do we mark that this
|
||||
is reserved?
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Validating a Buffer Name</title>
|
||||
<para>
|
||||
The application can verify whether a buffer Name is valid
|
||||
using the IsBuffer query.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &bool; <function> IsBuffer </function></funcdef>
|
||||
<paramdef> &uint; <parameter> bufferName</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1>
|
||||
<title>Manipulating Buffer Attributes</title>
|
||||
|
||||
<sect2>
|
||||
<title>Buffer Attributes</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>Buffer FREQUENCY Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry> FREQUENCY </>
|
||||
<entry> float </>
|
||||
<entry> none </>
|
||||
<entry> (0, any]</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No Frequency enumeration)</title><para>
|
||||
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).
|
||||
</para><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Implied Frequency)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000806-01"><title>RFC: BITS not needed </title><para>
|
||||
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).
|
||||
</para></note>
|
||||
<para>
|
||||
<table>
|
||||
<title>Buffer BITS Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>BITS</>
|
||||
<entry>ui</>
|
||||
<entry>8,16</>
|
||||
<entry>0</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
Description:
|
||||
Bits per sample. This is a query-only attribute. The
|
||||
default value for an (empty) buffer is zero.
|
||||
</para>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No Format query)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000806-02"><title>RFC: CHANNELS needed?</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
<para>
|
||||
<table>
|
||||
<title>Buffer CHANNELS Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep="1" rowsep="1">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val;</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>CHANNELS</>
|
||||
<entry>ui</>
|
||||
<entry>RFC: enums or N/A?</>
|
||||
<entry>0</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
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.
|
||||
</para>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>Buffer SIZE Attribute</title>
|
||||
<tgroup cols="4" align="left" colsep="1" rowsep="1">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val;</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>SIZE</>
|
||||
<entry> &sizei; </>
|
||||
<entry> [0, MAX_UINT]</>
|
||||
<entry> 0 </>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
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).
|
||||
</para>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-15"><title>RFC: buffer overflow/underflow</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000619-16"><title>RFC: query for samples/duration?</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-01"><title>RFC: memory budgeting</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-02"><title>RFC: buffer initial state</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Querying Buffer Attributes</title>
|
||||
<para>
|
||||
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*.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> GetBuffer{n}{sifd}{v} </function></funcdef>
|
||||
<paramdef> &uint; <parameter>bufferName</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &type;* <parameter> values </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Specifying Buffer Content</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> BufferData </function></funcdef>
|
||||
<paramdef> &uint; <parameter>bufferName</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter>format</parameter></paramdef>
|
||||
<paramdef> &void;* <parameter> data </parameter></paramdef>
|
||||
<paramdef> &sizei; <parameter> size </parameter></paramdef>
|
||||
<paramdef> &sizei; <parameter>frequency</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-04"><title>RFC: format enums</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk0000507-17"><title>RFC: Frequency woes</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000504-01"><title>RFC: data mover mess</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-11"><title>RFC: expose internal format</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-12"><title>RFC: memory management with compressed data</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-21"><title>RFC: conversion and sample retrieval</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect2>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
|
@ -1,304 +0,0 @@
|
|||
|
||||
<chapter id="introduction">
|
||||
<title>Introduction</title>
|
||||
|
||||
<![ %Revision [
|
||||
<para><literallayout>
|
||||
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.
|
||||
</literallayout><para>
|
||||
]]>
|
||||
|
||||
<section>
|
||||
<title>Formatting and Conventions</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Terminology)</title><para>
|
||||
"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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
<revhistory>
|
||||
|
||||
<revision>
|
||||
<revnumber> 1.8/1.7./1.6/1.5 </revnumber>
|
||||
<date> September-August 2000 </date>
|
||||
<authorinitials> bk </authorinitials>
|
||||
<revremark> Final Draft for Public Review </revremark>
|
||||
</revision>
|
||||
|
||||
<revision>
|
||||
<revnumber> 1.4 </revnumber>
|
||||
<date> June 2000 </date>
|
||||
<authorinitials> bk </authorinitials>
|
||||
<revremark> First Draft for Public Review </revremark>
|
||||
</revision>
|
||||
|
||||
<revision>
|
||||
<revnumber> 1.2 </revnumber>
|
||||
<date> March 2000 </date>
|
||||
<authorinitials> mkv </authorinitials>
|
||||
<revremark> Draft released for GDC </revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
</para>
|
||||
<![ %Scratch [
|
||||
<note id="todo"><title>TODO</title><para>
|
||||
<literallayout>
|
||||
- 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.
|
||||
|
||||
</literallayout>
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>What is the &OAL; Audio System?</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Programmer's View of &OAL;</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (&OAL; and &OGL; use)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Implementor's View of &OAL;</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Native audio APIs)</title><para>
|
||||
Implementors can choose to implement &OAL; on top
|
||||
of an existing native audio API.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Our View</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Requirements, Conformance and Extensions</title>
|
||||
<para>
|
||||
The specification has to guarantee a minimum number of resources.
|
||||
However, implementations are encouraged to compete on performance,
|
||||
available resources, and output quality.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-06"><title>RFC: suggested requirements</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-briareos000724-01"><title>RFC: no requirements</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
The current sample implementation and documentation for &OAL; can be
|
||||
obtained from
|
||||
<ulink
|
||||
url="http://wwww.openal.org/"
|
||||
type="http">openal.org</ulink>.
|
||||
&OAL; is also available from the the
|
||||
<ulink url="http://cvs.lokigames.com/cgi-bin/cvsweb.cgi/openal/" type="http">
|
||||
&OAL; CVS repository</ulink>. For more information on how to get
|
||||
&OAL; from CVS also see <ulink url="http://cvs.lokigames.com/" type="http">
|
||||
&coLoki; CVS</ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<title>Architecture Review and Acknowledgements</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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;
|
||||
|
||||
|
||||
</para>
|
||||
</section>
|
||||
</chapter> <!-- Overview -->
|
||||
|
||||
|
|
@ -1,261 +0,0 @@
|
|||
|
||||
<chapter id="multichannel">
|
||||
<title>Handling Multichannel Data</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (per-case Buffer use)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Specifying Buffer Content and Internal Format</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
To account for this requirement, an extended command to specify
|
||||
sample data to be stored in a given buffer is introduced.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> BufferWriteData</function></funcdef>
|
||||
<paramdef> &uint; <parameter>bufferName</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter>format</parameter></paramdef>
|
||||
<paramdef> &void;* <parameter> data </parameter></paramdef>
|
||||
<paramdef> &sizei; <parameter> size </parameter></paramdef>
|
||||
<paramdef> &uint; <parameter>frequency</parameter></paramdef>
|
||||
<paramdef> &enum; <parameter>internalFormat</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (atomic WriteData)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (change buffer format on write)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (BufferReadData)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000813-01"><title>RFC: frequency for write/read? </title><para>
|
||||
Do we (ever) want to provide the application control over the internal frequency?
|
||||
</para></note>
|
||||
]]>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Rendering Multichannel Buffers</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Source NONE)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (implicit ambient)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (no direct mixing)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (no combined Buffer/Passthrough)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000813-02"><title>RFC: Per-Channel access</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</section>
|
||||
</chapter>
|
|
@ -1,977 +0,0 @@
|
|||
|
||||
<chapter id="oal-operation">
|
||||
<title>&OAL; Operation</title>
|
||||
|
||||
<sect1>
|
||||
<title>&OAL; Fundamentals</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para><para>
|
||||
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.
|
||||
</para><para>
|
||||
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.
|
||||
</para><para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000926-03"><title>RFC: Data Binding</title><para>
|
||||
Have to specifiy when pointer arguments are dereferenced.
|
||||
</para></note>
|
||||
]]>
|
||||
<sect2>
|
||||
<title>Primitive Types</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note><title>RFC/000507:</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
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.
|
||||
<table>
|
||||
<title>&AL; Primitive Data Types</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>AL Type</>
|
||||
<entry>Description</>
|
||||
<entry>GL Type</>
|
||||
<entry>GCC IA32</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry> ALboolean </entry>
|
||||
<entry> 8-bit boolean </entry>
|
||||
<entry> GLboolean </entry>
|
||||
<entry> unsigned char </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALbyte </entry>
|
||||
<entry> signed 8-bit 2's-complement integer </entry>
|
||||
<entry> GLbyte </entry>
|
||||
<entry> signed char </entry>
|
||||
</row>
|
||||
<row >
|
||||
<entry> ALubyte </entry>
|
||||
<entry> unsigned 8-bit integer </entry>
|
||||
<entry> GLubyte </entry>
|
||||
<entry> unsigned char </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALshort </entry>
|
||||
<entry> signed 16-bit 2's-complement integer </entry>
|
||||
<entry> GLshort </entry>
|
||||
<entry> short </entry>
|
||||
</row
|
||||
<row>
|
||||
<entry> ALushort </entry>
|
||||
<entry> unsigned 16-bit integer </entry>
|
||||
<entry> GLushort </entry>
|
||||
<entry> unsigned short </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALint </entry>
|
||||
<entry> signed 32-bit 2's-complement integer </entry>
|
||||
<entry> GLint </entry>
|
||||
<entry> int </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALuint </entry>
|
||||
<entry> unsigned 32-bit integer </entry>
|
||||
<entry> GLuint </entry>
|
||||
<entry> unsigned int </entry>
|
||||
</row>
|
||||
<![ %RFC [
|
||||
<row>
|
||||
<entry> ALlong </entry>
|
||||
<entry> signed 64-bit 2's-complement integer </entry>
|
||||
<entry> n/a </entry>
|
||||
<entry> long long </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALulong </entry>
|
||||
<entry> unsigned 64-bit integer </entry>
|
||||
<entry> n/a </entry>
|
||||
<entry> unsigned long long </entry>
|
||||
</row>
|
||||
]]>
|
||||
<row>
|
||||
<entry> ALsizei </entry>
|
||||
<entry> non-negative 32-bit binary integer size </entry>
|
||||
<entry> GLsizei </entry>
|
||||
<entry> int </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALenum </entry>
|
||||
<entry> enumerated 32-bit value </entry>
|
||||
<entry> GLenum </entry>
|
||||
<entry> unsigned int </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALbitfield </entry>
|
||||
<entry> 32 bit bitfield </entry>
|
||||
<entry> GLbitfield </entry>
|
||||
<entry> unsigned int </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALfloat </entry>
|
||||
<entry> 32-bit IEEE754 floating-point </entry>
|
||||
<entry> GLfloat </entry>
|
||||
<entry> float </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALclampf </entry>
|
||||
<entry> Same as ALfloat, but in range [0, 1] </entry>
|
||||
<entry> GLclampf </entry>
|
||||
<entry> float </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALdouble </entry>
|
||||
<entry> 64-bit IEEE754 floating-point </entry>
|
||||
<entry> GLdouble </entry>
|
||||
<entry> double </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry> ALclampd </entry>
|
||||
<entry> Same as ALdouble, but in range [0, 1] </entry>
|
||||
<entry> GLclampd </entry>
|
||||
<entry> double </entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation on Type Sizes</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
<note><title>Annotation on 64bit integral</title><para>
|
||||
It would be desirable to define ulong and long, but again
|
||||
we defer to &OGL; in this decision.
|
||||
</para></note>
|
||||
<note><title>Annotation on Enumeration</title><para>
|
||||
&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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>Floating-Point Computation</title>
|
||||
<para>
|
||||
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.
|
||||
</para><para>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
<title>AL State</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
<title>AL Command Syntax</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Not all types supported yet)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
<title>Basic AL Operation</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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;.
|
||||
</para>
|
||||
|
||||
<example>
|
||||
<title>Initialization Example</title>
|
||||
<para>
|
||||
&sample.c;
|
||||
</para>
|
||||
<programlisting>
|
||||
</programlisting>
|
||||
</example>
|
||||
|
||||
<![ %Example [
|
||||
<example>
|
||||
<title>Initialization Example</title>
|
||||
<programlisting>
|
||||
&ExInitAL.c;
|
||||
</programlisting>
|
||||
</example>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Example [
|
||||
<example>
|
||||
<title>Processing Loop</title>
|
||||
<programlisting>
|
||||
// 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]);
|
||||
}
|
||||
}
|
||||
</programlisting>
|
||||
</example>
|
||||
]]>
|
||||
|
||||
</sect1>
|
||||
|
||||
<sect1 id="errors">
|
||||
<title>AL Errors</title>
|
||||
<para>
|
||||
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
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &enum; <function> GetError </function></funcdef>
|
||||
<void>
|
||||
</funcprototype></funcsynopsis>
|
||||
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).
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000926-04"><title>RFC: GL distributed error </title><para>
|
||||
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.
|
||||
</para></note>
|
||||
<note><title>Annotation (Looping GetError)</title><para>
|
||||
&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.
|
||||
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Only First Error)</title><para>
|
||||
Like &OGL; &AL; will ignore subsequent errors once an
|
||||
error conditation has been encountered.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation/ Verbose Error String</title><para>
|
||||
There is no need to maintain a separate GetErrorString
|
||||
function (inspired by the proposed gluGetErrorStrings)
|
||||
as the existing GetString entry point can be used.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<para>
|
||||
<table>
|
||||
<title>Error Conditions</title>
|
||||
<tgroup cols="2" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</>
|
||||
<entry>Description</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>NO_ERROR</>
|
||||
<entry>"No Error" token.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>INVALID_NAME</>
|
||||
<entry>Invalid Name parameter.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>INVALID_ENUM</>
|
||||
<entry>Invalid parameter.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>INVALID_VALUE</>
|
||||
<entry>Invalid enum parameter value.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>INVALID_OPERATION</>
|
||||
<entry>Illegal call.</>
|
||||
</row>
|
||||
<row>
|
||||
<entry>OUT_OF_MEMORY</>
|
||||
<entry>Unable to allocate memory.</>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Scratch [
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
Otherwise errors are generated only for conditions that are
|
||||
explicitely described in this specification.
|
||||
</para>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000807-01"><title>RFC: INVALID_SIZE?</title><para>
|
||||
Specific error case in which the size argument is
|
||||
negative, or mismatches internal conditions for a getter?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000802-03"><title>RFC: INVALID_POINTER?</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
<sect1 id="control">
|
||||
<title>Controlling AL Execution</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> Enable </function></funcdef>
|
||||
<paramdef> &enum; <parameter> target </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &void; <function> Disable </function></funcdef>
|
||||
<paramdef> &enum; <parameter> target </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
The application can also query whether a given capability is
|
||||
currently enabled or not.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> &bool; <function> IsEnabled </function></funcdef>
|
||||
<paramdef> &enum; <parameter> target </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
If the token used to specify target is not legal,
|
||||
an INVALID_ENUM error will be generated.
|
||||
</para>
|
||||
<para>
|
||||
At this time, this mechanism is not used. There are no valid
|
||||
targets.
|
||||
</para>
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Enable/Disable)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect1>
|
||||
|
||||
<sect1 id="objects">
|
||||
<title>Object Paradigm</title>
|
||||
<para>
|
||||
&AL; is an object-oriented API, but it does not expose classes, structs,
|
||||
or other explicit data structures to the application.
|
||||
</para>
|
||||
|
||||
|
||||
<sect2 id="object-overview-categories">
|
||||
<title>Object Categories</title>
|
||||
<para>
|
||||
&AL; has three primary categories of Objects:
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
one unique Listener per Context
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
multiple Buffers shared among Contexts
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
multiple Sources, each local to a Context
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
In the following, "{Object}" will stand for either Source,
|
||||
Listener, or Buffer.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="object-overview-dynamic">
|
||||
<title>Static vs. Dynamic Objects</title>
|
||||
<para>
|
||||
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;.
|
||||
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Object Names</title>
|
||||
<para>
|
||||
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".
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Requesting Object Names</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> Gen{Object}s </function></funcdef>
|
||||
<paramdef> &sizei; <parameter> n </parameter></paramdef>
|
||||
<paramdef> &uint;* <parameter> objectNames </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
|
||||
<![ %Scratch [
|
||||
<note><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Scratch [
|
||||
<warning><para>
|
||||
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.
|
||||
</para></warning>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No application selected Names)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotate (Negative/zero sizei)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id=rfc-bk000626-02><title>RFC: Resource Release Hint</title><para>
|
||||
Do we need a hint that resource release has to be done on DeleteXXX,
|
||||
instead of leaving this housekeeping to &AL;?
|
||||
</para></note>
|
||||
<note id=rfc-bk000626-03><title>RFC: Zero Name</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Releasing Object Names</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef>&void;<function>Delete{Object}s</function></funcdef>
|
||||
<paramdef>&sizei;<parameter>n</parameter></paramdef>
|
||||
<paramdef>&uint;*<parameter>objectNames</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000724-18"><title>RFC: Deletion Errors</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Validating an Object Name</title>
|
||||
<para>
|
||||
&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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef>&bool;<function>Is{Object}</function></funcdef>
|
||||
<paramdef>&uint;<parameter>objectName</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
<![ %RFC [
|
||||
<note><title>RFC/bk000504:</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Setting Object Attributes</title>
|
||||
<para>
|
||||
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
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> {Object}{n}{sifd}{v} </function></funcdef>
|
||||
<paramdef> &uint; <parameter> objectName </parameter></paramdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &type; <parameter> values </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
In the case of unnamed (unique) Objects, the (integer) objectName
|
||||
is omitted, as it is implied by the {Object} part of function name:
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> {Object}{n}{sifd}{v} </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &type; <parameter> values </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
For example, the Listener3d command would not require an (integer)
|
||||
objectName argument.
|
||||
</para>
|
||||
<para>
|
||||
The objectName specifies the &AL; object affected by this call.
|
||||
Use of an invalid Name will cause an INVALID_NAME error.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
Any command that causes an error is a NOP.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Querying Object Attributes</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> Get{Object}{n}{sifd}{v} </function></funcdef>
|
||||
<paramdef> &uint; <parameter> objectName </parameter></paramdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &type;* <parameter> destination </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
For unnamed unique Objects, the objectName is omitted as it is
|
||||
implied by the function name:
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> Get{Object}{n}{sifd}{v} </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &type;* <parameter> destination </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Object Attributes</title>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
The general form in which this document describes parameters is
|
||||
<table>
|
||||
<title>{Object} Parameters</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<colspec colname=c1>
|
||||
<colspec colname=c2>
|
||||
<colspec colname=c3>
|
||||
<colspec colname=c4>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>&Par;</>
|
||||
<entry>&Sig;</>
|
||||
<entry>&Val</>
|
||||
<entry>&Def;</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>paramName</>
|
||||
<entry>T</>
|
||||
<entry> range or set </>
|
||||
<entry> scalar or n-tuple </>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
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.
|
||||
</para>
|
||||
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000626-04"><title>RFC: Initial (Default) State</title><para>
|
||||
The default state of objects will have to be specified here.
|
||||
There will be no commands that allow the application to set
|
||||
other defaults.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
|
||||
<!-- Content has been moved into chp-rendering.sgml -->
|
File diff suppressed because it is too large
Load diff
|
@ -1,730 +0,0 @@
|
|||
|
||||
<chapter id="state-requests">
|
||||
<title>State and State Requests</title>
|
||||
<para>
|
||||
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".
|
||||
</para>
|
||||
|
||||
|
||||
<sect1 id="state-query">
|
||||
<title>Querying &AL; State</title>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Simple Queries</title>
|
||||
<para>
|
||||
Like &OGL;, &AL; uses a simplified interface for querying global
|
||||
state. The following functions accept a set of enumerations.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> GetBooleanv </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &bool;* <parameter> dest </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> GetIntegerv </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> ∫* <parameter> dest </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> GetFloatv </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &float;* <parameter> dest </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> GetDoublev </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName </parameter></paramdef>
|
||||
<paramdef> &double;* <parameter> dest </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
Legal values are e.g. DOPPLER_FACTOR, DOPPLER_VELOCITY, DISTANCE_MODEL.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
To query state controlled by Enable/Disable there is an additional
|
||||
IsEnabled function defined (see "Controlling &AL; Execution").
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Data Conversions</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Query of Modes)</title><para>
|
||||
Modes (e.g. the current distance model) can be queried
|
||||
using the respective tokens. The recommended query
|
||||
command is GetIntegerv.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>String Queries</title>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> const &ubyte;* <function> GetString </function></funcdef>
|
||||
<paramdef> &enum; <parameter> paramName</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1 id="time">
|
||||
<title>Time and Frequency</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000927-01"><title>RFC: Query and Factor?</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000803-03"><title>RFC: Setting Time/Long</title><para>
|
||||
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?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000806-03"><title>RFC: Duration Query</title>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
<para>
|
||||
We need to divorce sample (memory) count from duration,
|
||||
because of compression and differences between
|
||||
internal and external sample format.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Scratch [
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Buffer vs. Queue Duration)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (DURATION vs. REMAINDER)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
|
||||
<sect1 id="scaling">
|
||||
<title>Space and Distance</title>
|
||||
<para>
|
||||
&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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No DistanceFactor)</title><para>
|
||||
&AL; does not provide a global, per Context DISTANCE_FACTOR,
|
||||
as all calculations are scale invariant.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Distance Calculations)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000915-02"><title>RFC: Limiting Errors</title><para>
|
||||
Do we limit permissible errors on distance or gain
|
||||
calculations? How much quality
|
||||
and accuracy do we expect from conformant implementations?
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (DS3D DistanceFactor)</title><para>
|
||||
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.
|
||||
<!-- http://msdn.microsoft.com/library/psdk/directx/dsover_6jj8.htm -->
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
|
||||
<sect1 id="attenuation-by-distance">
|
||||
<title>Attenuation By Distance</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
&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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> DistanceModel </function></funcdef>
|
||||
<paramdef> &enum; <parameter> modelName </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Inverse Square Law)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Enable/Disable Attenuation)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>Inverse Distance Rolloff Model</title>
|
||||
<para>
|
||||
The following formula describes the distance attenutation
|
||||
defined by the Rolloff Attenutation Model, as logarithmic
|
||||
calculation.
|
||||
<literallayout>
|
||||
|
||||
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);
|
||||
|
||||
</literallayout>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Linear Calculation)</title><para>
|
||||
The logarithmic formula above is equivalent to
|
||||
<literallayout>
|
||||
G = gain_linear / ( 1 + ROLLOFF_FACTOR*((dist-REFERENCE_DISTANCE)/REFERENCE_DISTANCE) );
|
||||
G = min(G,max_gain_linear);
|
||||
G = max(G,min_gain_linear);
|
||||
</literallayout>
|
||||
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:
|
||||
<literallayout>
|
||||
dB = 10 * log( P/P0 ) = 10 * log( sqr(A/A0 ) = 20 * log( A/A0 )
|
||||
</literallayout>
|
||||
Common power/amplitude ratios and attenuations per distance are:
|
||||
<table>
|
||||
<title>Logarithmic Scale and Gain</title>
|
||||
<tgroup cols="4" align="left" colsep=1 rowsep=1>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Distance</>
|
||||
<entry>Attenuation</>
|
||||
<entry>Power Ratio</>
|
||||
<entry>Amplitude Ratio</>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>REF</>
|
||||
<entry> 0dB </>
|
||||
<entry> 1:1 </>
|
||||
<entry> 1:1 </>
|
||||
</row>
|
||||
<row>
|
||||
<entry> 2*REF </>
|
||||
<entry> -6dB </>
|
||||
<entry> 1:4 </>
|
||||
<entry> 1:2 </>
|
||||
</row>
|
||||
<row>
|
||||
<entry> 4*REF </>
|
||||
<entry> -12dB </>
|
||||
<entry> 1:16 </>
|
||||
<entry> 1:4 </>
|
||||
</row>
|
||||
<row>
|
||||
<entry> 8*REF </>
|
||||
<entry> -18dB </>
|
||||
<entry> 1:64 </>
|
||||
<entry> 1:8 </>
|
||||
</row>
|
||||
<row>
|
||||
<entry> 0.5*REF </>
|
||||
<entry> 6dB </>
|
||||
<entry> 2:1 </>
|
||||
<entry> 4:1 </>
|
||||
</row>
|
||||
<row>
|
||||
<entry> 0.25*REF </>
|
||||
<entry> 12dB </>
|
||||
<entry> 4:1 </>
|
||||
<entry> 16:1 </>
|
||||
</row>
|
||||
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Rolloff quantization)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Gain Clamping)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (Extended Dynamic Range)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Inverse Distance Clamped Model</title>
|
||||
<para>
|
||||
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.
|
||||
<literallayout>
|
||||
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);
|
||||
</literallayout>
|
||||
</para>
|
||||
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (DS3D MIN_DISTANCE)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (High Frequency Rolloff)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1 id="order-distance">
|
||||
<title>Evaluation of Gain/Attenuation Related State</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
<sect1 id="culling-by-distance">
|
||||
<title>No Culling By Distance</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No MAX_DISTANCE plus MUTE)</title><para>
|
||||
&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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %RFC [
|
||||
<note id="rfc-bk000803-07"><title>RFC: DS3D-like Extension</title><para>
|
||||
For ease of portability, should we define an Extension that
|
||||
provides MAX_DISTANCE for MUTE mode?
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
|
||||
|
||||
<![ %Scratch [
|
||||
<sect1 id="sound-speed">
|
||||
<title>NO Sound Propagation Speed</title>
|
||||
<para>
|
||||
&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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> PropagationSpeed </function></funcdef>
|
||||
<paramdef> &float; <parameter> propSpeed </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</sect1>
|
||||
]]>
|
||||
|
||||
<sect1 id="doppler-scale">
|
||||
<title>Velocity Dependent Doppler Effect</title>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
<literallayout>
|
||||
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
|
||||
</literallayout>
|
||||
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.
|
||||
</para>
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> DopplerFactor </function></funcdef>
|
||||
<paramdef> &float; <parameter> dopplerFactor </parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No Enable)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<para>
|
||||
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.
|
||||
<funcsynopsis><funcprototype>
|
||||
<funcdef> void <function> DopplerVelocity </function></funcdef>
|
||||
<paramdef> &float; <parameter> dopplerVelocity</parameter></paramdef>
|
||||
</funcprototype></funcsynopsis>
|
||||
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.
|
||||
</para>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (No Sideeffects on Delay)</title><para>
|
||||
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.
|
||||
</para></note>
|
||||
]]>
|
||||
|
||||
<![ %Annote [
|
||||
<note><title>Annotation (SetUnitsPerMeter)</title><para>
|
||||
DOPPLER_VELOCITY accomplishes the purposes of DS3D
|
||||
scaling parameters in a straightforward way, without
|
||||
introducing the undesirable connotations of real world
|
||||
units.
|
||||
</para></note>
|
||||
]]>
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
|
||||
<!NOTATION ASCII system "ASCII" >
|
||||
<!ENTITY sample.c system "examples/init_al.c" CDATA CGM-CHAR>
|
||||
<!ENTITY ExInitAL.c system "examples/init_al.c" CDATA ASCII >
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
|
||||
<!-- ENTITY ExtLoopPoint.txt system "extensions/ext-loop-point.txt" CDATA linespecific -->
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
|
||||
<!-- Annotated Specification Target -->
|
||||
<!ENTITY % Level1 "INCLUDE" > <!-- Reference -->
|
||||
<!ENTITY % Level2 "INCLUDE" > <!-- Specification -->
|
||||
<!ENTITY % RFC "IGNORE" > <!-- Specification Draft -->
|
||||
<!ENTITY % Annote "INCLUDE" > <!-- Annotation -->
|
||||
<!ENTITY % Ext1 "INCLUDE" > <!-- ARB EXTensions -->
|
||||
<!ENTITY % Ext2 "INCLUDE" > <!-- Vendor EXTensions (if applicable) -->
|
||||
<!ENTITY % Example "IGNORE" > <!-- Example Code Vendor EXTensions -->
|
||||
<!ENTITY % Revision "IGNORE" > <!-- CVS Revision History Tags (per-file) -->
|
||||
<!ENTITY % Scratch "IGNORE" > <!-- Internal working notes/tmeporary -->
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
|
||||
<!-- Annotated Specification Target -->
|
||||
<!ENTITY % Level1 "INCLUDE" > <!-- Reference -->
|
||||
<!ENTITY % Level2 "INCLUDE" > <!-- Specification -->
|
||||
<!ENTITY % RFC "INCLUDE" > <!-- Specification Draft -->
|
||||
<!ENTITY % Annote "INCLUDE" > <!-- Annotation -->
|
||||
<!ENTITY % Ext1 "INCLUDE" > <!-- ARB EXTensions -->
|
||||
<!ENTITY % Ext2 "INCLUDE" > <!-- Vendor EXTensions (if applicable) -->
|
||||
<!ENTITY % Example "INCLUDE" > <!-- Example Code Vendor EXTensions -->
|
||||
<!ENTITY % Revision "IGNORE" > <!-- CVS Revision History Tags (per-file) -->
|
||||
<!ENTITY % Scratch "IGNORE" > <!-- Internal working notes/tmeporary -->
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
|
||||
<!-- Reference Target --->
|
||||
<!ENTITY % Level1 "INCLUDE" > <!-- Reference -->
|
||||
<!ENTITY % Level2 "INCLUDE" > <!-- Specification -->
|
||||
<!ENTITY % RFC "IGNORE" > <!-- Specification Draft -->
|
||||
<!ENTITY % Annote "IGNORE" > <!-- Annotation -->
|
||||
<!ENTITY % Ext1 "INCLUDE" > <!-- ARB EXTensions -->
|
||||
<!ENTITY % Ext2 "INCLUDE" > <!-- Vendor EXTensions (if applicable) -->
|
||||
<!ENTITY % Example "IGNORE" > <!-- Example Code Vendor EXTensions -->
|
||||
<!ENTITY % Revision "IGNORE" > <!-- CVS Revision History Tags (per-file) -->
|
||||
<!ENTITY % Scratch "IGNORE" > <!-- Internal working notes/tmeporary -->
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
|
||||
<!-- Specification Target -->
|
||||
<!ENTITY % Level1 "INCLUDE" > <!-- Reference -->
|
||||
<!ENTITY % Level2 "INCLUDE" > <!-- Specification -->
|
||||
<!ENTITY % RFC "IGNORE" > <!-- Specification Draft -->
|
||||
<!ENTITY % Annote "IGNORE" > <!-- Annotation -->
|
||||
<!ENTITY % Ext1 "INCLUDE" > <!-- ARB EXTensions -->
|
||||
<!ENTITY % Ext2 "INCLUDE" > <!-- Vendor EXTensions (if applicable) -->
|
||||
<!ENTITY % Example "IGNORE" > <!-- Example Code Vendor EXTensions -->
|
||||
<!ENTITY % Revision "IGNORE" > <!-- CVS Revision History Tags (per-file) -->
|
||||
<!ENTITY % Scratch "IGNORE" > <!-- Internal working notes/tmeporary -->
|
|
@ -1,43 +0,0 @@
|
|||
|
||||
<!ENTITY coLoki "Loki Software" >
|
||||
<!ENTITY coCreat "Creative Labs" >
|
||||
<!ENTITY OAL "OpenAL" >
|
||||
<!ENTITY AL "AL" >
|
||||
|
||||
<!ENTITY OGL "OpenGL" >
|
||||
|
||||
<!ENTITY NONE "NONE" >
|
||||
<!ENTITY TRUE "TRUE" >
|
||||
<!ENTITY FALSE "FALSE" >
|
||||
<!ENTITY NaN "NaN" >
|
||||
<!ENTITY Infty "Infinity" >
|
||||
<!ENTITY type "T " >
|
||||
<!ENTITY void "void " >
|
||||
<!ENTITY bool "boolean " >
|
||||
<!ENTITY byte "byte " >
|
||||
<!ENTITY ubyte "ubyte " >
|
||||
<!ENTITY short "short " >
|
||||
<!ENTITY ushort "ushort " >
|
||||
<!ENTITY int "int " >
|
||||
<!ENTITY uint "uint " >
|
||||
|
||||
<!ENTITY long "long " >
|
||||
<!ENTITY ulong "ulong " >
|
||||
|
||||
<!ENTITY enum "enum " >
|
||||
<!ENTITY sizei "sizei " >
|
||||
<!ENTITY bitfield "bitfield " >
|
||||
<!ENTITY float "float " >
|
||||
<!ENTITY double "double " >
|
||||
<!ENTITY clampf "clampf " >
|
||||
<!ENTITY clampd "clampd " >
|
||||
|
||||
<!-- ALC Context -->
|
||||
<!ENTITY device "ALCdevice" >
|
||||
<!ENTITY context "ALCcontext" >
|
||||
|
||||
<!ENTITY Par "Name" > <!-- enum as well as identifier -->
|
||||
<!ENTITY Sig "Signature" > <!-- legal types -->
|
||||
<!ENTITY Val "Values" > <!-- legal values/ranges -->
|
||||
<!ENTITY Def "Default" > <!-- default value -->
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title> Index</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>Index</h1>
|
||||
<p>
|
||||
This document has been removed.
|
||||
See <a href="http://www.openal.org/">www.openal.org</a>
|
||||
for information.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
</html>
|
|
@ -1,109 +0,0 @@
|
|||
<!DOCTYPE Book PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"[
|
||||
|
||||
<!-- INCLUDE or IGNORE for marked sections -->
|
||||
<!ENTITY % Marks system "ent-marks.sgml" >
|
||||
|
||||
<!-- keywords and other standard entities -->
|
||||
<!ENTITY % Entities system "ent-names.sgml" >
|
||||
|
||||
<!-- C programs and other example entities -->
|
||||
<!ENTITY % Examples system "ent-examples.sgml" >
|
||||
|
||||
<!-- Extensions as external ASCII documents -->
|
||||
<!ENTITY % Extensions system "ent-extensions.sgml" >
|
||||
|
||||
%Marks;
|
||||
%Entities;
|
||||
%Examples;
|
||||
%Extensions;
|
||||
|
||||
<!-- book sections -->
|
||||
<!ENTITY CREDITS system "../CREDITS" >
|
||||
<!ENTITY secBookInfo system "sec-bookinfo.sgml" >
|
||||
<!ENTITY chpIntroduction system "chp-introduction.sgml" >
|
||||
<!ENTITY chpOperation system "chp-operation.sgml" >
|
||||
<!ENTITY chpState system "chp-state.sgml" >
|
||||
<!ENTITY chpRendering system "chp-rendering.sgml" >
|
||||
<!ENTITY chpBuffers system "chp-buffers.sgml" >
|
||||
<!ENTITY chpQueueing system "chp-queueing.sgml" >
|
||||
<!ENTITY chpMultiChannel system "chp-multichannel.sgml" >
|
||||
|
||||
<!ENTITY alcContext system "alc-context.sgml" >
|
||||
|
||||
<!ENTITY appConstants system "app-constants.sgml" >
|
||||
<!ENTITY appExtensions system "app-extensions.sgml" >
|
||||
<!ENTITY appExtensionProcess system "app-extensionprocess.sgml" >
|
||||
<!ENTITY appAnnotations system "app-annotations.sgml" >
|
||||
|
||||
|
||||
|
||||
<!-- misc. specifics -->
|
||||
<!ENTITY DocVersion "1.0 (draft)" >
|
||||
<!ENTITY DocDate "2000/10/10" >
|
||||
<!ENTITY ALVersion "1.0" >
|
||||
<!ENTITY ALCVersion "1.0" >
|
||||
]>
|
||||
|
||||
|
||||
<!-- INDEX -->
|
||||
|
||||
<book id="index">
|
||||
|
||||
<!-- HEADING -->
|
||||
&secBookInfo;
|
||||
|
||||
<!-- INTRODUCTION -->
|
||||
&chpIntroduction;
|
||||
|
||||
<!-- CHAPTERS -->
|
||||
&chpOperation;
|
||||
&chpState;
|
||||
&chpRendering;
|
||||
&chpBuffers;
|
||||
&chpQueueing;
|
||||
|
||||
<![ %Scratch [
|
||||
&chpMultiChannel;
|
||||
]]>
|
||||
|
||||
&alcContext;
|
||||
|
||||
<!-- APPENDICITIS [sic] -->
|
||||
|
||||
&appConstants;
|
||||
&appExtensions;
|
||||
&appExtensionProcess;
|
||||
|
||||
<![ %Scratch [
|
||||
&appAnnotations;
|
||||
]]>
|
||||
|
||||
|
||||
<![ %Revision [
|
||||
<appendix>
|
||||
<title>Main Document CVS Revision History</title>
|
||||
<para><literallayout>
|
||||
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.
|
||||
|
||||
</literallayout><para>
|
||||
</appendix>
|
||||
]]>
|
||||
|
||||
|
||||
|
||||
</book>
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
|
||||
<bookinfo>
|
||||
<title>
|
||||
&OAL; Specification and Reference
|
||||
</title>
|
||||
<!--
|
||||
<editor>
|
||||
<firstname>Bernd</firstname>
|
||||
<surname>Kreimeier</surname>
|
||||
</editor>
|
||||
-->
|
||||
|
||||
<edition>Version 1.0 Draft</edition>
|
||||
|
||||
<pubdate>June 2000</pubdate>
|
||||
<copyright>
|
||||
<year>1999-2000</year>
|
||||
<holder>Loki Software</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</legalnotice>
|
||||
<legalnotice>
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</legalnotice>
|
||||
<legalnotice>
|
||||
<para> UNIX is a trademark of X/Open Group.</para>
|
||||
<para> X Window System is a trademark of X Consortium, Inc.</para>
|
||||
<para> Linux is a trademark of Linus Torvalds.</para>
|
||||
<para> Windows is a trademark of Microsoft Corp.</para>
|
||||
<para> Macintosh and Apple are trademarks of Apple Computer, Inc.</para>
|
||||
<para> Loki and &OAL; are trademarks of Loki Software, Inc.</para>
|
||||
<para> All other trademarks are property of their respective owners.</para>
|
||||
</legalnotice>
|
||||
|
||||
<releaseinfo>
|
||||
Draft document of &OAL; Specification.
|
||||
</releaseinfo>
|
||||
|
||||
|
||||
|
||||
</bookinfo>
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>OpenAL Specification</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>OpenAL Specification</h1>
|
||||
<p>
|
||||
This document has been removed.
|
||||
See <a href="index.html">Index</a>
|
||||
for the specification.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,16 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>OpenAL Whitepaper</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>OpenAL Whitepaper</h1>
|
||||
<p>
|
||||
This document has been removed.
|
||||
See <a href="index.html">Index</a>
|
||||
for the specification.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
#ifndef _ALU_H_
|
||||
#define _ALU_H_
|
||||
|
||||
#define ALUAPI
|
||||
#define ALUAPIENTRY __cdecl
|
||||
|
||||
#define BUFFERSIZE 48000
|
||||
#define FRACTIONBITS 14
|
||||
#define FRACTIONMASK ((1L<<FRACTIONBITS)-1)
|
||||
#define OUTPUTCHANNELS 2
|
||||
|
||||
#include "altypes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
ALUAPI ALint ALUAPIENTRY aluF2L(ALfloat value);
|
||||
ALUAPI ALshort ALUAPIENTRY aluF2S(ALfloat value);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluCrossproduct(ALfloat *inVector1,ALfloat *inVector2,ALfloat *outVector);
|
||||
ALUAPI ALfloat ALUAPIENTRY aluDotproduct(ALfloat *inVector1,ALfloat *inVector2);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluNormalize(ALfloat *inVector);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluMatrixVector(ALfloat matrix[3][3],ALfloat *vector);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluCalculateSourceParameters(ALuint source,ALuint channels,ALfloat *drysend,ALfloat *wetsend,ALfloat *pitch);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluMixData(ALvoid *context,ALvoid *buffer,ALsizei size,ALenum format);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluSetReverb(ALvoid *Reverb,ALuint Environment);
|
||||
ALUAPI ALvoid ALUAPIENTRY aluReverb(ALvoid *Reverb,ALfloat Buffer[][2],ALsizei BufferSize);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,345 +0,0 @@
|
|||
/******************************************************************
|
||||
*
|
||||
* EAX.H - DirectSound3D Environmental Audio Extensions version 2.0
|
||||
* Updated July 8, 1999
|
||||
*
|
||||
*******************************************************************
|
||||
*/
|
||||
|
||||
#ifndef EAX20_H_INCLUDED
|
||||
#define EAX20_H_INCLUDED
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
#pragma pack(push, 4)
|
||||
|
||||
/*
|
||||
* EAX 2.0 listener property set {0306A6A8-B224-11d2-99E5-0000E8D8C722}
|
||||
*/
|
||||
DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties,
|
||||
0x306a6a8,
|
||||
0xb224,
|
||||
0x11d2,
|
||||
0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DSPROPERTY_EAX20LISTENER_NONE,
|
||||
DSPROPERTY_EAX20LISTENER_ALLPARAMETERS,
|
||||
DSPROPERTY_EAX20LISTENER_ROOM,
|
||||
DSPROPERTY_EAX20LISTENER_ROOMHF,
|
||||
DSPROPERTY_EAX20LISTENER_ROOMROLLOFFFACTOR,
|
||||
DSPROPERTY_EAX20LISTENER_DECAYTIME,
|
||||
DSPROPERTY_EAX20LISTENER_DECAYHFRATIO,
|
||||
DSPROPERTY_EAX20LISTENER_REFLECTIONS,
|
||||
DSPROPERTY_EAX20LISTENER_REFLECTIONSDELAY,
|
||||
DSPROPERTY_EAX20LISTENER_REVERB,
|
||||
DSPROPERTY_EAX20LISTENER_REVERBDELAY,
|
||||
DSPROPERTY_EAX20LISTENER_ENVIRONMENT,
|
||||
DSPROPERTY_EAX20LISTENER_ENVIRONMENTSIZE,
|
||||
DSPROPERTY_EAX20LISTENER_ENVIRONMENTDIFFUSION,
|
||||
DSPROPERTY_EAX20LISTENER_AIRABSORPTIONHF,
|
||||
DSPROPERTY_EAX20LISTENER_FLAGS
|
||||
} DSPROPERTY_EAX20_LISTENERPROPERTY;
|
||||
|
||||
// OR these flags with property id
|
||||
#define DSPROPERTY_EAX20LISTENER_IMMEDIATE 0x00000000 // changes take effect immediately
|
||||
#define DSPROPERTY_EAX20LISTENER_DEFERRED 0x80000000 // changes take effect later
|
||||
#define DSPROPERTY_EAX20LISTENER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAX20LISTENER_NONE | \
|
||||
DSPROPERTY_EAX20LISTENER_IMMEDIATE)
|
||||
|
||||
// Use this structure for DSPROPERTY_EAX20LISTENER_ALLPARAMETERS
|
||||
// - all levels are hundredths of decibels
|
||||
// - all times are in seconds
|
||||
// - the reference for high frequency controls is 5 kHz
|
||||
//
|
||||
// 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 _EAX20LISTENERPROPERTIES
|
||||
{
|
||||
long lRoom; // room effect level at low frequencies
|
||||
long lRoomHF; // room effect high-frequency level re. low frequency level
|
||||
float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
|
||||
float flDecayTime; // reverberation decay time at low frequencies
|
||||
float flDecayHFRatio; // high-frequency to low-frequency decay time ratio
|
||||
long lReflections; // early reflections level relative to room effect
|
||||
float flReflectionsDelay; // initial reflection delay time
|
||||
long lReverb; // late reverberation level relative to room effect
|
||||
float flReverbDelay; // late reverberation delay time relative to initial reflection
|
||||
unsigned long dwEnvironment; // sets all listener properties
|
||||
float flEnvironmentSize; // environment size in meters
|
||||
float flEnvironmentDiffusion; // environment diffusion
|
||||
float flAirAbsorptionHF; // change in level per meter at 5 kHz
|
||||
unsigned long dwFlags; // modifies the behavior of properties
|
||||
} EAX20LISTENERPROPERTIES, *LPEAX20LISTENERPROPERTIES;
|
||||
|
||||
// used by DSPROPERTY_EAX20LISTENER_ENVIRONMENT
|
||||
enum
|
||||
{
|
||||
EAX20_ENVIRONMENT_GENERIC,
|
||||
EAX20_ENVIRONMENT_PADDEDCELL,
|
||||
EAX20_ENVIRONMENT_ROOM,
|
||||
EAX20_ENVIRONMENT_BATHROOM,
|
||||
EAX20_ENVIRONMENT_LIVINGROOM,
|
||||
EAX20_ENVIRONMENT_STONEROOM,
|
||||
EAX20_ENVIRONMENT_AUDITORIUM,
|
||||
EAX20_ENVIRONMENT_CONCERTHALL,
|
||||
EAX20_ENVIRONMENT_CAVE,
|
||||
EAX20_ENVIRONMENT_ARENA,
|
||||
EAX20_ENVIRONMENT_HANGAR,
|
||||
EAX20_ENVIRONMENT_CARPETEDHALLWAY,
|
||||
EAX20_ENVIRONMENT_HALLWAY,
|
||||
EAX20_ENVIRONMENT_STONECORRIDOR,
|
||||
EAX20_ENVIRONMENT_ALLEY,
|
||||
EAX20_ENVIRONMENT_FOREST,
|
||||
EAX20_ENVIRONMENT_CITY,
|
||||
EAX20_ENVIRONMENT_MOUNTAINS,
|
||||
EAX20_ENVIRONMENT_QUARRY,
|
||||
EAX20_ENVIRONMENT_PLAIN,
|
||||
EAX20_ENVIRONMENT_PARKINGLOT,
|
||||
EAX20_ENVIRONMENT_SEWERPIPE,
|
||||
EAX20_ENVIRONMENT_UNDERWATER,
|
||||
EAX20_ENVIRONMENT_DRUGGED,
|
||||
EAX20_ENVIRONMENT_DIZZY,
|
||||
EAX20_ENVIRONMENT_PSYCHOTIC,
|
||||
|
||||
EAX20_ENVIRONMENT_COUNT
|
||||
};
|
||||
|
||||
// Used by DS20PROPERTY_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 EAX20LISTENERFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time
|
||||
#define EAX20LISTENERFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level
|
||||
#define EAX20LISTENERFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time
|
||||
#define EAX20LISTENERFLAGS_REVERBSCALE 0x00000008 // reflections level
|
||||
#define EAX20LISTENERFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time
|
||||
|
||||
// This flag limits high-frequency decay time according to air absorption.
|
||||
#define EAX20LISTENERFLAGS_DECAYHFLIMIT 0x00000020
|
||||
|
||||
#define EAX20LISTENERFLAGS_RESERVED 0xFFFFFFC0 // reserved future use
|
||||
|
||||
// property ranges and defaults:
|
||||
|
||||
#define EAX20LISTENER_MINROOM (-10000)
|
||||
#define EAX20LISTENER_MAXROOM 0
|
||||
#define EAX20LISTENER_DEFAULTROOM (-1000)
|
||||
|
||||
#define EAX20LISTENER_MINROOMHF (-10000)
|
||||
#define EAX20LISTENER_MAXROOMHF 0
|
||||
#define EAX20LISTENER_DEFAULTROOMHF (-100)
|
||||
|
||||
#define EAX20LISTENER_MINROOMROLLOFFFACTOR 0.0f
|
||||
#define EAX20LISTENER_MAXROOMROLLOFFFACTOR 10.0f
|
||||
#define EAX20LISTENER_DEFAULTROOMROLLOFFFACTOR 0.0f
|
||||
|
||||
#define EAX20LISTENER_MINDECAYTIME 0.1f
|
||||
#define EAX20LISTENER_MAXDECAYTIME 20.0f
|
||||
#define EAX20LISTENER_DEFAULTDECAYTIME 1.49f
|
||||
|
||||
#define EAX20LISTENER_MINDECAYHFRATIO 0.1f
|
||||
#define EAX20LISTENER_MAXDECAYHFRATIO 2.0f
|
||||
#define EAX20LISTENER_DEFAULTDECAYHFRATIO 0.83f
|
||||
|
||||
#define EAX20LISTENER_MINREFLECTIONS (-10000)
|
||||
#define EAX20LISTENER_MAXREFLECTIONS 1000
|
||||
#define EAX20LISTENER_DEFAULTREFLECTIONS (-2602)
|
||||
|
||||
#define EAX20LISTENER_MINREFLECTIONSDELAY 0.0f
|
||||
#define EAX20LISTENER_MAXREFLECTIONSDELAY 0.3f
|
||||
#define EAX20LISTENER_DEFAULTREFLECTIONSDELAY 0.007f
|
||||
|
||||
#define EAX20LISTENER_MINREVERB (-10000)
|
||||
#define EAX20LISTENER_MAXREVERB 2000
|
||||
#define EAX20LISTENER_DEFAULTREVERB 200
|
||||
|
||||
#define EAX20LISTENER_MINREVERBDELAY 0.0f
|
||||
#define EAX20LISTENER_MAXREVERBDELAY 0.1f
|
||||
#define EAX20LISTENER_DEFAULTREVERBDELAY 0.011f
|
||||
|
||||
#define EAX20LISTENER_MINENVIRONMENT 0
|
||||
#define EAX20LISTENER_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1)
|
||||
#define EAX20LISTENER_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC
|
||||
|
||||
#define EAX20LISTENER_MINENVIRONMENTSIZE 1.0f
|
||||
#define EAX20LISTENER_MAXENVIRONMENTSIZE 100.0f
|
||||
#define EAX20LISTENER_DEFAULTENVIRONMENTSIZE 7.5f
|
||||
|
||||
#define EAX20LISTENER_MINENVIRONMENTDIFFUSION 0.0f
|
||||
#define EAX20LISTENER_MAXENVIRONMENTDIFFUSION 1.0f
|
||||
#define EAX20LISTENER_DEFAULTENVIRONMENTDIFFUSION 1.0f
|
||||
|
||||
#define EAX20LISTENER_MINAIRABSORPTIONHF (-100.0f)
|
||||
#define EAX20LISTENER_MAXAIRABSORPTIONHF 0.0f
|
||||
#define EAX20LISTENER_DEFAULTAIRABSORPTIONHF (-5.0f)
|
||||
|
||||
#define EAX20LISTENER_DEFAULTFLAGS (EAX20LISTENERFLAGS_DECAYTIMESCALE | \
|
||||
EAX20LISTENERFLAGS_REFLECTIONSSCALE | \
|
||||
EAX20LISTENERFLAGS_REFLECTIONSDELAYSCALE | \
|
||||
EAX20LISTENERFLAGS_REVERBSCALE | \
|
||||
EAX20LISTENERFLAGS_REVERBDELAYSCALE | \
|
||||
EAX20LISTENERFLAGS_DECAYHFLIMIT)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* EAX 2.0 buffer property set {0306A6A7-B224-11d2-99E5-0000E8D8C722}
|
||||
*/
|
||||
DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties,
|
||||
0x306a6a7,
|
||||
0xb224,
|
||||
0x11d2,
|
||||
0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22);
|
||||
|
||||
// For compatibility with future EAX versions:
|
||||
#define DSPROPSETID_EAX20_BufferProperties DSPROPSETID_EAX20_BufferProperties
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DSPROPERTY_EAX20BUFFER_NONE,
|
||||
DSPROPERTY_EAX20BUFFER_ALLPARAMETERS,
|
||||
DSPROPERTY_EAX20BUFFER_DIRECT,
|
||||
DSPROPERTY_EAX20BUFFER_DIRECTHF,
|
||||
DSPROPERTY_EAX20BUFFER_ROOM,
|
||||
DSPROPERTY_EAX20BUFFER_ROOMHF,
|
||||
DSPROPERTY_EAX20BUFFER_ROOMROLLOFFFACTOR,
|
||||
DSPROPERTY_EAX20BUFFER_OBSTRUCTION,
|
||||
DSPROPERTY_EAX20BUFFER_OBSTRUCTIONLFRATIO,
|
||||
DSPROPERTY_EAX20BUFFER_OCCLUSION,
|
||||
DSPROPERTY_EAX20BUFFER_OCCLUSIONLFRATIO,
|
||||
DSPROPERTY_EAX20BUFFER_OCCLUSIONROOMRATIO,
|
||||
DSPROPERTY_EAX20BUFFER_OUTSIDEVOLUMEHF,
|
||||
DSPROPERTY_EAX20BUFFER_AIRABSORPTIONFACTOR,
|
||||
DSPROPERTY_EAX20BUFFER_FLAGS
|
||||
} DSPROPERTY_EAX20_BUFFERPROPERTY;
|
||||
|
||||
// OR these flags with property id
|
||||
#define DSPROPERTY_EAX20BUFFER_IMMEDIATE 0x00000000 // changes take effect immediately
|
||||
#define DSPROPERTY_EAX20BUFFER_DEFERRED 0x80000000 // changes take effect later
|
||||
#define DSPROPERTY_EAX20BUFFER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAX20BUFFER_NONE | \
|
||||
DSPROPERTY_EAX20BUFFER_IMMEDIATE)
|
||||
|
||||
// Use this structure for DSPROPERTY_EAX20BUFFER_ALLPARAMETERS
|
||||
// - all levels are hundredths of decibels
|
||||
//
|
||||
// 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 _EAX20BUFFERPROPERTIES
|
||||
{
|
||||
long lDirect; // direct path level
|
||||
long lDirectHF; // direct path level at high frequencies
|
||||
long lRoom; // room effect level
|
||||
long lRoomHF; // room effect level at high frequencies
|
||||
float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
|
||||
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; // occlusion room effect level re. main control
|
||||
long lOutsideVolumeHF; // outside sound cone level at high frequencies
|
||||
float flAirAbsorptionFactor; // multiplies DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF
|
||||
unsigned long dwFlags; // modifies the behavior of properties
|
||||
} EAX20BUFFERPROPERTIES, *LPEAX20BUFFERPROPERTIES;
|
||||
|
||||
// Used by DSPROPERTY_EAX20BUFFER_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 EAX20BUFFERFLAGS_DIRECTHFAUTO 0x00000001 // affects DSPROPERTY_EAXBUFFER_DIRECTHF
|
||||
#define EAX20BUFFERFLAGS_ROOMAUTO 0x00000002 // affects DSPROPERTY_EAXBUFFER_ROOM
|
||||
#define EAX20BUFFERFLAGS_ROOMHFAUTO 0x00000004 // affects DSPROPERTY_EAXBUFFER_ROOMHF
|
||||
|
||||
#define EAX20BUFFERFLAGS_RESERVED 0xFFFFFFF8 // reserved future use
|
||||
|
||||
// property ranges and defaults:
|
||||
|
||||
#define EAX20BUFFER_MINDIRECT (-10000)
|
||||
#define EAX20BUFFER_MAXDIRECT 1000
|
||||
#define EAX20BUFFER_DEFAULTDIRECT 0
|
||||
|
||||
#define EAX20BUFFER_MINDIRECTHF (-10000)
|
||||
#define EAX20BUFFER_MAXDIRECTHF 0
|
||||
#define EAX20BUFFER_DEFAULTDIRECTHF 0
|
||||
|
||||
#define EAX20BUFFER_MINROOM (-10000)
|
||||
#define EAX20BUFFER_MAXROOM 1000
|
||||
#define EAX20BUFFER_DEFAULTROOM 0
|
||||
|
||||
#define EAX20BUFFER_MINROOMHF (-10000)
|
||||
#define EAX20BUFFER_MAXROOMHF 0
|
||||
#define EAX20BUFFER_DEFAULTROOMHF 0
|
||||
|
||||
#define EAX20BUFFER_MINROOMROLLOFFFACTOR 0.0f
|
||||
#define EAX20BUFFER_MAXROOMROLLOFFFACTOR 10.f
|
||||
#define EAX20BUFFER_DEFAULTROOMROLLOFFFACTOR 0.0f
|
||||
|
||||
#define EAX20BUFFER_MINOBSTRUCTION (-10000)
|
||||
#define EAX20BUFFER_MAXOBSTRUCTION 0
|
||||
#define EAX20BUFFER_DEFAULTOBSTRUCTION 0
|
||||
|
||||
#define EAX20BUFFER_MINOBSTRUCTIONLFRATIO 0.0f
|
||||
#define EAX20BUFFER_MAXOBSTRUCTIONLFRATIO 1.0f
|
||||
#define EAX20BUFFER_DEFAULTOBSTRUCTIONLFRATIO 0.0f
|
||||
|
||||
#define EAX20BUFFER_MINOCCLUSION (-10000)
|
||||
#define EAX20BUFFER_MAXOCCLUSION 0
|
||||
#define EAX20BUFFER_DEFAULTOCCLUSION 0
|
||||
|
||||
#define EAX20BUFFER_MINOCCLUSIONLFRATIO 0.0f
|
||||
#define EAX20BUFFER_MAXOCCLUSIONLFRATIO 1.0f
|
||||
#define EAX20BUFFER_DEFAULTOCCLUSIONLFRATIO 0.25f
|
||||
|
||||
#define EAX20BUFFER_MINOCCLUSIONROOMRATIO 0.0f
|
||||
#define EAX20BUFFER_MAXOCCLUSIONROOMRATIO 10.0f
|
||||
#define EAX20BUFFER_DEFAULTOCCLUSIONROOMRATIO 0.5f
|
||||
|
||||
#define EAX20BUFFER_MINOUTSIDEVOLUMEHF (-10000)
|
||||
#define EAX20BUFFER_MAXOUTSIDEVOLUMEHF 0
|
||||
#define EAX20BUFFER_DEFAULTOUTSIDEVOLUMEHF 0
|
||||
|
||||
#define EAX20BUFFER_MINAIRABSORPTIONFACTOR 0.0f
|
||||
#define EAX20BUFFER_MAXAIRABSORPTIONFACTOR 10.0f
|
||||
#define EAX20BUFFER_DEFAULTAIRABSORPTIONFACTOR 1.0f
|
||||
|
||||
#define EAX20BUFFER_DEFAULTFLAGS (EAX20BUFFERFLAGS_DIRECTHFAUTO | \
|
||||
EAX20BUFFERFLAGS_ROOMAUTO | \
|
||||
EAX20BUFFERFLAGS_ROOMHFAUTO)
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif
|
|
@ -1,547 +0,0 @@
|
|||
/*******************************************************************\
|
||||
* *
|
||||
* EAX.H - Environmental Audio Extensions version 3.0 *
|
||||
* for OpenAL and DirectSound3D *
|
||||
* *
|
||||
********************************************************************/
|
||||
|
||||
#ifndef EAX30_H_INCLUDED
|
||||
#define EAX30_H_INCLUDED
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
#ifndef OPENAL
|
||||
#include <dsound.h>
|
||||
|
||||
/*
|
||||
* 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 <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);
|
||||
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
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -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
|
||||
|
|
@ -1,171 +0,0 @@
|
|||
/*
|
||||
*/
|
||||
#ifndef __EAXMANH
|
||||
#define __EAXMANH
|
||||
|
||||
#define COM_NO_WINDOWS_H
|
||||
#include <objbase.h>
|
||||
#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
|
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
Versions/Current/Headers
|
|
@ -1 +0,0 @@
|
|||
Versions/Current/OpenAL
|
|
@ -1 +0,0 @@
|
|||
Versions/Current/Resources
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
Binary file not shown.
Binary file not shown.
|
@ -1,26 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>OpenAL</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>OpenAL</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>OpenAL</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>OpenAL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0.1d1</string>
|
||||
<key>CSResourcesFileMapped</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
|
@ -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)
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------
|
||||
----------------------------------------------------------------------------------------------------------------------
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PBXProjectSourcePath</key>
|
||||
<string>/Users/mmarks/Development/OpenAL/openal/macosx/al_osx.xcode</string>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1 +0,0 @@
|
|||
A
|
|
@ -5,7 +5,7 @@
|
|||
#define __EFXLIBH
|
||||
|
||||
#if ID_OPENAL_EAX
|
||||
#include "../openal/include/eax4.h"
|
||||
#include <eax4.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -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 <al.h>
|
||||
#include <alc.h>
|
||||
#include "../sys/win32/idal.h"
|
||||
// broken OpenAL SDK ?
|
||||
#define ID_ALCHAR (ALubyte *)
|
||||
|
|
|
@ -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 <dsound.h>
|
||||
|
||||
/*
|
||||
* 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
|
Binary file not shown.
Loading…
Reference in a new issue