JOAL - sound does not want to ''move''

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

JOAL - sound does not want to ''move''

Jangi2
Hello,
I am using JOAL in a university project to insert sound.
I want to prepare a little test program to learn JOAL.
I have a very simple model that uses change listeners (from Swing) to notify a change. Then I have a small controller that handles sound control acording to the model.
And I have the main class that implements the app controller which shall modify the model acording to certain key pressed.

So, to sum up: the user hit a key to move the sound in the 3D audio environment. The app controller modifies the model in consequence. The model notifies the sound controller described above, to move it acording to these changes.

But, there is a problem... The sound denies to move and to update its position.
I am really blocked on this problem...
Can someone help me please?
You will find all my code below.
Bee is the model. SoundingBee is the small controller for the sound rendering of the model. Test is the main class.

Huge thank in advance.
Regards.



CODE:

-- class Bee

package test;

import java.awt.event.*;
import javax.swing.event.*;

/**
 * A Bee is represented by its position in a 3D space...
*/

public class Bee {
  // ATTRIBUTS
 
  private int x;
  private int y;
  private int z;
  private final EventListenerList listeners;
 
  // CONSTRUCTEURS
 
  public Bee() {
    this(0, 0, 0);
  }
 
  public Bee(int x, int y, int z) {
    this.x = x;
    this.y = y;
    this.z = z;
    listeners = new EventListenerList();
  }
 
  // REQUETES
 
  public int getX() {
    return x;
  }
 
  public int getY() {
    return y;
  }
 
  public int getZ() {
    return z;
  }
 
  @Override
  public String toString() {
    return "(" + x + "," + y + "," + z + ")";
  }
 
  // COMMANDES
 
  public void moveLeft() {
    --x;
    fireStateChanged();
  }
 
  public void moveRight() {
    ++x;
    fireStateChanged();    
  }
 
  public void moveBackward() {
    --z;
    fireStateChanged();
  }
 
  public void moveForward() {
    ++z;
    fireStateChanged();
  }
 
  public void moveDown() {
    --y;
    fireStateChanged();
  }
 
  public void moveUp() {
    ++y;
    fireStateChanged();
  }
 
  public void addChangeListener(ChangeListener l) {
    if (l == null) {
      throw new AssertionError();
    }
    listeners.add(ChangeListener.class, l);
  }
 
  public void removeChangeListener(ChangeListener l) {
    if (l == null) {
      throw new AssertionError();
    }
    listeners.remove(ChangeListener.class, l);
  }
 
  // OUTILS
 
  private void fireStateChanged() {
    for (ChangeListener l : listeners.getListeners(ChangeListener.class)) {
      l.stateChanged(new ChangeEvent(this));
    }
  }
}


-- class SoundingBee

package test;

import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;

import com.jogamp.openal.*;
import com.jogamp.openal.util.*;
import com.jogamp.openal.sound3d.*;

import java.io.IOException;

public class SoundingBee extends JComponent {
  // CONSTANTES
 
  private static final float SCALE_FACTOR = 1 / 10;
 
  // ATTRIBUTS
 
  private Bee model;
  private final Source sound;
  private ChangeListener changeListener;
 
  // CONSTRUCTEURS
 
  public SoundingBee(Bee m, String soundPath) throws IOException, UnsupportedAudioFileException {
    if (m == null) {
      throw new AssertionError();
    }
    model = m;
    sound = AudioSystem3D.loadSource(soundPath);
    changeListener = new ChangeListener() {
      public void stateChanged(ChangeEvent e) {
        update();
      }
    };
    model.addChangeListener(changeListener);
    sound.setLooping(true);
    update();
  }
 
  @Override
  public String toString() {
    Vec3f p = sound.getPosition();
    return ("(" + p.v1 + "," + p.v2 + "," + p.v3 + ")");
  }
 
  // OUTILS
 
  private void update() {
    sound.setPosition((float) model.getX() * SCALE_FACTOR, (float) model.getY() * SCALE_FACTOR, (float) model.getZ() * SCALE_FACTOR);
  }
 
  protected void begin() {
    if (!sound.isPlaying()) {
      sound.play();
    }
  }
 
  @Override
  protected void finalize() throws Throwable {
    sound.stop();
    sound.delete();
    super.finalize();
  }
}


-- class Test

package test;

import com.jogamp.openal.*;
import com.jogamp.openal.sound3d.*;
import com.jogamp.openal.util.*;

import java.io.*;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public final class Test {  
  // ATTRIBUTS
  private final String sound = "./sounds/bee.wav";
  private Bee model;
  private SoundingBee bee;
  private JFrame frame;
 
  // CONSTRUCTEURS
  private Test() throws IOException, UnsupportedAudioFileException {
    model = new Bee();
    createView();
    createController();
  }
 
  // COMMANDES
 
  public void test() throws IOException, UnsupportedAudioFileException {
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.requestFocusInWindow();
   
    initAudioEnvironment();
    try {
      bee = new SoundingBee(model, sound);
    } catch (IOException e) {
    } catch (UnsupportedAudioFileException e) {
    }
    bee.begin();
  }
 
  // OUTILS
 
  private void initAudioEnvironment() {
    ALut.alutInit();
    AudioSystem3D.init();
  }
 
  private static void releaseAudioEnvironment() {
    ALut.alutExit();
  }
 
  private void createView() {
    frame = new JFrame("Abeille");
    frame.setPreferredSize(new Dimension(300, 300));
  }
 
  private void createController() {
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        releaseAudioEnvironment();
      }
      public void windowLostFocus(WindowEvent e) {
        frame.requestFocusInWindow();
      }
    });
    frame.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
          switch (e.getKeyCode()) {
            case (KeyEvent.VK_UP) :
              model.moveForward();
              System.out.println(e.getKeyCode() + " : " + model.toString() + " / " + bee.toString());
              break;
            case (KeyEvent.VK_DOWN) :
              model.moveBackward();
              break;
            case (KeyEvent.VK_LEFT) :
              model.moveLeft();
              break;
            case (KeyEvent.VK_RIGHT) :
              model.moveRight();
              break;
              case (KeyEvent.VK_HOME) :
              model.moveUp();
              break;
            case (KeyEvent.VK_END) :
              model.moveDown();
              break;
            default :
              break;
          }
        }
    });
  }
 
  // POINT D'ENTREE
 
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        try {
          new Test().test();
        } catch (IOException e) {
          releaseAudioEnvironment();
        } catch (UnsupportedAudioFileException e) {
          releaseAudioEnvironment();
        }
      }
    });
  }
}
Reply | Threaded
Open this post in threaded view
|

Re: JOAL - sound does not want to ''move''

gouessej
Administrator
Hi

Why not looking at the implementation of the spatial sound in Paul Lamb sound library? It has a JOAL plugin. If you succeed in understanding how it works, you will be able to implement the same behaviour in your own code without this library. Please don't post comments in French, only a very few people understand our mother tongue...
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: JOAL - sound does not want to ''move''

Jangi2
OK thanks for your response, but the goal is to use the object-oriented interface of JOAL, built on-top of OpenAL binding.
Because actually, Paul Lamb do the same thing: he implements an object-oriented interface using the OpenAL binding.
So my code shall works, does it?

Regards.

Le 15/03/2016 17:47, gouessej [via jogamp] a écrit :
Hi

Why not looking at the implementation of the spatial sound in Paul Lamb sound library? It has a JOAL plugin. If you succeed in understanding how it works, you will be able to implement the same behaviour in your own code without this library. Please don't post comments in French, only a very few people understand our mother tongue...


If you reply to this email, your message will be added to the discussion below:
http://forum.jogamp.org/JOAL-sound-does-not-want-to-move-tp4036491p4036493.html
To unsubscribe from JOAL - sound does not want to ''move'', click here.
NAML

Reply | Threaded
Open this post in threaded view
|

Re: JOAL - sound does not want to ''move''

gouessej
Administrator
The JOAL plugin of Paul Lamb sound library uses only the low level binding, not the high level methods in JOAL unlike you.
Julien Gouesse | Personal blog | Website