blob: 9edafadfee7e6b6028f7bd4d0fed824eee3dd0c6 [file] [log] [blame]
/*
* Copyright (c) 2009-2010 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.audio;
import com.jme3.asset.AssetInfo;
import com.jme3.asset.AssetLoader;
import com.jme3.audio.AudioNode.Status;
import com.jme3.audio.*;
import com.jme3.audio.plugins.OGGLoader;
import com.jme3.audio.plugins.WAVLoader;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeSystem;
import java.io.*;
import javax.swing.JFileChooser;
public class TestMusicPlayer extends javax.swing.JFrame {
private AudioRenderer ar;
private AudioData musicData;
private AudioNode musicSource;
private float musicLength = 0;
private float curTime = 0;
private Listener listener = new Listener();
public TestMusicPlayer() {
initComponents();
setLocationRelativeTo(null);
initAudioPlayer();
}
private void initAudioPlayer(){
AppSettings settings = new AppSettings(true);
settings.setRenderer(null); // disable rendering
settings.setAudioRenderer("LWJGL");
ar = JmeSystem.newAudioRenderer(settings);
ar.initialize();
ar.setListener(listener);
AudioContext.setAudioRenderer(ar);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
pnlButtons = new javax.swing.JPanel();
sldVolume = new javax.swing.JSlider();
btnRewind = new javax.swing.JButton();
btnStop = new javax.swing.JButton();
btnPlay = new javax.swing.JButton();
btnFF = new javax.swing.JButton();
btnOpen = new javax.swing.JButton();
pnlBar = new javax.swing.JPanel();
lblTime = new javax.swing.JLabel();
sldBar = new javax.swing.JSlider();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
pnlButtons.setLayout(new javax.swing.BoxLayout(pnlButtons, javax.swing.BoxLayout.LINE_AXIS));
sldVolume.setMajorTickSpacing(20);
sldVolume.setOrientation(javax.swing.JSlider.VERTICAL);
sldVolume.setPaintTicks(true);
sldVolume.setValue(100);
sldVolume.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sldVolumeStateChanged(evt);
}
});
pnlButtons.add(sldVolume);
btnRewind.setText("<<");
pnlButtons.add(btnRewind);
btnStop.setText("[ ]");
btnStop.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnStopActionPerformed(evt);
}
});
pnlButtons.add(btnStop);
btnPlay.setText("II / >");
btnPlay.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnPlayActionPerformed(evt);
}
});
pnlButtons.add(btnPlay);
btnFF.setText(">>");
btnFF.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnFFActionPerformed(evt);
}
});
pnlButtons.add(btnFF);
btnOpen.setText("Open ...");
btnOpen.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnOpenActionPerformed(evt);
}
});
pnlButtons.add(btnOpen);
getContentPane().add(pnlButtons, java.awt.BorderLayout.CENTER);
pnlBar.setLayout(new javax.swing.BoxLayout(pnlBar, javax.swing.BoxLayout.LINE_AXIS));
lblTime.setText("0:00-0:00");
lblTime.setBorder(javax.swing.BorderFactory.createEmptyBorder(3, 3, 3, 3));
pnlBar.add(lblTime);
sldBar.setValue(0);
sldBar.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sldBarStateChanged(evt);
}
});
pnlBar.add(sldBar);
getContentPane().add(pnlBar, java.awt.BorderLayout.PAGE_START);
pack();
}// </editor-fold>//GEN-END:initComponents
private void btnOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOpenActionPerformed
JFileChooser chooser = new JFileChooser();
chooser.setAcceptAllFileFilterUsed(true);
chooser.setDialogTitle("Select OGG file");
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION){
btnStopActionPerformed(null);
final File selected = chooser.getSelectedFile();
AssetLoader loader = null;
if(selected.getName().endsWith(".wav")){
loader = new WAVLoader();
}else{
loader = new OGGLoader();
}
AudioKey key = new AudioKey(selected.getName(), true, true);
try{
musicData = (AudioData) loader.load(new AssetInfo(null, key) {
@Override
public InputStream openStream() {
try{
return new FileInputStream(selected);
}catch (FileNotFoundException ex){
ex.printStackTrace();
}
return null;
}
});
}catch (IOException ex){
ex.printStackTrace();
}
musicSource = new AudioNode(musicData, key);
musicLength = musicData.getDuration();
updateTime();
}
}//GEN-LAST:event_btnOpenActionPerformed
private void updateTime(){
int max = (int) (musicLength * 100);
int pos = (int) (curTime * 100);
sldBar.setMaximum(max);
sldBar.setValue(pos);
int minutesTotal = (int) (musicLength / 60);
int secondsTotal = (int) (musicLength % 60);
int minutesNow = (int) (curTime / 60);
int secondsNow = (int) (curTime % 60);
String txt = String.format("%01d:%02d-%01d:%02d", minutesNow, secondsNow,
minutesTotal, secondsTotal);
lblTime.setText(txt);
}
private void btnPlayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPlayActionPerformed
if (musicSource == null){
btnOpenActionPerformed(evt);
return;
}
if (musicSource.getStatus() == Status.Playing){
musicSource.setPitch(1);
ar.pauseSource(musicSource);
}else{
musicSource.setPitch(1);
musicSource.play();
}
}//GEN-LAST:event_btnPlayActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
ar.cleanup();
}//GEN-LAST:event_formWindowClosing
private void sldVolumeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldVolumeStateChanged
listener.setVolume( (float) sldVolume.getValue() / 100f);
ar.setListener(listener);
}//GEN-LAST:event_sldVolumeStateChanged
private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStopActionPerformed
if (musicSource != null){
musicSource.setPitch(1);
ar.stopSource(musicSource);
}
}//GEN-LAST:event_btnStopActionPerformed
private void btnFFActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFFActionPerformed
if (musicSource.getStatus() == Status.Playing){
musicSource.setPitch(2);
}
}//GEN-LAST:event_btnFFActionPerformed
private void sldBarStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldBarStateChanged
if (musicSource != null && !sldBar.getValueIsAdjusting()){
curTime = sldBar.getValue() / 100f;
if (curTime < 0)
curTime = 0;
musicSource.setTimeOffset(curTime);
// if (musicSource.getStatus() == Status.Playing){
// musicSource.stop();
// musicSource.play();
// }
updateTime();
}
}//GEN-LAST:event_sldBarStateChanged
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TestMusicPlayer().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnFF;
private javax.swing.JButton btnOpen;
private javax.swing.JButton btnPlay;
private javax.swing.JButton btnRewind;
private javax.swing.JButton btnStop;
private javax.swing.JLabel lblTime;
private javax.swing.JPanel pnlBar;
private javax.swing.JPanel pnlButtons;
private javax.swing.JSlider sldBar;
private javax.swing.JSlider sldVolume;
// End of variables declaration//GEN-END:variables
}