|
@@ -38,7 +38,6 @@ import android.content.res.AssetManager;
|
|
|
import android.media.AudioManager;
|
|
import android.media.AudioManager;
|
|
|
import android.media.MediaPlayer;
|
|
import android.media.MediaPlayer;
|
|
|
import android.media.SoundPool;
|
|
import android.media.SoundPool;
|
|
|
-import android.util.Log;
|
|
|
|
|
|
|
|
|
|
import com.jme3.asset.AssetKey;
|
|
import com.jme3.asset.AssetKey;
|
|
|
import com.jme3.audio.AudioNode.Status;
|
|
import com.jme3.audio.AudioNode.Status;
|
|
@@ -47,7 +46,6 @@ import com.jme3.math.FastMath;
|
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.math.Vector3f;
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
-import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Level;
|
|
|
import java.util.logging.Logger;
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
|
@@ -179,9 +177,13 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case Volume:
|
|
case Volume:
|
|
|
-
|
|
|
|
|
- soundPool.setVolume(src.getChannel(), src.getVolume(),
|
|
|
|
|
- src.getVolume());
|
|
|
|
|
|
|
+ MediaPlayer mp = musicPlaying.get(src);
|
|
|
|
|
+ if (mp != null) {
|
|
|
|
|
+ mp.setVolume(src.getVolume(), src.getVolume());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ soundPool.setVolume(src.getChannel(), src.getVolume(),
|
|
|
|
|
+ src.getVolume());
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
break;
|
|
break;
|
|
|
case Pitch:
|
|
case Pitch:
|
|
@@ -228,30 +230,30 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
for (AudioNode src : musicPlaying.keySet()) {
|
|
for (AudioNode src : musicPlaying.keySet()) {
|
|
|
|
|
|
|
|
MediaPlayer mp = musicPlaying.get(src);
|
|
MediaPlayer mp = musicPlaying.get(src);
|
|
|
- {
|
|
|
|
|
- // Calc the distance to the listener
|
|
|
|
|
- distanceVector.set(listenerPosition);
|
|
|
|
|
- distanceVector.subtractLocal(src.getLocalTranslation());
|
|
|
|
|
- distance = FastMath.abs(distanceVector.length());
|
|
|
|
|
|
|
|
|
|
- if (distance < src.getRefDistance()) {
|
|
|
|
|
- distance = src.getRefDistance();
|
|
|
|
|
- }
|
|
|
|
|
- if (distance > src.getMaxDistance()) {
|
|
|
|
|
- distance = src.getMaxDistance();
|
|
|
|
|
- }
|
|
|
|
|
- volume = src.getRefDistance() / distance;
|
|
|
|
|
|
|
+ // Calc the distance to the listener
|
|
|
|
|
+ distanceVector.set(listenerPosition);
|
|
|
|
|
+ distanceVector.subtractLocal(src.getLocalTranslation());
|
|
|
|
|
+ distance = FastMath.abs(distanceVector.length());
|
|
|
|
|
|
|
|
- AndroidAudioData audioData = (AndroidAudioData) src.getAudioData();
|
|
|
|
|
|
|
+ if (distance < src.getRefDistance()) {
|
|
|
|
|
+ distance = src.getRefDistance();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (distance > src.getMaxDistance()) {
|
|
|
|
|
+ distance = src.getMaxDistance();
|
|
|
|
|
+ }
|
|
|
|
|
+ volume = src.getRefDistance() / distance;
|
|
|
|
|
|
|
|
- if (FastMath.abs(audioData.getCurrentVolume() - volume) > FastMath.FLT_EPSILON) {
|
|
|
|
|
- // Left / Right channel get the same volume by now, only
|
|
|
|
|
- // positional
|
|
|
|
|
- mp.setVolume(volume, volume);
|
|
|
|
|
|
|
+ AndroidAudioData audioData = (AndroidAudioData) src.getAudioData();
|
|
|
|
|
|
|
|
- audioData.setCurrentVolume(volume);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (FastMath.abs(audioData.getCurrentVolume() - volume) > FastMath.FLT_EPSILON) {
|
|
|
|
|
+ // Left / Right channel get the same volume by now, only
|
|
|
|
|
+ // positional
|
|
|
|
|
+ mp.setVolume(volume, volume);
|
|
|
|
|
+
|
|
|
|
|
+ audioData.setCurrentVolume(volume);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -328,7 +330,7 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
AudioKey assetKey = (AudioKey) audioData.getAssetKey();
|
|
AudioKey assetKey = (AudioKey) audioData.getAssetKey();
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (audioData.getId() < 0) { // found something to load
|
|
if (audioData.getId() < 0) { // found something to load
|
|
|
int soundId = soundPool.load(
|
|
int soundId = soundPool.load(
|
|
|
assetManager.openFd(assetKey.getName()), 1);
|
|
assetManager.openFd(assetKey.getName()), 1);
|
|
@@ -341,6 +343,7 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
soundpoolStillLoading.put(audioData.getId(), src);
|
|
soundpoolStillLoading.put(audioData.getId(), src);
|
|
|
} else {
|
|
} else {
|
|
|
src.setChannel(channel); // receive a channel at the last
|
|
src.setChannel(channel); // receive a channel at the last
|
|
|
|
|
+ setSourceParams(src);
|
|
|
// playing at least
|
|
// playing at least
|
|
|
}
|
|
}
|
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
@@ -362,11 +365,12 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
|
|
|
|
|
AudioData audioData = src.getAudioData();
|
|
AudioData audioData = src.getAudioData();
|
|
|
|
|
|
|
|
- if (status == 0) // load was successfull
|
|
|
|
|
- {
|
|
|
|
|
|
|
+ // load was successfull
|
|
|
|
|
+ if (status == 0) {
|
|
|
int channelIndex;
|
|
int channelIndex;
|
|
|
channelIndex = soundPool.play(audioData.getId(), 1f, 1f, 1, 0, 1f);
|
|
channelIndex = soundPool.play(audioData.getId(), 1f, 1f, 1, 0, 1f);
|
|
|
src.setChannel(channelIndex);
|
|
src.setChannel(channelIndex);
|
|
|
|
|
+ setSourceParams(src);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -382,21 +386,25 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
mp = new MediaPlayer();
|
|
mp = new MediaPlayer();
|
|
|
mp.setOnCompletionListener(this);
|
|
mp.setOnCompletionListener(this);
|
|
|
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
|
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
- AssetKey<?> key = audioData.getAssetKey();
|
|
|
|
|
-
|
|
|
|
|
- AssetFileDescriptor afd = assetManager.openFd(key.getName()); // assetKey.getName()
|
|
|
|
|
- mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
|
|
|
|
|
- afd.getLength());
|
|
|
|
|
- mp.prepare();
|
|
|
|
|
- mp.setLooping(src.isLooping());
|
|
|
|
|
- mp.start();
|
|
|
|
|
- src.setChannel(0);
|
|
|
|
|
- src.setStatus(Status.Playing);
|
|
|
|
|
- musicPlaying.put(src, mp);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if (src.getStatus() == Status.Stopped) {
|
|
|
|
|
+ mp.reset();
|
|
|
|
|
+ AssetKey<?> key = audioData.getAssetKey();
|
|
|
|
|
+
|
|
|
|
|
+ AssetFileDescriptor afd = assetManager.openFd(key.getName()); // assetKey.getName()
|
|
|
|
|
+ mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
|
|
|
|
|
+ afd.getLength());
|
|
|
|
|
+ mp.prepare();
|
|
|
|
|
+ setSourceParams(src, mp);
|
|
|
|
|
+ src.setChannel(0);
|
|
|
|
|
+ src.setStatus(Status.Playing);
|
|
|
|
|
+ musicPlaying.put(src, mp);
|
|
|
|
|
+ mp.start();
|
|
|
|
|
+ }else{
|
|
|
|
|
+ mp.start();
|
|
|
|
|
+ }
|
|
|
} catch (IllegalStateException e) {
|
|
} catch (IllegalStateException e) {
|
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
@@ -404,6 +412,17 @@ public class AndroidAudioRenderer implements AudioRenderer,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private void setSourceParams(AudioNode src, MediaPlayer mp) {
|
|
|
|
|
+ mp.setLooping(true);
|
|
|
|
|
+ mp.setVolume(src.getVolume(), src.getVolume());
|
|
|
|
|
+ //src.getDryFilter();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void setSourceParams(AudioNode src) {
|
|
|
|
|
+ soundPool.setLoop(src.getChannel(), src.isLooping() ? -1 : 0);
|
|
|
|
|
+ soundPool.setVolume(src.getChannel(), src.getVolume(), src.getVolume());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Pause the current playing sounds. Both from the {@link SoundPool} and the
|
|
* Pause the current playing sounds. Both from the {@link SoundPool} and the
|
|
|
* active {@link MediaPlayer}s
|
|
* active {@link MediaPlayer}s
|