Hi Jimmy,
Have you try v1.2beta1 ? This version fix the problem.
Please try the program in the attachment which is modified
from SimpleSound.
Note that using canvas.stopView() will stop the sound
scheduler but using canvas.stopRenderer() will not.
If you have a test program that don't work for v1.2 beta1,
please send to us.
Thanks.
- Kelvin
---------
Java3D Team
Sun Microsystems Inc.
>X-Unix-From: [EMAIL PROTECTED] Fri Jan 28 05:03:44 2000
>X-Sender: [EMAIL PROTECTED]
>MIME-Version: 1.0
>Date: Thu, 27 Jan 2000 20:53:28 -0500
>From: Jimmy Talbot <[EMAIL PROTECTED]>
>Subject: [JAVA3D] stop the renderer, but keep background sound playing
>To: [EMAIL PROTECTED]
>
>Hi,
>
>In my application I want to periodically stop the renderer to use my cpu
>cycles somewhere else. However, I'd like to keep a background sound
>playing; right now (as far as I know), if I stop the renderer, the
>background sound stops playing. Is there any way around that?
>
>Thanks
>
>Jimmy
>
>===========================================================================
>To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>of the message "signoff JAVA3D-INTEREST". For general help, send email to
>[EMAIL PROTECTED] and include in the body of the message "help".
/*
* %Z%%M% %I% %E% %U%
*
* Copyright (c) 1996-1999 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
import java.applet.Applet;
import java.net.URL;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import java.io.File;
import java.security.*;
import javax.media.j3d.*;
import javax.vecmath.*;
/*
* This Java3D program:
* Creates an instance of the JavaSoundMixer AudioDevice, initializing it
* and attaching it to the PhysicalEnvironment by using
* SimpleUniverse.
* Creates one uncached Background and two cached Point sound sources.
* Creates and executes a custom behavior (SimpleSoundsBehavior) that
* starts the sound playing and transforms the PointSound source
* by modifying the TransformGroup that contains the Sound nodes.
*
* IMPORTANT NOTE:
* Because of a "feature" of java.security the current directory
* can not longer be determined using File(".") call.
* Furthermore, for this program to work using appletviewer the
* 'path' directory MUST be a directory LOCAL to you machine.
* Trying to access a remote directory (such as /net/java3d/export/java3d...
* give a security access exception.
* See comments below.
*
* Usage:
* java SimpleSounds [URLpath [name1 [name2 [name2]]]]
*
* The first optional command line parameter is the URL path to directory
* containing "file:" or "http:" and then directory path string.
* If you are using the suppled default sound files in the same directory
* as this test program then only the URLpath need be supplied on the
* command line.
* If this parameter is not included then the current path to the directory
* this program is running in is used.
* The second thru fourth optional command line parameters are sound file names
* If not given, the default file names are:
* techno_machine.au
* hello_universe.au
* roar.au
* that correspond to the 3 'voice' quality, 8-bit, u-law, 8-kHz samples
* included in the same directory as this test program.
*
* Java Sound engine has been advertised to support the following 8- and 16-
* bit, linear and u-law, mono and stereo sound sample file formats: AU,
* AIFF, WAV, and PCM. Non-cached MIDI and RMF files are also supported.
* Neither compressed formats (DVI, GSM, MOD) nor A-law formated files are
* supported at this time.
*/
public class SimpleSounds extends Applet {
// File name of sound sample
private static int filenamesGiven = 0;
private static URL[] url = new URL[3];
private static String[] filename = new String[3];
private static String path = null;
private static boolean filenamesSet = false;
private Canvas3D c;
public BranchGroup createSceneGraph() {
// Create the root of the subgraph
BranchGroup objRoot = new BranchGroup();
// Create the transform group node and initialize it to the identity.
// Enable the TRANSFORM_WRITE capability so that our behavior code
// can modify it at runtime. Add it to the root of the subgraph.
TransformGroup objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRoot.addChild(objTrans);
// Create a simple shape leaf node and add it into the scene graph.
objTrans.addChild(new ColorCube(0.4));
// Create a new Behavior object that will perform the desired
// operation on the specified transform object and add it into the
// scene graph.
Transform3D yAxis = new Transform3D();
Alpha rotation = new Alpha(-1, Alpha.INCREASING_ENABLE,
0, 0,
20000, 0, 0,
0, 0, 0);
RotationInterpolator rotator =
new RotationInterpolator(rotation,
objTrans, yAxis,
0.0f, (float) Math.PI*2.0f);
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
rotator.setSchedulingBounds(bounds);
objTrans.addChild(rotator);
/*
* Create a sound node and add it to the scene graph
*/
BackgroundSound sound1 = new BackgroundSound();
PointSound sound2 = new PointSound();
PointSound sound3 = new PointSound();
sound1.setCapability(PointSound.ALLOW_ENABLE_WRITE);
sound1.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
sound1.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
sound1.setCapability(PointSound.ALLOW_SCHEDULING_BOUNDS_WRITE);
sound1.setCapability(PointSound.ALLOW_CONT_PLAY_WRITE);
sound1.setCapability(PointSound.ALLOW_RELEASE_WRITE);
sound1.setCapability(PointSound.ALLOW_DURATION_READ);
sound1.setCapability(PointSound.ALLOW_IS_PLAYING_READ);
sound1.setCapability(PointSound.ALLOW_LOOP_WRITE);
sound2.setCapability(PointSound.ALLOW_ENABLE_WRITE);
sound2.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
sound2.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
sound2.setCapability(PointSound.ALLOW_SCHEDULING_BOUNDS_WRITE);
sound2.setCapability(PointSound.ALLOW_CONT_PLAY_WRITE);
sound2.setCapability(PointSound.ALLOW_RELEASE_WRITE);
sound2.setCapability(PointSound.ALLOW_DURATION_READ);
sound2.setCapability(PointSound.ALLOW_IS_PLAYING_READ);
sound2.setCapability(PointSound.ALLOW_POSITION_WRITE);
sound2.setCapability(PointSound.ALLOW_LOOP_WRITE);
sound3.setCapability(PointSound.ALLOW_ENABLE_WRITE);
sound3.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
sound3.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
sound3.setCapability(PointSound.ALLOW_SCHEDULING_BOUNDS_WRITE);
sound3.setCapability(PointSound.ALLOW_CONT_PLAY_WRITE);
sound3.setCapability(PointSound.ALLOW_RELEASE_WRITE);
sound3.setCapability(PointSound.ALLOW_DURATION_READ);
sound3.setCapability(PointSound.ALLOW_IS_PLAYING_READ);
sound3.setCapability(PointSound.ALLOW_POSITION_WRITE);
BoundingSphere soundBounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
sound1.setSchedulingBounds(soundBounds);
sound2.setSchedulingBounds(soundBounds);
sound3.setSchedulingBounds(soundBounds);
objTrans.addChild(sound1);
objTrans.addChild(sound2);
objTrans.addChild(sound3);
/*
* Create a new Behavior object that will play the sound
*/
SimpleSoundsBehavior player = new SimpleSoundsBehavior(
sound1, sound2, sound3,
url[0], url[1], url[2], soundBounds);
player.setSchedulingBounds(soundBounds);
objTrans.addChild(player);
// Let Java 3D perform optimizations on this scene graph.
objRoot.compile();
return objRoot;
}
public SimpleSounds() {
if (!filenamesSet) {
/*
* append given file name to given URL path
*/
// path is null if started from appletviewer/browser the first time
// or no sound files were specified on command line.
/*
* and put into 'path' that contains URL-friendly "file:"
* a null path shouldn't happen, but incase 'path' left NULL
*/
if (path != null) {
path = "file:" + path;
}
else { // no parameters were given, or running in appletviewer
// The path is assumed to be current directory
path = "file:.";
/**
** Important note about path string:
**
** At least for the time being, if this is to be run under
** the Appletviewer, the path should point to a LOCAL directory
** Otherwise an AccessControlException: access denied (due to
** FilePermission) will be thrown.
**/
}
int j;
for (j=0; j<filenamesGiven; j++)
filename[j] = new String(path + File.separator + filename[j]);
/*
* fill in default file names if all three not given
*/
for (int i=j; i<3; i++) {
if (i == 0)
filename[0] = new String(path + File.separator +
"techno_machine.au");
if (i == 1)
filename[1] = new String(path + File.separator +
"hello_universe.au");
if (i == 2)
filename[2] = new String(path + File.separator + "roar.au");
}
filenamesSet = true;
}
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
c = new Canvas3D(config);
add("Center", c);
/*
* Change filenames into URLs
*/
for (int i=0; i<3; i++) {
try {
url[i] = new URL(filename[i]);
}
catch (Exception e) {
// Local directory can no longer be retrieved by doing a
// File(".") due to security feature of JDK 1.2 .
System.out.println(
"Path to sounds MUST be changed to reference local files");
return;
}
}
/*
* Create a simple scene and attach it to the virtual universe
*/
SimpleUniverse u = new SimpleUniverse(c);
AudioDevice audioDev = u.getViewer().createAudioDevice();
BranchGroup scene = createSceneGraph();
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void stopRenderer() {
c.stopRenderer();
}
/*
* The following allows SimpleSounds to be run as an application
* as well as an applet
*/
public static void main(String[] args) {
if (args.length > 0)
path = args[0];
for (int i=0; i<3; i++) {
if (args.length > (i+1)) {
filename[i] = args[i+1];
if (filename[i] != null) {
filenamesGiven++ ;
}
}
else
break;
}
SimpleSounds test = new SimpleSounds();
new MainFrame(test, args, 256, 256);
try {
Thread.sleep(10000);
} catch (InterruptedException e){}
test.stopRenderer();
}
}