diff options
Diffstat (limited to 'src/javax/media/j3d/SoundSchedulerAtom.java')
-rw-r--r-- | src/javax/media/j3d/SoundSchedulerAtom.java | 707 |
1 files changed, 0 insertions, 707 deletions
diff --git a/src/javax/media/j3d/SoundSchedulerAtom.java b/src/javax/media/j3d/SoundSchedulerAtom.java deleted file mode 100644 index 3be6637..0000000 --- a/src/javax/media/j3d/SoundSchedulerAtom.java +++ /dev/null @@ -1,707 +0,0 @@ -/* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code 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 General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - */ - -package javax.media.j3d; - - -/** - * A SoundSchedulerAtom is the smallest object representing a Sound within - * SoundScheduler. This class contains View-Depedent fields. Some of these - * fields may appear to over lap fields in the Sound Node classes, but - * remember that the Sound Node fields are universal, user-defined fields - * and do not take into account specific Audio Device view-dependent - * conditions. - */ - -class SoundSchedulerAtom extends Object { - - /** - * The mirror sound node component of this sound scheduler atom - */ - SoundRetained sound = null; - - /** - * MediaContainer currently loaded for this atom - */ - MediaContainer soundData = null; - - // Maintain continuously playing silent sound sources. - long startTime = 0; - long endTime = 0; - - long sampleLength = 0; - long loopStartOffset = 0; // for most this will be 0 - long loopLength = 0; // for most this is end sample - sampleLength - long attackLength = 0; // portion of sample before loop section - long releaseLength = 0; // portion of sample after loop section - - int loadStatus = SoundRetained.LOAD_NULL; - boolean playing = false; - int numberChannels = 0; - - /** - * Is this sound in an active scheduling region - */ - boolean activated = false; - - /** - * Switch for turning sound on or off while the sound is "active" - */ - static final int OFF = 0; - static final int ON = 1; - static final int PENDING_ON = 2; - static final int PENDING_OFF = 3; - int enabled = OFF; - - /** - * Switch for muting and unmuting sound while it is playing - */ - static final int UNMUTED = 0; - static final int MUTED = 1; - static final int PENDING_UNMUTE = 2; - static final int PENDING_MUTE = 3; - int muted = UNMUTED; - - /** - * Switch for pausing and unpausing sound while it is playing - */ - static final int UNPAUSED = 0; // or resumed - static final int PAUSED = 1; - static final int PENDING_UNPAUSE = 2; // or pending resume - static final int PENDING_PAUSE = 3; - int paused = UNPAUSED; - - - /** - * Pending action for this sound determined by the SoundScheduler - */ - static final int DO_NOTHING = 0; - static final int LEAVE_OFF = 1; - static final int LEAVE_SILENT = 2; - static final int LEAVE_AUDIBLE = 3; - static final int LEAVE_PAUSED = 4; - - static final int RESTART_AUDIBLE = 5; - static final int START_AUDIBLE = 6; - static final int RESTART_SILENT = 7; - static final int START_SILENT = 8; - - static final int MAKE_AUDIBLE = 11; - static final int MAKE_SILENT = 12; - static final int PAUSE_AUDIBLE = 13; - static final int PAUSE_SILENT = 14; - static final int RESUME_AUDIBLE = 15; - static final int RESUME_SILENT = 16; - static final int TURN_OFF = 17; - static final int UPDATE = 18; - static final int COMPLETE = 19; - int schedulingAction = DO_NOTHING; - - /** - * This status flag is used for sound scheduling - */ - static final int SOUND_OFF = 0; // The sound is not playing - static final int SOUND_AUDIBLE = 1; // The sound is potentially audible - static final int SOUND_SILENT = 2; // The sound is playing silently - static final int SOUND_PAUSED = 3; // The sound is playing silently - static final int SOUND_COMPLETE = 4; // The sound is finished playing - int status = SOUND_OFF; - - // Sound atoms have two dirty flags: attribsDirty for sound node fields - // and stateDirty for changes to sound state not reflected by sound fields. - // When the field/parameter associated with the dirty bit has been: - // passed to all SoundSchedulers to update sound rendering or 'run' state - // the bit for that field is cleared by the SoundStructure thread. - - /** - * attribsDirty bit field - * This bitmask is set when sound node attribute is changed by the user. - */ - int attribsDirty = 0x0000; - - /** - * stateDirty bit field - * This bitmask is set when scene graph state is changed. - */ - int stateDirty = 0x0000; - - // Load Sound Data Status maintained in SoundRetained class - - /** - * Identifiers of sample associated with sound source - */ - int sampleId = SoundRetained.NULL_SOUND; - - /** - * reference to Sound Scheduler this atom is associated with - */ - SoundScheduler soundScheduler = null; - - - /** - * Calculate absolute time at which sample completes - * Checks playing flag denoting if sound is started already or not: - * false - calcalutes endTime in relation to startTime - * true - re-calculates endTime based on current position in - * loop portion of sample plus release length - */ - synchronized void calculateEndTime() { - SoundRetained sgSound = sound.sgSound; - int loops = sgSound.loopCount; - if (debugFlag) - debugPrint("calculateEndTime: loop count = " + loops); - // test lengths for <= 0; this includes DURATION_UNKNOWN - if ( (sampleLength <= 0 || loopLength <= 0 || loops < 0 ) -// QUESTION: removed? but what was this trying to avoid -// changing endTime when that is already set? -// but what happens when user changes LoopCount AFTER -// sound is started - should be able to do this -// && (enabled == OFF || enabled == PENDING_OFF) - ) { - endTime = -1; - if (debugFlag) - debugPrint("calculateEndTime: set to -1"); - } - else { -// QUESTION: if "&& playing" is in above test; won't we have to test for -// length unknown and loop = -1?? - if (playing && (startTime > 0)) { - endTime = startTime + attackLength + - (loopLength * (loops+1)) + releaseLength; if (debugFlag) - debugPrint("calculateEndTime: isPlaying so = " + endTime); } - else { - // Called when release flag is true - // Determine where within the loop portion sample the - // sound is currently playing, then set endTime to - // play remaining portion of loop portion plus the - // release portion. - long currentTime = J3dClock.currentTimeMillis(); - endTime = currentTime + ( (loopLength - - ((currentTime - startTime - attackLength) % loopLength)) + - releaseLength ); - if (debugFlag) - debugPrint("calculateEndTime: NOT Playing so = " + endTime); - } - } - } - - - void enable(boolean enabled) { - if (enabled) { - setEnableState(PENDING_ON); - if (debugFlag) - debugPrint(" enableSound calls soundAtom " + - this + " setEnableState PENDING_ON"); - } - else { - setEnableState(PENDING_OFF); - if (debugFlag) - debugPrint(" enableSound calls soundAtom " + - this + " setEnableState PENDING_OFF"); - } - } - - - void mute(boolean muted) { - if (muted) { - setMuteState(PENDING_MUTE); - if (debugFlag) - debugPrint(" muteSound() calls soundAtom " + - this + " setMuteState PENDING_ON"); - } - else { - setMuteState(PENDING_UNMUTE); - if (debugFlag) - debugPrint(" muteSound() calls soundAtom " + - this + " setMuteState PENDING_UNMUTE"); - } - } - - void pause(boolean paused) { - if (paused) { - setPauseState(PENDING_PAUSE); - if (debugFlag) - debugPrint(this + ".pause calls setPauseState(PENDING_PAUSE)"); - } - else { - setPauseState(PENDING_UNPAUSE); - if (debugFlag) - debugPrint(this +".pause calls setPauseState(PENDING_UNPAUSE)"); - } - } - - -// XXXX: remove this -// just set the state after debug no longer needed - void setEnableState(int state) { - enabled = state; - switch (state) { - case PENDING_ON: - if (debugFlag) - debugPrint("set enabled to PENDING_ON"); - break; - case ON: - if (debugFlag) - debugPrint("set enabled to ON"); - break; - case PENDING_OFF: - if (debugFlag) - debugPrint("set enabled to PENDING_OFF"); - break; - case OFF: - if (debugFlag) - debugPrint("set enabled to OFF"); - break; - default: - if (debugFlag) - debugPrint("state = " + state); - break; - } - } - -// XXXX: remove this -// just set the state after debug no longer needed - void setMuteState(int state) { - muted = state; - switch (state) { - case PENDING_MUTE: - if (debugFlag) - debugPrint("set mute to PENDING_MUTE"); - break; - case MUTED: - if (debugFlag) - debugPrint("set mute to MUTE"); - break; - case PENDING_UNMUTE: - if (debugFlag) - debugPrint("set mute to PENDING_UNMUTE"); - break; - case UNMUTED: - if (debugFlag) - debugPrint("set mute to UNMUTE"); - break; - default: - if (debugFlag) - debugPrint("state = " + state); - break; - } - } - -// XXXX: remove this -// just set the state after debug no longer needed - void setPauseState(int state) { - paused = state; - switch (state) { - case PENDING_PAUSE: - if (debugFlag) - debugPrint("set pause to PENDING_PAUSE"); - break; - case PAUSED: - if (debugFlag) - debugPrint("set pause to PAUSE"); - break; - case PENDING_UNPAUSE: - if (debugFlag) - debugPrint("set pause to PENDING_UNPAUSE"); - break; - case UNPAUSED: - if (debugFlag) - debugPrint("set pause to UNPAUSE"); - break; - default: - if (debugFlag) - debugPrint("state = " + state); - break; - } - } - - - /** - * calcActiveSchedAction() - * Calculate Sound Scheduler Action for Active sound (it's region - * intersects the viewPlatform). - * - * A big switch testing various SoundRetained fields to determine - * what SoundScheduler action to perform when sound is Active - * set sound active flag true - * switch on enable value, to set pending scheduling action - * depending on continuous and release flags and sound status - */ - synchronized int calcActiveSchedAction() { - SoundRetained sgSound = sound.sgSound; - int action = DO_NOTHING; - activated = true; - switch (enabled) { - case PENDING_ON: - setEnableState(ON); - if (debugFlag) - debugPrint(" calcActiveSchedAction: PENDING_ON"); - if (status == SOUND_OFF || - status == SOUND_PAUSED) - action = START_AUDIBLE; - else - action = RESTART_AUDIBLE; - break; - case ON: - if (debugFlag) - debugPrint(" calcActiveSchedAction: ON"); - if (status == SOUND_OFF) - // should NOT see this, but if we do... - action = START_AUDIBLE; - else if (status == SOUND_SILENT) - action = MAKE_AUDIBLE; - else // status == SOUND_AUDIBLE - action = LEAVE_AUDIBLE; - break; - case PENDING_OFF: - setEnableState(OFF); - if (debugFlag) - debugPrint("enable = " + enabled + - "enabled set to OFF"); - // fail thru - case OFF: - // QUESTION: Why would enable status ever be OFF yet - // status SOUND_AUDIBLE or _SILENT? - if (status == SOUND_AUDIBLE) { - if (sgSound.release) { - if (debugFlag) - debugPrint("enable = " + enabled + - ", AUDIBLE, released, " + - "action <- LEAVE_AUDIBLE"); - if (enabled == PENDING_OFF) { - // re-calculate EndTime - calculateEndTime(); - } - action = LEAVE_AUDIBLE; - } - else { - if (debugFlag) - debugPrint("enable = " + enabled + - ", AUDIBLE, not released, "+ - "action <- TURN_OFF"); - action = TURN_OFF; - } - } - else if (status == SOUND_SILENT) { - if (sgSound.release) { - if (debugFlag) - debugPrint("enable = " + enabled + - ", SILENT, released, " + - "action <- MAKE_AUDIBLE"); - // re-calculate EndTime - calculateEndTime(); - action = MAKE_AUDIBLE; - } - else { - if (debugFlag) - debugPrint("enable = " + enabled + - ", SILENT, not released, " + - "action <- TURN_OFF"); - action = TURN_OFF; - } - } - else { // status == SOUND_OFF - action = LEAVE_OFF; - } - break; - } // switch on enabled flag - - // if sounds pause state is PENDING_PAUSE modify action to perform. - if (paused == PENDING_PAUSE) { - // if this pause state is set to PAUSE then assume the sound is - // already paused, so any incoming action that leave the state - // as it already is, leaves the sound paused. - if (debugFlag) - debugPrint(" PENDING_PAUSE"); - switch (action) { - case MAKE_AUDIBLE: - case LEAVE_AUDIBLE: - case RESUME_AUDIBLE: - action = PAUSE_AUDIBLE; - break; - case MAKE_SILENT: - case LEAVE_SILENT: - case RESUME_SILENT: - action = PAUSE_SILENT; - break; - default: - // don't change action for any other cases - break; - } - } - // if sounds pause state is PENDING_UNPAUSE modify action - else if (paused == PENDING_UNPAUSE) { - debugPrint(" PENDING_UNPAUSE"); - switch (action) { - // When restart (audible or silent) pause flag is checked and - // explicitly set in SoundScheduler - case MAKE_AUDIBLE: - case LEAVE_AUDIBLE: - case PAUSE_AUDIBLE: - action = RESUME_AUDIBLE; - break; - case MAKE_SILENT: - case LEAVE_SILENT: - case PAUSE_SILENT: - action = RESUME_SILENT; - break; - default: - // don't change action for any other cases - break; - } - } - return(action); - } // end of calcActiveSchedAction - - - /** - * calcInactiveSchedAction() - * Calculate Sound Scheduler action for Inactive sound - * - * A big switch testing various SoundRetained fields to determine - * what SoundScheduler action to perform when sound is inactive. - * set sound active flag false - * switch on enable value, to set pending scheduling action - * depending on continuous and release flags and sound status - */ - synchronized int calcInactiveSchedAction() { - int action = DO_NOTHING; - SoundRetained sgSound = sound.sgSound; - - // Sound is Inactive - // Generally, sound is OFF unless continuous flag true - // then sound is silently playing if on. - activated = false; - - switch (enabled) { - case PENDING_ON: - if (debugFlag) - debugPrint(" calcInactiveSchedAction: PENDING_ON "); - setEnableState(ON); - if (sgSound.continuous) { - if (status == SOUND_OFF) - action = START_SILENT; - else // status == SOUND_AUDIBLE or SOUND_SILENT - action = RESTART_SILENT; - } - else { // sound is not continuous - if (status == SOUND_OFF) - action = LEAVE_OFF; - else // status == SOUND_SILENT || SOUND_AUDIBLE - action = TURN_OFF; - } - break; - case ON: - if (debugFlag) - debugPrint(" calcInactiveSchedActio: ON "); - if (sgSound.continuous) { - if (status == SOUND_AUDIBLE) - action = MAKE_SILENT; - else if (status == SOUND_OFF) - action = START_SILENT; - else // status == SOUND_SILENT - action = LEAVE_SILENT; - } - else { // sound is not continuous - // nothing to do if already off - if (status == SOUND_OFF) - action = LEAVE_OFF; - else // status == SOUND_SILENT or SOUND_AUDIBLE - action = TURN_OFF; - } - break; - case PENDING_OFF: - setEnableState(OFF); - if (debugFlag) - debugPrint("Enable = " + enabled + - "enabled set to OFF"); - // fall thru - - case OFF: - if (sgSound.release && sgSound.continuous) { - if (enabled == PENDING_OFF) { - // re-calculate EndTime - calculateEndTime(); - } - if (status == SOUND_AUDIBLE) { - if (debugFlag) - debugPrint("Enable = " + enabled + - ", AUDIBLE, released & continuous - " + - "action <- MAKE_SILENT"); - action = MAKE_SILENT; - } - else if (status == SOUND_SILENT) { - if (debugFlag) - debugPrint("Enable = " + enabled + - ", SILENT, released & continuous - " + - "action <- TURN_OFF"); - action = LEAVE_SILENT; - } - else { - if (debugFlag) - debugPrint("Enable = " + enabled + - ", already OFF, action <- LEAVE_OFF"); - action = LEAVE_OFF; - } - } - else { // continuous and release flag not both true - if (status == SOUND_OFF) { - if (debugFlag) - debugPrint("Enable = " + enabled + - ", already OFF, action <- LEAVE_OFF"); - action = LEAVE_OFF; - } - else { - if (debugFlag) - debugPrint("Enable = " + enabled + - ", not already OFF, action <- TURN_OFF"); - action = TURN_OFF; - } - } - break; - default: - break; - } // switch - - // if sounds pause state is PENDING_PAUSE modify action to perform. - if (paused == PENDING_PAUSE) { - // if this pause state is set to PAUSE then assume the sound is - // already paused, so any incoming action that leave the state - // as it already is, leaves the sound paused. - switch (action) { - case MAKE_SILENT: - case LEAVE_SILENT: - case RESUME_SILENT: - action = PAUSE_SILENT; - break; - default: - // don't change action for any other cases - break; - } - } - // if sounds pause state is PENDING_UNPAUSE modify action - else if (paused == PENDING_UNPAUSE) { - switch (action) { - case LEAVE_SILENT: - action = RESUME_SILENT; - break; - default: - // don't change action for any other cases - break; - } - } - return (action); - } // end of calcInactiveSchedAction - -// XXXX: isPLaying -// XXXX: setLoadingState - - // Debug print mechanism for Sound nodes - static final boolean debugFlag = false; - static final boolean internalErrors = false; - - void debugPrint(String message) { - if (debugFlag) { - System.err.println(message); - } - } - - - /** - * Set bit(s) in soundDirty field - * @param binary flag denotes bits to set ON - */ - void setAttribsDirtyFlag(int bitFlag) { - attribsDirty |= bitFlag; - if (debugFlag) - debugPrint("setAttribsDirtyFlag = " + bitFlag); - return ; - } - void setStateDirtyFlag(int bitFlag) { - stateDirty |= bitFlag; - if (debugFlag) - debugPrint("setStateDirtyFlag = " + bitFlag); - return ; - } - - /** - * Clear sound's dirty flag bit value. - * @param binary flag denotes bits to set OFF - */ - void clearAttribsDirtyFlag(int bitFlag) { - if (debugFlag) - debugPrint("clearAttribsDirtyFlag = " + bitFlag); - attribsDirty &= ~bitFlag; - return ; - } - void clearAttribsDirtyFlag() { - // clear all bits - if (debugFlag) - debugPrint("clearAttribsDirtyFlag = ALL"); - attribsDirty = 0x0; - return ; - } - void clearStateDirtyFlag(int bitFlag) { - if (debugFlag) - debugPrint("clearStateDirtyFlag = " + bitFlag); - stateDirty &= ~bitFlag; - return ; - } - void clearStateDirtyFlag() { - if (debugFlag) - debugPrint("clearStateDirtyFlag = ALL"); - stateDirty = 0x0; - return ; - } - - - /** - * Test sound's dirty flag bit(s) - * @param field denotes which bitmask to set into - * @param binary flag denotes bits to set Test - * @return true if bit(s) in bitFlag are set dirty (on) - */ - boolean testDirtyFlag(int field, int bitFlag) { - if ((field & bitFlag) > 0) - return true; - else - return false; - } - - /** - * Test sound's dirty flags for ANY bits on - * @return true if any bit in bitFlag is flipped on - */ - boolean testDirtyFlags() { - if ((attribsDirty & 0xFFFF) > 0) - return true; - else if ((stateDirty & 0xFFFF) > 0) - return true; - else - return false; - } - -} |