This may not be a complete answer, but I'll attempt to address a fairly obvious problem in the current code:
protected void managerOfSound(String theText) {
if (mp != null) {
mp.reset();
mp.release(); //from this point on it is illegal
//to operate on the existing mp object
}
//if you take one of these branches you will get a new mp instance, and be fine
if (theText.equals(campfire))
mp = MediaPlayer.create(this, R.raw.campfire);
else if (theText.equals(calmthunder))
mp = MediaPlayer.create(this, R.raw.calmthunderstorm);
else if (theText.equals(rainthunder))
mp = MediaPlayer.create(this, R.raw.rainthunder);
else if (theText.equals(whalesgulls))
mp = MediaPlayer.create(this, R.raw.whalesandgulls);
//but if you take this branch, you will be illegally operating on a released instance
else if (theText.equals(stopplaying))
mp.pause();
mp.start();
mp.setLooping(true);
}
Instead, do something like this:
protected void managerOfSound(String theText) {
if (theText.equals(stopplaying)) {
if (mp != null) mp.pause();
} else { //we are not pausing
if (mp != null) { //lets release any old one
mp.reset();
mp.release();
}
//and then get an appropriate new instance
if (theText.equals(campfire))
mp = MediaPlayer.create(this, R.raw.campfire);
else if (theText.equals(calmthunder))
mp = MediaPlayer.create(this, R.raw.calmthunderstorm);
else if (theText.equals(rainthunder))
mp = MediaPlayer.create(this, R.raw.rainthunder);
else if (theText.equals(whalesgulls))
mp = MediaPlayer.create(this, R.raw.whalesandgulls);
//Note this will still fail if there is some OTHER possibility
mp.start();
mp.setLooping(true);
}
}