Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2409cdb5 authored by Gil Dobjanschi's avatar Gil Dobjanschi Committed by Android (Google) Code Review
Browse files

Merge "Remove MediaVideoItem and AudioTrack playback APIs."

parents d6e9d769 b27f2d31
Loading
Loading
Loading
Loading
+0 −172
Original line number Diff line number Diff line
@@ -18,17 +18,12 @@ package android.media.videoeditor;

import java.io.IOException;

import android.util.Log;

/**
 * This class allows to handle an audio track. This audio file is mixed with the
 * audio samples of the MediaItems.
 * {@hide}
 */
public class AudioTrack {
    // Logging
    private static final String TAG = "AudioTrack";

    // Instance variables
    private final String mUniqueId;
    private final String mFilename;
@@ -53,129 +48,6 @@ public class AudioTrack {

    // The audio waveform filename
    private String mAudioWaveformFilename;
    private PlaybackThread mPlaybackThread;

    /**
     * This listener interface is used by the AudioTrack to emit playback
     * progress notifications.
     */
    public interface PlaybackProgressListener {
        /**
         * This method notifies the listener of the current time position while
         * playing an audio track
         *
         * @param audioTrack The audio track
         * @param timeMs The current playback position (expressed in milliseconds
         *            since the beginning of the audio track).
         * @param end true if the end of the audio track was reached
         */
        public void onProgress(AudioTrack audioTrack, long timeMs, boolean end);
    }

    /**
     * The playback thread
     */
    private class PlaybackThread extends Thread {
        // Instance variables
        private final PlaybackProgressListener mListener;
        private final long mFromMs, mToMs;
        private boolean mRun;
        private final boolean mLoop;
        private long mPositionMs;

        /**
         * Constructor
         *
         * @param fromMs The time (relative to the beginning of the audio track)
         *            at which the playback will start
         * @param toMs The time (relative to the beginning of the audio track) at
         *            which the playback will stop. Use -1 to play to the end of
         *            the audio track
         * @param loop true if the playback should be looped once it reaches the
         *            end
         * @param listener The listener which will be notified of the playback
         *            progress
         */
        public PlaybackThread(long fromMs, long toMs, boolean loop,
                PlaybackProgressListener listener) {
            mPositionMs = mFromMs = fromMs;
            if (toMs < 0) {
                mToMs = mDurationMs;
            } else {
                mToMs = toMs;
            }
            mLoop = loop;
            mListener = listener;
            mRun = true;
        }

        /*
         * {@inheritDoc}
         */
        @Override
        public void run() {
            if (Log.isLoggable(TAG, Log.DEBUG)) {
                Log.d(TAG, "===> PlaybackThread.run enter");
            }

            while (mRun) {
                try {
                    sleep(100);
                } catch (InterruptedException ex) {
                    break;
                }

                mPositionMs += 100;

                if (mPositionMs >= mToMs) {
                    if (!mLoop) {
                        if (mListener != null) {
                            mListener.onProgress(AudioTrack.this, mPositionMs, true);
                        }
                        if (Log.isLoggable(TAG, Log.DEBUG)) {
                            Log.d(TAG, "PlaybackThread.run playback complete");
                        }
                        break;
                    } else {
                        // Fire a notification for the end of the clip
                        if (mListener != null) {
                            mListener.onProgress(AudioTrack.this, mToMs, false);
                        }

                        // Rewind
                        mPositionMs = mFromMs;
                        if (mListener != null) {
                            mListener.onProgress(AudioTrack.this, mPositionMs, false);
                        }
                        if (Log.isLoggable(TAG, Log.DEBUG)) {
                            Log.d(TAG, "PlaybackThread.run playback complete");
                        }
                    }
                } else {
                    if (mListener != null) {
                        mListener.onProgress(AudioTrack.this, mPositionMs, false);
                    }
                }
            }
            if (Log.isLoggable(TAG, Log.DEBUG)) {
                Log.d(TAG, "===> PlaybackThread.run exit");
            }
        }

        /**
         * Stop the playback
         *
         * @return The stop position
         */
        public long stopPlayback() {
            mRun = false;
            try {
                join();
            } catch (InterruptedException ex) {
            }
            return mPositionMs;
        }
    };

    /**
     * An object of this type cannot be instantiated by using the default
@@ -508,50 +380,6 @@ public class AudioTrack {
        return mDuckingLowVolume;
    }

    /**
     * Start the playback of this audio track. This method does not block (does
     * not wait for the playback to complete).
     *
     * @param fromMs The time (relative to the beginning of the audio track) at
     *            which the playback will start
     * @param toMs The time (relative to the beginning of the audio track) at
     *            which the playback will stop. Use -1 to play to the end of the
     *            audio track
     * @param loop true if the playback should be looped once it reaches the end
     * @param listener The listener which will be notified of the playback
     *            progress
     * @throws IllegalArgumentException if fromMs or toMs is beyond the playback
     *             duration
     * @throws IllegalStateException if a playback, preview or an export is
     *             already in progress
     */
    public void startPlayback(long fromMs, long toMs, boolean loop,
            PlaybackProgressListener listener) {
        if (fromMs >= mDurationMs) {
            return;
        }
        mPlaybackThread = new PlaybackThread(fromMs, toMs, loop, listener);
        mPlaybackThread.start();
    }

    /**
     * Stop the audio track playback. This method blocks until the ongoing
     * playback is stopped.
     *
     * @return The accurate current time when stop is effective expressed in
     *         milliseconds
     */
    public long stopPlayback() {
        final long stopTimeMs;
        if (mPlaybackThread != null) {
            stopTimeMs = mPlaybackThread.stopPlayback();
            mPlaybackThread = null;
        } else {
            stopTimeMs = 0;
        }
        return stopTimeMs;
    }

    /**
     * This API allows to generate a file containing the sample volume levels of
     * this audio track object. This function may take significant time and is
+0 −191
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package android.media.videoeditor;
import java.io.IOException;

import android.graphics.Bitmap;
import android.util.Log;
import android.view.SurfaceHolder;

/**
@@ -27,9 +26,6 @@ import android.view.SurfaceHolder;
 * {@hide}
 */
public class MediaVideoItem extends MediaItem {
    // Logging
    private static final String TAG = "MediaVideoItem";

    // Instance variables
    private final int mWidth;
    private final int mHeight;
@@ -50,142 +46,6 @@ public class MediaVideoItem extends MediaItem {
    private int mVolumePercentage;
    private boolean mMuted;
    private String mAudioWaveformFilename;
    private PlaybackThread mPlaybackThread;

    /**
     * This listener interface is used by the MediaVideoItem to emit playback
     * progress notifications. This callback should be invoked after the
     * number of frames specified by
     * {@link #startPlayback(SurfaceHolder surfaceHolder, long fromMs,
     *           int callbackAfterFrameCount, PlaybackProgressListener listener)}
     */
    public interface PlaybackProgressListener {
        /**
         * This method notifies the listener of the current time position while
         * playing a media item
         *
         * @param mediaItem The media item
         * @param timeMs The current playback position (expressed in milliseconds
         *            since the beginning of the media item).
         * @param end true if the end of the media item was reached
         */
        public void onProgress(MediaVideoItem mediaItem, long timeMs, boolean end);
    }

    /**
     * The playback thread
     */
    private class PlaybackThread extends Thread {
        // Instance variables
        private final static long FRAME_DURATION = 33;
        private final PlaybackProgressListener mListener;
        private final int mCallbackAfterFrameCount;
        private final long mFromMs, mToMs;
        private boolean mRun;
        private final boolean mLoop;
        private long mPositionMs;

        /**
         * Constructor
         *
         * @param fromMs The time (relative to the beginning of the media item)
         *            at which the playback will start
         * @param toMs The time (relative to the beginning of the media item) at
         *            which the playback will stop. Use -1 to play to the end of
         *            the media item
         * @param loop true if the playback should be looped once it reaches the
         *            end
         * @param callbackAfterFrameCount The listener interface should be
         *            invoked after the number of frames specified by this
         *            parameter.
         * @param listener The listener which will be notified of the playback
         *            progress
         */
        public PlaybackThread(long fromMs, long toMs, boolean loop, int callbackAfterFrameCount,
                PlaybackProgressListener listener) {
            mPositionMs = mFromMs = fromMs;
            if (toMs < 0) {
                mToMs = mDurationMs;
            } else {
                mToMs = toMs;
            }
            mLoop = loop;
            mCallbackAfterFrameCount = callbackAfterFrameCount;
            mListener = listener;
            mRun = true;
        }

        /*
         * {@inheritDoc}
         */
        @Override
        public void run() {
            if (Log.isLoggable(TAG, Log.DEBUG)) {
                Log.d(TAG, "===> PlaybackThread.run enter");
            }
            int frameCount = 0;
            while (mRun) {
                try {
                    sleep(FRAME_DURATION);
                } catch (InterruptedException ex) {
                    break;
                }
                frameCount++;
                mPositionMs += FRAME_DURATION;

                if (mPositionMs >= mToMs) {
                    if (!mLoop) {
                        if (mListener != null) {
                            mListener.onProgress(MediaVideoItem.this, mPositionMs, true);
                        }
                        if (Log.isLoggable(TAG, Log.DEBUG)) {
                            Log.d(TAG, "PlaybackThread.run playback complete");
                        }
                        break;
                    } else {
                        // Fire a notification for the end of the clip
                        if (mListener != null) {
                            mListener.onProgress(MediaVideoItem.this, mToMs, false);
                        }

                        // Rewind
                        mPositionMs = mFromMs;
                        if (mListener != null) {
                            mListener.onProgress(MediaVideoItem.this, mPositionMs, false);
                        }
                        if (Log.isLoggable(TAG, Log.DEBUG)) {
                            Log.d(TAG, "PlaybackThread.run playback complete");
                        }
                        frameCount = 0;
                    }
                } else {
                    if (frameCount == mCallbackAfterFrameCount) {
                        if (mListener != null) {
                            mListener.onProgress(MediaVideoItem.this, mPositionMs, false);
                        }
                        frameCount = 0;
                    }
                }
            }
            if (Log.isLoggable(TAG, Log.DEBUG)) {
                Log.d(TAG, "===> PlaybackThread.run exit");
            }
        }

        /**
         * Stop the playback
         *
         * @return The stop position
         */
        public long stopPlayback() {
            mRun = false;
            try {
                join();
            } catch (InterruptedException ex) {
            }
            return mPositionMs;
        }
    };

    /**
     * An object of this type cannot be instantiated with a default constructor
@@ -407,57 +267,6 @@ public class MediaVideoItem extends MediaItem {
        return timeMs;
    }

    /**
     * Start the playback of this media item. This method does not block (does
     * not wait for the playback to complete). The PlaybackProgressListener
     * allows to track the progress at the time interval determined by the
     * callbackAfterFrameCount parameter. The SurfaceHolder has to be created
     * and ready for use before calling this method.
     *
     * @param surfaceHolder SurfaceHolder where the frames are rendered.
     * @param fromMs The time (relative to the beginning of the media item) at
     *            which the playback will start
     * @param toMs The time (relative to the beginning of the media item) at
     *            which the playback will stop. Use -1 to play to the end of the
     *            media item
     * @param loop true if the playback should be looped once it reaches the end
     * @param callbackAfterFrameCount The listener interface should be invoked
     *            after the number of frames specified by this parameter.
     * @param listener The listener which will be notified of the playback
     *            progress
     * @throws IllegalArgumentException if fromMs or toMs is beyond the playback
     *             duration
     * @throws IllegalStateException if a playback, preview or an export is
     *             already in progress
     */
    public void startPlayback(SurfaceHolder surfaceHolder, long fromMs, long toMs, boolean loop,
            int callbackAfterFrameCount, PlaybackProgressListener listener) {
        if (fromMs >= mDurationMs) {
            return;
        }
        mPlaybackThread = new PlaybackThread(fromMs, toMs, loop, callbackAfterFrameCount,
                listener);
        mPlaybackThread.start();
    }

    /**
     * Stop the media item playback. This method blocks until the ongoing
     * playback is stopped.
     *
     * @return The accurate current time when stop is effective expressed in
     *         milliseconds
     */
    public long stopPlayback() {
        final long stopTimeMs;
        if (mPlaybackThread != null) {
            stopTimeMs = mPlaybackThread.stopPlayback();
            mPlaybackThread = null;
        } else {
            stopTimeMs = 0;
        }
        return stopTimeMs;
    }

    /**
     * This API allows to generate a file containing the sample volume levels of
     * the Audio track of this media item. This function may take significant