001: /*
002: * $RCSfile: AuralParameters.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.4 $
041: * $Date: 2007/02/09 17:20:02 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.audioengines;
046:
047: import javax.media.j3d.*;
048: import javax.vecmath.*;
049:
050: /**
051: * The AuralParameters Class defines a set of fields that define the
052: * Aural listening environment. Many of the parameters correspond to
053: * AuralAttribute fields.
054: *
055: * <p>
056: * Error checking on all parameters passed to these methods is already
057: * explicitly being done by the Java 3D core code that calls these methods.
058: */
059:
060: public class AuralParameters {
061: // Speed of Sound in meters/milliseconds
062: public static final float SPEED_OF_SOUND = 0.344f;
063: public static final int NO_FILTERING = -1;
064:
065: public float rolloff = 1.0f;
066: public float reflectionCoefficient = 0.0f;
067: public float reverbDelay = 40.0f;
068: public int reverbOrder = 0;
069: public float frequencyScaleFactor = 1.0f;
070: public float velocityScaleFactor = 0.0f;
071: int filterType = NO_FILTERING;
072: double[] filterDistance = null;
073: float[] filterCutoff = null;
074:
075: /*
076: * @since Java 3D 1.3
077: */
078: public float reverbCoefficient = 1.0f;
079: public float reflectionDelay = 20.0f;
080: public float decayTime = 1000.0f;
081: public float decayFrequencyCutoff = 5000.0f;
082: public float diffusion = 1.0f; // 100%
083: public float density = 1.0f; // 100%
084:
085: /**
086: * Construct a new AuralParameters object
087: */
088: public AuralParameters() {
089: frequencyScaleFactor = 1.0f;
090: velocityScaleFactor = 0.0f;
091: rolloff = 1.0f;
092: reflectionCoefficient = 0.0f;
093: reflectionDelay = 20.0f;
094: reverbCoefficient = 1.0f;
095: reverbDelay = 40.0f;
096: reverbOrder = 0;
097: filterType = NO_FILTERING;
098: filterDistance = new double[2]; // start out with array of two
099: filterCutoff = new float[2]; // start out with array of two
100: decayTime = 1000.0f;
101: decayFrequencyCutoff = 5000.0f;
102: diffusion = 1.0f; // 100%
103: density = 1.0f; // 100%
104: }
105:
106: public void setDistanceFilter(int filterType, double[] distance,
107: float[] filterCutoff) {
108: boolean error = false;
109: boolean allocate = false;
110: int attenuationLength = 0;
111: if (distance == null || filterCutoff == null) {
112: error = true;
113: } else {
114: attenuationLength = distance.length;
115: if (attenuationLength == 0 || filterType == NO_FILTERING) {
116: error = true;
117: }
118: }
119: if (error) {
120: this .filterType = NO_FILTERING;
121: this .filterDistance = null;
122: this .filterCutoff = null;
123: if (debugFlag)
124: debugPrint("setDistanceFilter NO_FILTERING");
125: return;
126: }
127: this .filterType = filterType;
128: if (debugFlag)
129: debugPrint("setDistanceFilter type = " + filterType);
130: if ((filterDistance == null) || (filterCutoff == null)) {
131: allocate = true;
132: } else if (attenuationLength > filterDistance.length) {
133: allocate = true;
134: }
135: if (allocate) {
136: if (debugFlag)
137: debugPrint("setDistanceFilter length = "
138: + attenuationLength);
139: this .filterDistance = new double[attenuationLength];
140: this .filterCutoff = new float[attenuationLength];
141: }
142: System.arraycopy(distance, 0, this .filterDistance, 0,
143: attenuationLength);
144: System.arraycopy(filterCutoff, 0, this .filterCutoff, 0,
145: attenuationLength);
146:
147: if (debugFlag) {
148: debugPrint("setDistanceFilter arrays = ");
149: for (int i = 0; i < attenuationLength; i++)
150: debugPrint(this .filterDistance[i] + ","
151: + this .filterCutoff[i]);
152: debugPrint("setDistanceFilter passed in = ");
153: for (int i = 0; i < attenuationLength; i++)
154: debugPrint((float) (filterDistance[i]) + ","
155: + filterCutoff[i]);
156: }
157: return;
158: }
159:
160: public int getDistanceFilterLength() {
161: if (filterDistance != null)
162: return filterDistance.length;
163: return 0;
164: }
165:
166: public int getDistanceFilterType() {
167: return filterType;
168: }
169:
170: public void getDistanceFilter(double[] distance,
171: float[] filterCutoff) {
172: if (distance == null || filterCutoff == null)
173: return;
174: int attenuationLength = distance.length;
175: if (attenuationLength == 0 || (filterDistance == null)
176: || (filterCutoff == null))
177: return;
178: if (attenuationLength > filterDistance.length)
179: attenuationLength = filterDistance.length;
180: System.arraycopy(this .filterDistance, 0, distance, 0,
181: attenuationLength);
182: System.arraycopy(this .filterCutoff, 0, filterCutoff, 0,
183: attenuationLength);
184: return;
185: }
186:
187: // Debug print flags
188: static final boolean debugFlag = false;
189: static final boolean internalErrors = false;
190:
191: /**
192: * Debug print method for Sound nodes
193: */
194: protected void debugPrint(String message) {
195: if (debugFlag)
196: System.out.println(message);
197: }
198:
199: }
|