Android Open Source - MicDroid Seekable Media Player






From Project

Back to project page MicDroid.

License

The source code is released under:

GNU General Public License

If you think the Android project MicDroid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/* SeekableMediaPlayer.java
/*  w  w  w.  j a  v a 2 s.  c  o m*/
   Copyright (c) 2010 Ethan Chen

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation, Inc.,
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.intervigil.micdroid;

import java.io.FileInputStream;
import java.io.IOException;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Handler;
import android.os.Message;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class SeekableMediaPlayer {

    private static final int REFRESH = 1;
    private static final int DEFAULT_INCREMENT = 500;

    private MediaPlayer mediaPlayer;
    private SeekBar seekBar;
    private RefreshHandler refreshHandler;

    private boolean isPaused;

    public SeekableMediaPlayer(String filePath, SeekBar seekBar) {
        this.seekBar = seekBar;
        this.seekBar.setOnSeekBarChangeListener(mediaSeekListener);

        refreshHandler = new RefreshHandler();

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(playbackCompletionListener);

        try {
            // mediaPlayer seems to like file descriptors a lot more than giving
            // it a file path
            FileInputStream file = new FileInputStream(filePath);
            mediaPlayer.setDataSource(file.getFD());
            mediaPlayer.prepare();
            file.close();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        isPaused = false;
    }

    public void bindSeekBar(SeekBar seekBar) {
        this.seekBar = seekBar;
        this.seekBar.setOnSeekBarChangeListener(mediaSeekListener);
    }

    public void play() {
        if (!mediaPlayer.isPlaying() || isPaused) {
            mediaPlayer.start();

            isPaused = false;

            long refreshDelay = onRefresh();
            queueNextRefresh(refreshDelay);
        }
    }

    public void pause() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();

            isPaused = true;
        }
    }

    public void stop() {
        if (mediaPlayer.isPlaying() || isPaused) {
            try {
                mediaPlayer.stop();
                mediaPlayer.prepare();
                mediaPlayer.seekTo(0);
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            isPaused = false;
        }
    }

    public void close() {
        if (mediaPlayer != null) {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
            mediaPlayer.release();
        }
        mediaPlayer = null;

        refreshHandler.removeMessages(REFRESH);

        isPaused = true;
    }

    private OnSeekBarChangeListener mediaSeekListener = new OnSeekBarChangeListener() {

        public void onStopTrackingTouch(SeekBar seekBar) {
            if (isPaused) {
                play();
            }
        }

        public void onStartTrackingTouch(SeekBar seekBar) {
            if (mediaPlayer.isPlaying()) {
                pause();
            }
        }

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            if (fromUser) {
                int progressMs = (progress * mediaPlayer.getDuration())
                        / seekBar.getMax();
                mediaPlayer.seekTo(progressMs);
            }
        }
    };

    private OnCompletionListener playbackCompletionListener = new OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            try {
                mp.stop();
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

    private class RefreshHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case REFRESH:
                long delay = onRefresh();
                queueNextRefresh(delay);
                break;
            default:
                break;
            }
        }
    }

    private void queueNextRefresh(long delay) {
        if (mediaPlayer.isPlaying()) {
            Message msg = refreshHandler.obtainMessage(REFRESH);
            refreshHandler.removeMessages(REFRESH);
            refreshHandler.sendMessageDelayed(msg, delay);
        }
    }

    private long onRefresh() {
        if (mediaPlayer != null && mediaPlayer.getDuration() > 0) {
            int progress = (mediaPlayer.getCurrentPosition() * seekBar.getMax())
                    / mediaPlayer.getDuration();
            seekBar.setProgress((int) progress);
        }
        return DEFAULT_INCREMENT;
    }
}




Java Source Code List

com.intervigil.micdroid.AutotalentTask.java
com.intervigil.micdroid.Constants.java
com.intervigil.micdroid.FileNameEntry.java
com.intervigil.micdroid.InstrumentalLibrary.java
com.intervigil.micdroid.MicApplication.java
com.intervigil.micdroid.Mic.java
com.intervigil.micdroid.Preferences.java
com.intervigil.micdroid.RecordingLibrary.java
com.intervigil.micdroid.RecordingPlayer.java
com.intervigil.micdroid.SeekableMediaPlayer.java
com.intervigil.micdroid.StartupDialog.java
com.intervigil.micdroid.Timer.java
com.intervigil.micdroid.helper.AdHelper.java
com.intervigil.micdroid.helper.ApplicationHelper.java
com.intervigil.micdroid.helper.AudioHelper.java
com.intervigil.micdroid.helper.DialogHelper.java
com.intervigil.micdroid.helper.HeadsetHelper.java
com.intervigil.micdroid.helper.MediaStoreHelper.java
com.intervigil.micdroid.helper.PreferenceHelper.java
com.intervigil.micdroid.helper.RecordingOptionsHelper.java
com.intervigil.micdroid.helper.UpdateHelper.java
com.intervigil.micdroid.interfaces.DependentTask.java
com.intervigil.micdroid.interfaces.Recorder.java
com.intervigil.micdroid.model.Recording.java
com.intervigil.micdroid.recorder.JNIRecorder.java
com.intervigil.micdroid.recorder.SimpleRecorder.java
com.intervigil.micdroid.recorder.SipdroidRecorder.java
org.openintents.intents.FileManagerIntents.java