Recently I've been working on an android game, but have hit a problem when adding music and other sounds. I read that Mediaplayers are optimal for background music, which works well, and I read that Soundpool is optimal for short music clips like sound effects. However, I can't get the Soundpool to work, it appears that the Soundpool isn't even loading.
I did more research and found a lot of nightmare stories about Soundpool's lack of support, so should I just use a mediaplayer for all audio? Is this efficient?
//My Code
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int mySoundId, int status) {
loaded = true;
}
});
if(loaded==true){
soundId = soundPool.load(this, R.raw.sound1, 1);
soundPool.play(soundId, 1, 1, 1, 0, 1f);}
else{
System.exit(0);
}
//Forces the program to exit everytime
SoundPool#load method is asynchronous, you should play sound after onLoadComplete had been invoked
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int mySoundId, int status) {
soundPool.play(mySoundId, 1, 1, 1, 0, 1f);
}
});
soundPool.load(this, R.raw.sound1, 1);
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int mySoundId, int status) {
loaded = true;
soundId = soundPool.load(this, R.raw.sound1, 1);
soundPool.play(soundId, 1, 1, 1, 0, 1f);
}
});
because your loaded variable will be always false, you should do the things within the onLoadComplete.
Related
I want to play a short sound when a button is clicked using SoundPool. But when the button is clicked no sound appears despite the Log telling me it's loaded and "playing". The soundfile is an .ogg in case that's relevant. Here's my code, buttonSound() is called in onCreate().
void buttonSound(){
AudioAttributes attributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build();
soundPool = new SoundPool.Builder().setAudioAttributes(attributes).build();
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
Log.d("SOUNDPOOL", "COMPLETE "+button);
}
});
button = soundPool.load(this, R.raw.button, 1);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.button_back:
// Sound loaded
if(button != 0) {
soundPool.play(button, 1f, 1f, 1, 0, 1f);
Log.d("PLAYING", "PLAYING");
}
break;
So apparently AudioAttributes.USAGE_ASSISTANCE_SONIFICATION was the issue, it works fine with AudioAttributes.USAGE_GAME and AudioAttributes.USAGE_MEDIA. I have no idea why, though.
I am trying to play a sound in an app. However, using SoundPool I am unable to do so. The code is really simple and I don't see where it can fail.
A similar code but using MediaPlayer does work, but I am interested in using SoundPool.
SoundPool code:
private void playSound2(){
SoundPool sp = new SoundPool.Builder().build();
int soundID = sp.load(MainActivity.this, R.raw.sound, 1);
sp.play(soundID, 1, 1, 1, 0, 1);
}
Context:
public void goButtonClick(View view){
Button goButton = findViewById(id.button2);
if (onGoing){
goButton.setText("GO!");
} else {
goButton.setText("STOP");
//playSound(); // MediaPlayer
playSound2(); // SoundPool
}
onGoing = !onGoing;
}
MediaPlayer version (works):
private void playSound(){
MediaPlayer mediaPlayer;
mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.sound);
mediaPlayer.start();
}
Solved!
I was missing to wait for the loading of the sound file into soundPool. The correct code is:
private void playSound2() {
SoundPool sp = new SoundPool.Builder().build();
int soundID = sp.load(MainActivity.this, raw.sound, 1);
sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool sp, int soundID, int i1) {
sp.play(soundID, 1, 1, 1, 0, 1);
}
});
}
I am trying to play a sound clip from a fragment, but the sound is not playing. I am not getting any errors in console and no crashing, just no sound is played. yes, my volume is up and nothing is muted. All relevant code is below
int soundId;
int currentSound;
SoundPool sp;
boolean pressed;
boolean loaded;
sp = new SoundPool(5, AudioManager.STREAM_MUSIC,0);
currentSound = R.raw.whatarethose;
sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int i, int i1) {
loaded = true;
}
});
button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(loaded) {
soundId = sp.load(getActivity(), currentSound, 1);
sp.play(soundId, 1, 1, 0, 0, 1);
}
}
});
You are loading the sound in the button click. try to load the sound after yu set the OnCompleteListener, before the click.
int soundId;
int currentSound;
SoundPool sp;
boolean pressed;
boolean loaded;
sp = new SoundPool(5, AudioManager.STREAM_MUSIC,0);
currentSound = R.raw.whatarethose;
sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int i, int i1) {
loaded = true;
}
});
soundId = sp.load(getActivity(), currentSound, 1);
button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(loaded) {
sp.play(soundId, 1, 1, 0, 0, 1);
}
}
});
I have one SoundPool in my Android app, but I don't know how to write code for 2 or more SoundPool instances. Is there a way to rework this code for multiple SoundPools?
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view = findViewById(R.id.button1);
view.setOnTouchListener(this);
// Set the hardware buttons to control the music
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Load the sound
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener()
{
#Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
loaded = true;
}
});
soundID = soundPool.load(this, R.raw.sound1, 1);
}
public boolean onTouch( View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// Getting the user sound settings
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
float actualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = actualVolume / maxVolume;
// Is the sound loaded already?
if (loaded) {
soundPool.play(soundID, volume, volume, 1, 0, 1f);
Log.e("Test", "Played sound");
}
}
return false;
}
Try:
// 8 soundpools
SoundPool[] soundPool = new SoundPool[8];
int[] soundID = new int[8];
// You can have more that one set per sound if need, just make more raw sound
// arrays with different sounds.
// 8 sounds per soundpool
int[] rawSounds = new int[]{ R.id.sound1, R.id.sound2, R.id.sound3,
R.id.sound4, R.id.sound5, R.id.sound6,
R.id.sound7, R.id.sound8 };
boolean[] loaded = new boolean[8];
// Go through each soundpool
for(int i = 0; i < 8; i++)
{
soundPool[i] = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
// 8 sounds in one soundpool
for(int h = 0; h < 8; h++)
{
soundID[i] = soundPool.load(this, rawSounds[i], 1);
}
soundPool[i].setOnLoadCompleteListener(new OnLoadCompleteListener()
{
Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status)
{
// One boolean per soundpool
loaded[i] = true;
}
});
}
Then use a for loop to see what is being press for which sound and use soundID[i].play to play sounds.
Hope this helps even though a little late!)
I have a sound clip play while I am displaying some numbers, then want it to stop. Then I want to repeat the process.
init stuff:
private SoundPool soundPool;
private int soundRoll;
boolean soundloaded = false;
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
soundloaded = true;
}
});
soundRoll = soundPool.load(this, R.raw.roll, 1);
Thread Call:
public void update() {
.......
new Thread(new Runnable() {
public void run() {
int streamID = 0;
streamID = soundPool.play(soundRoll, volume, volume, 1, -1, 1);
... loop to animate text....
soundPool.stop(streamID);
}
}).start();
}
This works fine every other time.
so the first time it plays and stops at the right time.
second time I hear nothing
but then it works the third time
If I take out the looping, then it works.
Any help would be appretiated
Seems that if I switch to an OGG file from an MP3, the bug goes away