java - Android MediaPlayer sometimes skips or fails when playing two sounds simultaneously -
i've made method play sounds in mp3 format (max file size 145kb). when event happens in game send file method. creates new mediaplayer instance whenever called, releases instance on completion. problem both emulator , phone, when play 2 sounds near simultaneously, sounds either skip (like scratched cd), or 1 sound doesn't play @ all, or works.
is thread getting overloaded or something? have samsung galaxy s3. should use soundpool instead? i've heard has own problems
public class mediasimultaneous { private mediaplayer[] mediaplayerarray = new mediaplayer[10]; private audiomanager maudiomanager; int playernum = -1; // array index of player instance. public void playsound(context context, int audioid) { if (maudiomanager == null) { maudiomanager = (audiomanager) context.getsystemservice(context.audio_service); } playernum += 1; mediaplayerarray[playernum] = mediaplayer.create(context, audioid); mediaplayerarray[playernum].setonpreparedlistener(new mediaplayer.onpreparedlistener() { @override public void onprepared(mediaplayer mp) { mp.start(); mp.setoncompletionlistener(new mediaplayer.oncompletionlistener() { @override public void oncompletion(mediaplayer mp) { mp.release(); mediaplayerarray[playernum] = null; playernum -= 1; if (playernum <= 0) { playernum = 0; } } }); } }); }
i figured out 2 separate problems. stuttering due documented bug in mediaplayer, , not playing @ due onprepared no being called. code fixed problem. i'm not sure how. possibly because media being prepared before onpreparedlistener had been created.
mediaplayerarray[playernum] = new mediaplayer(); uri mediafile; mediafile = uri.parse("android.resource://com.adventureapps.borntorun/" + audioid); try { mediaplayerarray[playernum].setdatasource(context, mediafile); } catch (ioexception e) { e.printstacktrace(); } mediaplayerarray[playernum].setaudiostreamtype(audiomanager.stream_music); mediaplayerarray[playernum].setonpreparedlistener(new mediaplayer.onpreparedlistener() { @override public void onprepared(mediaplayer mp1) { mp1.start(); log.d(tag, "mediaplayer " + integer.tostring(playernum) + " started"); } }); try { mediaplayerarray[playernum].prepare(); } catch (ioexception e) { e.printstacktrace(); }
Comments
Post a Comment