OBX
OBX

Reputation: 6114

Adding delay while Mediaplayer loops

Playing .wav file using MediaPlayer class. As I need to loop the Audio I've set .setLooping(true); . So obviously, the doubt is how do I add a delay each time the audio plays, say I want a delay of 5000 .

The answers to similar questions here doesn't work in my case. Any help would be appreciated. Here is my code:

 Button Sample = (Button)findViewById(R.id.samplex);
    Sample.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

    String filePath = Environment.getExternalStorageDirectory()+"/myAppCache/wakeUp.wav";

            try {
                mp.setDataSource(filePath);
                mp.prepare();
                mp.setLooping(true);

            }
            catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mp.start();

        }


    });

Upvotes: 0

Views: 2556

Answers (1)

Dimitar Genov
Dimitar Genov

Reputation: 2066

You need to register 2 listeners (on completion and on error) and then you would need to delay next play in on completion callback. Reason for the error listener is to return true to avoid calling on completion event whenever there is an error - explanation here

private final Runnable loopingRunnable = new Runnable() {
    @Override
    public void run() {
        if (mp != null) {
            if (mp.isPlaying() {
                mp.stop();
            }
            mp.start();
        }
    }
}

mp.setDataSource(filePath);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        button.postDelayed(loopingRunnable, 5000);
    }
});
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    ...
    return true;
});

mp.prepare();
// no need to loop it since on completion event takes care of this
// mp.setLooping(true);

Whenever your destruction method is (Activity.onDestroyed(), Fragment.onDestroy(), View.onDetachedFromWindow()), ensure you are removing the runnable callbacks, e.g.

@Override
protected void onDestroy() {
    super.onDestroy();
    ...
    button.removeCallbacks(loopingRunnable);

    if (mp != null) {
        if (mp.isPlaying()) {
            mp.stop();
        }

        mp.release();
        mp = null;
    }
}

Upvotes: 4

Related Questions