diff options
Diffstat (limited to 'media')
20 files changed, 288 insertions, 1760 deletions
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 0ef7760..fd990fe 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -532,19 +532,12 @@ public class AudioRecord * @param audioData the array to which the recorded audio data is written. * @param offsetInBytes index in audioData from which the data is written. * @param sizeInBytes the number of requested bytes. - * @return the number of bytes that were read or or {@link #ERROR_INVALID_OPERATION} - * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if - * the parameters don't resolve to valid data and indexes. - * The number of bytes will not exceed sizeInBytes. + * @return the number of bytes that were read or -1 if the object wasn't properly + * initialized. The number of bytes will not exceed sizeInBytes. */ public int read(byte[] audioData, int offsetInBytes, int sizeInBytes) { if (mState != STATE_INITIALIZED) { - return ERROR_INVALID_OPERATION; - } - - if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0) - || (offsetInBytes + sizeInBytes > audioData.length)) { - return ERROR_BAD_VALUE; + return -1; } return native_read_in_byte_array(audioData, offsetInBytes, sizeInBytes); @@ -556,19 +549,12 @@ public class AudioRecord * @param audioData the array to which the recorded audio data is written. * @param offsetInShorts index in audioData from which the data is written. * @param sizeInShorts the number of requested shorts. - * @return the number of bytes that were read or or {@link #ERROR_INVALID_OPERATION} - * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if - * the parameters don't resolve to valid data and indexes. - * The number of shorts will not exceed sizeInShorts. + * @return the number of shorts that were read. or -1 if the object wasn't properly + * initialized. The number of shorts will not exceed sizeInShorts */ public int read(short[] audioData, int offsetInShorts, int sizeInShorts) { if (mState != STATE_INITIALIZED) { - return ERROR_INVALID_OPERATION; - } - - if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0) - || (offsetInShorts + sizeInShorts > audioData.length)) { - return ERROR_BAD_VALUE; + return -1; } return native_read_in_short_array(audioData, offsetInShorts, sizeInShorts); @@ -580,18 +566,12 @@ public class AudioRecord * is not a direct buffer, this method will always return 0. * @param audioBuffer the direct buffer to which the recorded audio data is written. * @param sizeInBytes the number of requested bytes. - * @return the number of bytes that were read or or {@link #ERROR_INVALID_OPERATION} - * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if - * the parameters don't resolve to valid data and indexes. - * The number of bytes will not exceed sizeInBytes. + * @return the number of bytes that were read or -1 if the object wasn't properly + * initialized. The number of bytes will not exceed sizeInBytes. */ public int read(ByteBuffer audioBuffer, int sizeInBytes) { if (mState != STATE_INITIALIZED) { - return ERROR_INVALID_OPERATION; - } - - if ( (audioBuffer == null) || (sizeInBytes < 0) ) { - return ERROR_BAD_VALUE; + return -1; } return native_read_in_direct_buffer(audioBuffer, sizeInBytes); diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 997cd44..e32835c 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -436,15 +436,6 @@ public class AudioTrack public int getSampleRate() { return mSampleRate; } - - /** - * @hide - * Returns the current playback rate in Hz. Note that this rate may differ from one set using - * {@link #setPlaybackRate(int)} as the value effectively set is implementation-dependent. - */ - public int getPlaybackRate() { - return native_get_playback_rate(); - } /** * Returns the configured audio data format. See {@link AudioFormat#ENCODING_PCM_16BIT} @@ -532,8 +523,8 @@ public class AudioTrack /** * Returns the hardware output sample rate */ - static public int getNativeOutputSampleRate(int streamType) { - return native_get_output_sample_rate(streamType); + static public int getNativeOutputSampleRate() { + return native_get_output_sample_rate(); } /** @@ -659,19 +650,16 @@ public class AudioTrack * content. Setting it to half the sample rate of the content will cause the playback to * last twice as long, but will also result result in a negative pitch shift. * The current implementation supports a maximum sample rate of twice the hardware output - * sample rate (see {@link #getNativeOutputSampleRate(int)}). Use {@link #getSampleRate()} to + * sample rate (see {@link #getNativeOutputSampleRate()}). Use {@link #getSampleRate()} to * check the rate actually used in hardware after potential clamping. * @param sampleRateInHz - * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, + * @return error code or success, see {@link #SUCCESS}, * {@link #ERROR_INVALID_OPERATION} */ public int setPlaybackRate(int sampleRateInHz) { if (mState != STATE_INITIALIZED) { return ERROR_INVALID_OPERATION; } - if (sampleRateInHz <= 0) { - return ERROR_BAD_VALUE; - } native_set_playback_rate(sampleRateInHz); return SUCCESS; } @@ -711,7 +699,7 @@ public class AudioTrack */ public int setPlaybackHeadPosition(int positionInFrames) { synchronized(mPlayStateLock) { - if ((mPlayState == PLAYSTATE_STOPPED) || (mPlayState == PLAYSTATE_PAUSED)) { + if(mPlayState == PLAYSTATE_STOPPED) { return native_set_position(positionInFrames); } else { return ERROR_INVALID_OPERATION; @@ -729,9 +717,6 @@ public class AudioTrack * {@link #ERROR_INVALID_OPERATION} */ public int setLoopPoints(int startInFrames, int endInFrames, int loopCount) { - if (mDataLoadMode == MODE_STREAM) { - return ERROR_INVALID_OPERATION; - } return native_set_loop(startInFrames, endInFrames, loopCount); } @@ -821,9 +806,8 @@ public class AudioTrack * @param audioData the array that holds the data to play. * @param offsetInBytes the offset in audioData where the data to play starts. * @param sizeInBytes the number of bytes to read in audioData after the offset. - * @return the number of bytes that were written or {@link #ERROR_INVALID_OPERATION} - * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if - * the parameters don't resolve to valid data and indexes. + * @return the number of bytes that were written or -1 if the object wasn't properly + * initialized. */ public int write(byte[] audioData,int offsetInBytes, int sizeInBytes) { @@ -832,14 +816,11 @@ public class AudioTrack && (sizeInBytes > 0)) { mState = STATE_INITIALIZED; } + //TODO check if future writes should be forbidden for static tracks + // or: how to update data for static tracks? if (mState != STATE_INITIALIZED) { - return ERROR_INVALID_OPERATION; - } - - if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0) - || (offsetInBytes + sizeInBytes > audioData.length)) { - return ERROR_BAD_VALUE; + return -1; } return native_write_byte(audioData, offsetInBytes, sizeInBytes, mAudioFormat); @@ -851,9 +832,8 @@ public class AudioTrack * @param audioData the array that holds the data to play. * @param offsetInShorts the offset in audioData where the data to play starts. * @param sizeInShorts the number of bytes to read in audioData after the offset. - * @return the number of shorts that were written or {@link #ERROR_INVALID_OPERATION} - * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if - * the parameters don't resolve to valid data and indexes. + * @return the number of shorts that were written or -1 if the object wasn't properly + * initialized. */ public int write(short[] audioData, int offsetInShorts, int sizeInShorts) { @@ -862,14 +842,11 @@ public class AudioTrack && (sizeInShorts > 0)) { mState = STATE_INITIALIZED; } - - if (mState != STATE_INITIALIZED) { - return ERROR_INVALID_OPERATION; - } + //TODO check if future writes should be forbidden for static tracks + // or: how to update data for static tracks? - if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0) - || (offsetInShorts + sizeInShorts > audioData.length)) { - return ERROR_BAD_VALUE; + if (mState != STATE_INITIALIZED) { + return -1; } return native_write_short(audioData, offsetInShorts, sizeInShorts, mAudioFormat); @@ -1030,7 +1007,7 @@ public class AudioTrack private native final int native_set_loop(int start, int end, int loopCount); - static private native final int native_get_output_sample_rate(int streamType); + static private native final int native_get_output_sample_rate(); static private native final int native_get_min_buff_size( int sampleRateInHz, int channelConfig, int audioFormat); diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java index 9de0eec..bfa2f80 100644 --- a/media/java/android/media/JetPlayer.java +++ b/media/java/android/media/JetPlayer.java @@ -25,7 +25,6 @@ import android.content.res.AssetFileDescriptor; import android.os.Looper; import android.os.Handler; import android.os.Message; -import android.util.AndroidRuntimeException; import android.util.Log; /** @@ -164,12 +163,8 @@ public class JetPlayer public boolean loadJetFile(AssetFileDescriptor afd) { - long len = afd.getLength(); - if (len < 0) { - throw new AndroidRuntimeException("no length for fd"); - } return native_loadJetFromFileD( - afd.getFileDescriptor(), afd.getStartOffset(), len); + afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); } @@ -256,9 +251,7 @@ public class JetPlayer mJet, (short)((msg.arg1 & JET_EVENT_SEG_MASK) >> JET_EVENT_SEG_SHIFT), (byte) ((msg.arg1 & JET_EVENT_TRACK_MASK) >> JET_EVENT_TRACK_SHIFT), - // JETCreator channel numbers start at 1, but the index starts at 0 - // in the .jet files - (byte)(((msg.arg1 & JET_EVENT_CHAN_MASK) >> JET_EVENT_CHAN_SHIFT) + 1), + (byte) ((msg.arg1 & JET_EVENT_CHAN_MASK) >> JET_EVENT_CHAN_SHIFT), (byte) ((msg.arg1 & JET_EVENT_CTRL_MASK) >> JET_EVENT_CTRL_SHIFT), (byte) (msg.arg1 & JET_EVENT_VAL_MASK) ); } diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index 3a49a5f..c1a0c21 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -18,7 +18,6 @@ package android.media; import android.content.ContentResolver; import android.content.Context; -import android.content.res.AssetFileDescriptor; import android.graphics.Bitmap; import android.net.Uri; import android.os.ParcelFileDescriptor; @@ -138,11 +137,11 @@ public class MediaMetadataRetriever return; } - AssetFileDescriptor fd = null; + ParcelFileDescriptor fd = null; try { ContentResolver resolver = context.getContentResolver(); try { - fd = resolver.openAssetFileDescriptor(uri, "r"); + fd = resolver.openFileDescriptor(uri, "r"); } catch(FileNotFoundException e) { throw new IllegalArgumentException(); } @@ -153,14 +152,7 @@ public class MediaMetadataRetriever if (!descriptor.valid()) { throw new IllegalArgumentException(); } - // Note: using getDeclaredLength so that our behavior is the same - // as previous versions when the content provider is returning - // a full file. - if (fd.getDeclaredLength() < 0) { - setDataSource(descriptor); - } else { - setDataSource(descriptor, fd.getStartOffset(), fd.getDeclaredLength()); - } + setDataSource(descriptor); return; } catch (SecurityException ex) { } finally { diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index fe1de8e..601557d 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -584,21 +584,14 @@ public class MediaPlayer return; } - AssetFileDescriptor fd = null; + ParcelFileDescriptor fd = null; try { ContentResolver resolver = context.getContentResolver(); - fd = resolver.openAssetFileDescriptor(uri, "r"); + fd = resolver.openFileDescriptor(uri, "r"); if (fd == null) { return; } - // Note: using getDeclaredLength so that our behavior is the same - // as previous versions when the content provider is returning - // a full file. - if (fd.getDeclaredLength() < 0) { - setDataSource(fd.getFileDescriptor()); - } else { - setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getDeclaredLength()); - } + setDataSource(fd.getFileDescriptor()); return; } catch (SecurityException ex) { } catch (IOException ex) { diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 4906cbb..3609826 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -16,27 +16,23 @@ package android.media; -import android.hardware.Camera; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.Log; import android.view.Surface; +import android.hardware.Camera; import java.io.IOException; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileDescriptor; -import java.lang.ref.WeakReference; +import android.util.Log; /** * Used to record audio and video. The recording control is based on a - * simple state machine (see below). - * + * simple state machine (see below). + * * <p><img src="{@docRoot}images/mediarecorder_state_diagram.gif" border="0" /> * </p> - * + * * <p>A common case of using MediaRecorder to record audio works as follows: - * + * * <pre>MediaRecorder recorder = new MediaRecorder(); * recorder.setAudioSource(MediaRecorder.AudioSource.MIC); * recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); @@ -49,54 +45,39 @@ import java.lang.ref.WeakReference; * recorder.reset(); // You can reuse the object by going back to setAudioSource() step * recorder.release(); // Now the object cannot be reused * </pre> - * + * * <p>See the <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a> * documentation for additional help with using MediaRecorder. */ public class MediaRecorder -{ +{ static { System.loadLibrary("media_jni"); } private final static String TAG = "MediaRecorder"; - + // The two fields below are accessed by native methods @SuppressWarnings("unused") private int mNativeContext; - + @SuppressWarnings("unused") private Surface mSurface; private String mPath; private FileDescriptor mFd; - private EventHandler mEventHandler; - private OnErrorListener mOnErrorListener; /** * Default constructor. */ public MediaRecorder() { - - Looper looper; - if ((looper = Looper.myLooper()) != null) { - mEventHandler = new EventHandler(this, looper); - } else if ((looper = Looper.getMainLooper()) != null) { - mEventHandler = new EventHandler(this, looper); - } else { - mEventHandler = null; - } - - /* Native setup requires a weak reference to our object. - * It's easier to create it here than in C++. - */ - native_setup(new WeakReference<MediaRecorder>(this)); + native_setup(); } - + /** * Sets a Camera to use for recording. Use this function to switch * quickly between preview and capture mode without a teardown of * the camera object. Must call before prepare(). - * + * * @param c the Camera to use for recording */ public native void setCamera(Camera c); @@ -105,15 +86,15 @@ public class MediaRecorder * Sets a Surface to show a preview of recorded media (video). Calls this * before prepare() to make sure that the desirable preview display is * set. - * + * * @param sv the Surface to use for the preview */ public void setPreviewDisplay(Surface sv) { mSurface = sv; } - + /** - * Defines the audio source. These constants are used with + * Defines the audio source. These constants are used with * {@link MediaRecorder#setAudioSource(int)}. */ public final class AudioSource { @@ -127,7 +108,7 @@ public class MediaRecorder } /** - * Defines the video source. These constants are used with + * Defines the video source. These constants are used with * {@link MediaRecorder#setVideoSource(int)}. */ public final class VideoSource { @@ -141,7 +122,7 @@ public class MediaRecorder } /** - * Defines the output format. These constants are used with + * Defines the output format. These constants are used with * {@link MediaRecorder#setOutputFormat(int)}. */ public final class OutputFormat { @@ -159,7 +140,7 @@ public class MediaRecorder }; /** - * Defines the audio encoding. These constants are used with + * Defines the audio encoding. These constants are used with * {@link MediaRecorder#setAudioEncoder(int)}. */ public final class AudioEncoder { @@ -174,7 +155,7 @@ public class MediaRecorder } /** - * Defines the video encoding. These constants are used with + * Defines the video encoding. These constants are used with * {@link MediaRecorder#setVideoEncoder(int)}. */ public final class VideoEncoder { @@ -191,50 +172,50 @@ public class MediaRecorder /** * Sets the audio source to be used for recording. If this method is not * called, the output file will not contain an audio track. The source needs - * to be specified before setting recording-parameters or encoders. Call + * to be specified before setting recording-parameters or encoders. Call * this only before setOutputFormat(). - * + * * @param audio_source the audio source to use * @throws IllegalStateException if it is called after setOutputFormat() * @see android.media.MediaRecorder.AudioSource - */ + */ public native void setAudioSource(int audio_source) throws IllegalStateException; /** * Sets the video source to be used for recording. If this method is not * called, the output file will not contain an video track. The source needs - * to be specified before setting recording-parameters or encoders. Call + * to be specified before setting recording-parameters or encoders. Call * this only before setOutputFormat(). - * + * * @param video_source the video source to use * @throws IllegalStateException if it is called after setOutputFormat() * @see android.media.MediaRecorder.VideoSource - */ + */ public native void setVideoSource(int video_source) throws IllegalStateException; /** * Sets the format of the output file produced during recording. Call this * after setAudioSource()/setVideoSource() but before prepare(). - * - * @param output_format the output format to use. The output format + * + * @param output_format the output format to use. The output format * needs to be specified before setting recording-parameters or encoders. * @throws IllegalStateException if it is called after prepare() or before * setAudioSource()/setVideoSource(). * @see android.media.MediaRecorder.OutputFormat - */ + */ public native void setOutputFormat(int output_format) throws IllegalStateException; - + /** * Sets the width and height of the video to be captured. Must be called * after setVideoSource(). Call this after setOutFormat() but before * prepare(). - * + * * @param width the width of the video to be captured * @param height the height of the video to be captured - * @throws IllegalStateException if it is called after + * @throws IllegalStateException if it is called after * prepare() or before setOutputFormat() */ public native void setVideoSize(int width, int height) @@ -246,7 +227,7 @@ public class MediaRecorder * prepare(). * * @param rate the number of frames per second of video to capture - * @throws IllegalStateException if it is called after + * @throws IllegalStateException if it is called after * prepare() or before setOutputFormat(). * * NOTE: On some devices that have auto-frame rate, this sets the @@ -259,12 +240,12 @@ public class MediaRecorder * Sets the audio encoder to be used for recording. If this method is not * called, the output file will not contain an audio track. Call this after * setOutputFormat() but before prepare(). - * + * * @param audio_encoder the audio encoder to use. * @throws IllegalStateException if it is called before * setOutputFormat() or after prepare(). * @see android.media.MediaRecorder.AudioEncoder - */ + */ public native void setAudioEncoder(int audio_encoder) throws IllegalStateException; @@ -272,43 +253,43 @@ public class MediaRecorder * Sets the video encoder to be used for recording. If this method is not * called, the output file will not contain an video track. Call this after * setOutputFormat() and before prepare(). - * + * * @param video_encoder the video encoder to use. * @throws IllegalStateException if it is called before * setOutputFormat() or after prepare() * @see android.media.MediaRecorder.VideoEncoder - */ + */ public native void setVideoEncoder(int video_encoder) throws IllegalStateException; /** * Pass in the file descriptor of the file to be written. Call this after * setOutputFormat() but before prepare(). - * + * * @param fd an open file descriptor to be written into. * @throws IllegalStateException if it is called before * setOutputFormat() or after prepare() - */ + */ public void setOutputFile(FileDescriptor fd) throws IllegalStateException { mPath = null; mFd = fd; } - + /** * Sets the path of the output file to be produced. Call this after * setOutputFormat() but before prepare(). - * + * * @param path The pathname to use. * @throws IllegalStateException if it is called before * setOutputFormat() or after prepare() - */ + */ public void setOutputFile(String path) throws IllegalStateException { mFd = null; mPath = path; } - + // native implementation private native void _setOutputFile(FileDescriptor fd, long offset, long length) throws IllegalStateException, IOException; @@ -318,7 +299,7 @@ public class MediaRecorder * Prepares the recorder to begin capturing and encoding data. This method * must be called after setting up the desired audio and video sources, * encoders, file format, etc., but before start(). - * + * * @throws IllegalStateException if it is called after * start() or before setOutputFormat(). * @throws IOException if prepare fails otherwise. @@ -326,12 +307,8 @@ public class MediaRecorder public void prepare() throws IllegalStateException, IOException { if (mPath != null) { - FileOutputStream fos = new FileOutputStream(mPath); - try { - _setOutputFile(fos.getFD(), 0, 0); - } finally { - fos.close(); - } + FileOutputStream f = new FileOutputStream(mPath); + _setOutputFile(f.getFD(), 0, 0); } else if (mFd != null) { _setOutputFile(mFd, 0, 0); } else { @@ -341,9 +318,9 @@ public class MediaRecorder } /** - * Begins capturing and encoding data to the file specified with + * Begins capturing and encoding data to the file specified with * setOutputFile(). Call this after prepare(). - * + * * @throws IllegalStateException if it is called before * prepare(). */ @@ -352,7 +329,7 @@ public class MediaRecorder /** * Stops recording. Call this after start(). Once recording is stopped, * you will have to configure it again as if it has just been constructed. - * + * * @throws IllegalStateException if it is called before start() */ public native void stop() throws IllegalStateException; @@ -362,118 +339,19 @@ public class MediaRecorder * this method, you will have to configure it again as if it had just been * constructed. */ - public void reset() { - native_reset(); - - // make sure none of the listeners get called anymore - mEventHandler.removeCallbacksAndMessages(null); - } - - private native void native_reset(); - + public native void reset(); + /** - * Returns the maximum absolute amplitude that was sampled since the last + * Returns the maximum absolute amplitude that was sampled since the last * call to this method. Call this only after the setAudioSource(). - * - * @return the maximum absolute amplitude measured since the last call, or + * + * @return the maximum absolute amplitude measured since the last call, or * 0 when called for the first time * @throws IllegalStateException if it is called before * the audio source has been set. */ public native int getMaxAmplitude() throws IllegalStateException; - - /* Do not change this value without updating its counterpart - * in include/media/mediarecorder.h! - */ - /** Unspecified media recorder error. - * @see android.media.MediaRecorder.OnErrorListener - */ - public static final int MEDIA_RECORDER_ERROR_UNKNOWN = 1; - - /** - * Interface definition for a callback to be invoked when an error - * occurs while recording. - */ - public interface OnErrorListener - { - /** - * Called when an error occurs while recording. - * - * @param mr the MediaRecorder that encountered the error - * @param what the type of error that has occurred: - * <ul> - * <li>{@link #MEDIA_RECORDER_ERROR_UNKNOWN} - * </ul> - * @param extra an extra code, specific to the error type - */ - void onError(MediaRecorder mr, int what, int extra); - } - - /** - * Register a callback to be invoked when an error occurs while - * recording. - * - * @param l the callback that will be run - */ - public void setOnErrorListener(OnErrorListener l) - { - mOnErrorListener = l; - } - - private class EventHandler extends Handler - { - private MediaRecorder mMediaRecorder; - - public EventHandler(MediaRecorder mr, Looper looper) { - super(looper); - mMediaRecorder = mr; - } - - /* Do not change this value without updating its counterpart - * in include/media/mediarecorder.h! - */ - private static final int MEDIA_RECORDER_EVENT_ERROR = 1; - - @Override - public void handleMessage(Message msg) { - if (mMediaRecorder.mNativeContext == 0) { - Log.w(TAG, "mediarecorder went away with unhandled events"); - return; - } - switch(msg.what) { - case MEDIA_RECORDER_EVENT_ERROR: - if (mOnErrorListener != null) - mOnErrorListener.onError(mMediaRecorder, msg.arg1, msg.arg2); - - return; - - default: - Log.e(TAG, "Unknown message type " + msg.what); - return; - } - } - } - - /** - * Called from native code when an interesting event happens. This method - * just uses the EventHandler system to post the event back to the main app thread. - * We use a weak reference to the original MediaRecorder object so that the native - * code is safe from the object disappearing from underneath it. (This is - * the cookie passed to native_setup().) - */ - private static void postEventFromNative(Object mediarecorder_ref, - int what, int arg1, int arg2, Object obj) - { - MediaRecorder mr = (MediaRecorder)((WeakReference)mediarecorder_ref).get(); - if (mr == null) { - return; - } - - if (mr.mEventHandler != null) { - Message m = mr.mEventHandler.obtainMessage(what, arg1, arg2, obj); - mr.mEventHandler.sendMessage(m); - } - } + /** * Releases resources associated with this MediaRecorder object. @@ -482,10 +360,10 @@ public class MediaRecorder */ public native void release(); - private native final void native_setup(Object mediarecorder_this) throws IllegalStateException; - + private native final void native_setup() throws IllegalStateException; + private native final void native_finalize(); - + @Override protected void finalize() { native_finalize(); } } diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index e80d8aa..cfcb5eb 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -164,16 +164,9 @@ public class Ringtone { } else if (mFileDescriptor != null) { mAudio.setDataSource(mFileDescriptor); } else if (mAssetFileDescriptor != null) { - // Note: using getDeclaredLength so that our behavior is the same - // as previous versions when the content provider is returning - // a full file. - if (mAssetFileDescriptor.getDeclaredLength() < 0) { - mAudio.setDataSource(mAssetFileDescriptor.getFileDescriptor()); - } else { - mAudio.setDataSource(mAssetFileDescriptor.getFileDescriptor(), - mAssetFileDescriptor.getStartOffset(), - mAssetFileDescriptor.getDeclaredLength()); - } + mAudio.setDataSource(mAssetFileDescriptor.getFileDescriptor(), + mAssetFileDescriptor.getStartOffset(), + mAssetFileDescriptor.getLength()); } else { throw new IOException("No data source set."); } diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java index 000430f..427f173 100644 --- a/media/java/android/media/SoundPool.java +++ b/media/java/android/media/SoundPool.java @@ -16,7 +16,6 @@ package android.media; -import android.util.AndroidRuntimeException; import android.util.Log; import java.io.File; import java.io.FileDescriptor; @@ -80,11 +79,7 @@ public class SoundPool public int load(AssetFileDescriptor afd, int priority) { if (afd != null) { - long len = afd.getLength(); - if (len < 0) { - throw new AndroidRuntimeException("no length for fd"); - } - return _load(afd.getFileDescriptor(), afd.getStartOffset(), len, priority); + return _load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(), priority); } else { return 0; } diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp index 44f875c..095749b 100644 --- a/media/jni/android_media_MediaRecorder.cpp +++ b/media/jni/android_media_MediaRecorder.cpp @@ -41,68 +41,16 @@ using namespace android; // ---------------------------------------------------------------------------- // helper function to extract a native Camera object from a Camera Java object -extern sp<Camera> get_native_camera(JNIEnv *env, jobject thiz, struct camera_context_t** context); +extern sp<Camera> get_native_camera(JNIEnv *env, jobject thiz); struct fields_t { jfieldID context; jfieldID surface; /* actually in android.view.Surface XXX */ jfieldID surface_native; - - jmethodID post_event; }; static fields_t fields; -static Mutex sLock; - -// ---------------------------------------------------------------------------- -// ref-counted object for callbacks -class JNIMediaRecorderListener: public MediaRecorderListener -{ -public: - JNIMediaRecorderListener(JNIEnv* env, jobject thiz, jobject weak_thiz); - ~JNIMediaRecorderListener(); - void notify(int msg, int ext1, int ext2); -private: - JNIMediaRecorderListener(); - jclass mClass; // Reference to MediaRecorder class - jobject mObject; // Weak ref to MediaRecorder Java object to call on -}; - -JNIMediaRecorderListener::JNIMediaRecorderListener(JNIEnv* env, jobject thiz, jobject weak_thiz) -{ - - // Hold onto the MediaRecorder class for use in calling the static method - // that posts events to the application thread. - jclass clazz = env->GetObjectClass(thiz); - if (clazz == NULL) { - LOGE("Can't find android/media/MediaRecorder"); - jniThrowException(env, "java/lang/Exception", NULL); - return; - } - mClass = (jclass)env->NewGlobalRef(clazz); - - // We use a weak reference so the MediaRecorder object can be garbage collected. - // The reference is only used as a proxy for callbacks. - mObject = env->NewGlobalRef(weak_thiz); -} - -JNIMediaRecorderListener::~JNIMediaRecorderListener() -{ - // remove global references - JNIEnv *env = AndroidRuntime::getJNIEnv(); - env->DeleteGlobalRef(mObject); - env->DeleteGlobalRef(mClass); -} - -void JNIMediaRecorderListener::notify(int msg, int ext1, int ext2) -{ - LOGV("JNIMediaRecorderListener::notify"); - - JNIEnv *env = AndroidRuntime::getJNIEnv(); - env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, 0); -} - // ---------------------------------------------------------------------------- static sp<Surface> get_surface(JNIEnv* env, jobject clazz) @@ -126,32 +74,10 @@ static bool process_media_recorder_call(JNIEnv *env, status_t opStatus, const ch return false; } -static sp<MediaRecorder> getMediaRecorder(JNIEnv* env, jobject thiz) -{ - Mutex::Autolock l(sLock); - MediaRecorder* const p = (MediaRecorder*)env->GetIntField(thiz, fields.context); - return sp<MediaRecorder>(p); -} - -static sp<MediaRecorder> setMediaRecorder(JNIEnv* env, jobject thiz, const sp<MediaRecorder>& recorder) -{ - Mutex::Autolock l(sLock); - sp<MediaRecorder> old = (MediaRecorder*)env->GetIntField(thiz, fields.context); - if (recorder.get()) { - recorder->incStrong(thiz); - } - if (old != 0) { - old->decStrong(thiz); - } - env->SetIntField(thiz, fields.context, (int)recorder.get()); - return old; -} - - static void android_media_MediaRecorder_setCamera(JNIEnv* env, jobject thiz, jobject camera) { - sp<Camera> c = get_native_camera(env, camera, NULL); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + sp<Camera> c = get_native_camera(env, camera); + MediaRecorder *mr = (MediaRecorder*)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setCamera(c->remote()), "java/lang/RuntimeException", "setCamera failed."); } @@ -164,7 +90,7 @@ android_media_MediaRecorder_setVideoSource(JNIEnv *env, jobject thiz, jint vs) jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid video source"); return; } - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setVideoSource(vs), "java/lang/RuntimeException", "setVideoSource failed."); } @@ -176,7 +102,7 @@ android_media_MediaRecorder_setAudioSource(JNIEnv *env, jobject thiz, jint as) jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid audio source"); return; } - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setAudioSource(as), "java/lang/RuntimeException", "setAudioSource failed."); } @@ -188,7 +114,7 @@ android_media_MediaRecorder_setOutputFormat(JNIEnv *env, jobject thiz, jint of) jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid output format"); return; } - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setOutputFormat(of), "java/lang/RuntimeException", "setOutputFormat failed."); } @@ -200,7 +126,7 @@ android_media_MediaRecorder_setVideoEncoder(JNIEnv *env, jobject thiz, jint ve) jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid video encoder"); return; } - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setVideoEncoder(ve), "java/lang/RuntimeException", "setVideoEncoder failed."); } @@ -212,7 +138,7 @@ android_media_MediaRecorder_setAudioEncoder(JNIEnv *env, jobject thiz, jint ae) jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid audio encoder"); return; } - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setAudioEncoder(ae), "java/lang/RuntimeException", "setAudioEncoder failed."); } @@ -225,7 +151,7 @@ android_media_MediaRecorder_setOutputFileFD(JNIEnv *env, jobject thiz, jobject f return; } int fd = getParcelFileDescriptorFD(env, fileDescriptor); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); status_t opStatus = mr->setOutputFile(fd, offset, length); process_media_recorder_call(env, opStatus, "java/io/IOException", "setOutputFile failed."); } @@ -234,7 +160,7 @@ static void android_media_MediaRecorder_setVideoSize(JNIEnv *env, jobject thiz, jint width, jint height) { LOGV("setVideoSize(%d, %d)", width, height); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); if (width <= 0 || height <= 0) { jniThrowException(env, "java/lang/IllegalArgumentException", "invalid video size"); @@ -251,7 +177,7 @@ android_media_MediaRecorder_setVideoFrameRate(JNIEnv *env, jobject thiz, jint ra jniThrowException(env, "java/lang/IllegalArgumentException", "invalid frame rate"); return; } - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->setVideoFrameRate(rate), "java/lang/RuntimeException", "setVideoFrameRate failed."); } @@ -259,7 +185,7 @@ static void android_media_MediaRecorder_prepare(JNIEnv *env, jobject thiz) { LOGV("prepare"); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); jobject surface = env->GetObjectField(thiz, fields.surface); if (surface != NULL) { @@ -276,7 +202,7 @@ static int android_media_MediaRecorder_native_getMaxAmplitude(JNIEnv *env, jobject thiz) { LOGV("getMaxAmplitude"); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); int result = 0; process_media_recorder_call(env, mr->getMaxAmplitude(&result), "java/lang/RuntimeException", "getMaxAmplitude failed."); return result; @@ -286,7 +212,7 @@ static void android_media_MediaRecorder_start(JNIEnv *env, jobject thiz) { LOGV("start"); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->start(), "java/lang/RuntimeException", "start failed."); } @@ -294,54 +220,46 @@ static void android_media_MediaRecorder_stop(JNIEnv *env, jobject thiz) { LOGV("stop"); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); process_media_recorder_call(env, mr->stop(), "java/lang/RuntimeException", "stop failed."); } static void -android_media_MediaRecorder_native_reset(JNIEnv *env, jobject thiz) +android_media_MediaRecorder_reset(JNIEnv *env, jobject thiz) { - LOGV("native_reset"); - sp<MediaRecorder> mr = getMediaRecorder(env, thiz); - process_media_recorder_call(env, mr->reset(), "java/lang/RuntimeException", "native_reset failed."); + LOGV("reset"); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); + process_media_recorder_call(env, mr->reset(), "java/lang/RuntimeException", "reset failed."); } static void android_media_MediaRecorder_release(JNIEnv *env, jobject thiz) { LOGV("release"); - sp<MediaRecorder> mr = setMediaRecorder(env, thiz, 0); - if (mr != NULL) { - mr->setListener(NULL); - } + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); + env->SetIntField(thiz, fields.context, 0); + delete mr; } static void -android_media_MediaRecorder_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) +android_media_MediaRecorder_native_setup(JNIEnv *env, jobject thiz) { LOGV("setup"); - sp<MediaRecorder> mr = new MediaRecorder(); - if (mr == NULL) { - jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); - return; - } - if (mr->initCheck() != NO_ERROR) { + MediaRecorder *mr = new MediaRecorder(); + if (mr->initCheck() == NO_ERROR) { + env->SetIntField(thiz, fields.context, (int)mr); + } else { + delete mr; jniThrowException(env, "java/lang/IOException", "Unable to initialize camera"); - return; } - - // create new listener and give it to MediaRecorder - sp<JNIMediaRecorderListener> listener = new JNIMediaRecorderListener(env, thiz, weak_this); - mr->setListener(listener); - - setMediaRecorder(env, thiz, mr); } static void android_media_MediaRecorder_native_finalize(JNIEnv *env, jobject thiz) { LOGV("finalize"); - android_media_MediaRecorder_release(env, thiz); + MediaRecorder *mr = (MediaRecorder *)env->GetIntField(thiz, fields.context); + delete mr; } // ---------------------------------------------------------------------------- @@ -360,9 +278,9 @@ static JNINativeMethod gMethods[] = { {"getMaxAmplitude", "()I", (void *)android_media_MediaRecorder_native_getMaxAmplitude}, {"start", "()V", (void *)android_media_MediaRecorder_start}, {"stop", "()V", (void *)android_media_MediaRecorder_stop}, - {"native_reset", "()V", (void *)android_media_MediaRecorder_native_reset}, + {"reset", "()V", (void *)android_media_MediaRecorder_reset}, {"release", "()V", (void *)android_media_MediaRecorder_release}, - {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaRecorder_native_setup}, + {"native_setup", "()V", (void *)android_media_MediaRecorder_native_setup}, {"native_finalize", "()V", (void *)android_media_MediaRecorder_native_finalize}, }; @@ -402,13 +320,6 @@ int register_android_media_MediaRecorder(JNIEnv *env) return -1; } - fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", - "(Ljava/lang/Object;IIILjava/lang/Object;)V"); - if (fields.post_event == NULL) { - LOGE("Can't find MediaRecorder.postEventFromNative"); - return -1; - } - return AndroidRuntime::registerNativeMethods(env, "android/media/MediaRecorder", gMethods, NELEM(gMethods)); } diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 7594ff0..e833c85 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -128,23 +128,8 @@ status_t AudioRecord::set( return BAD_VALUE; } - // validate framecount - size_t inputBuffSizeInBytes = -1; - if (AudioSystem::getInputBufferSize(sampleRate, format, channelCount, &inputBuffSizeInBytes) - != NO_ERROR) { - LOGE("AudioSystem could not query the input buffer size."); - return NO_INIT; - } - if (inputBuffSizeInBytes == 0) { - LOGE("Recording parameters are not supported: sampleRate %d, channelCount %d, format %d", - sampleRate, channelCount, format); - return BAD_VALUE; - } - int frameSizeInBytes = channelCount * (format == AudioSystem::PCM_16_BIT ? 2 : 1); - - // We use 2* size of input buffer for ping pong use of record buffer. - int minFrameCount = 2 * inputBuffSizeInBytes / frameSizeInBytes; - LOGV("AudioRecord::set() minFrameCount = %d", minFrameCount); + // TODO: Get input frame count from hardware. + int minFrameCount = 1024*2; if (frameCount == 0) { frameCount = minFrameCount; @@ -159,11 +144,7 @@ status_t AudioRecord::set( // open record channel status_t status; sp<IAudioRecord> record = audioFlinger->openRecord(getpid(), streamType, - sampleRate, format, - channelCount, - frameCount, - ((uint16_t)flags) << 16, - &status); + sampleRate, format, channelCount, frameCount, flags, &status); if (record == 0) { LOGE("AudioFlinger could not create record track, status: %d", status); return status; diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 2274521..f8520a7 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -168,8 +168,6 @@ status_t AudioTrack::set( // Ensure that buffer depth covers at least audio hardware latency uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate); - if (minBufCount < 2) minBufCount = 2; - // When playing from shared buffer, playback will start even if last audioflinger // block is partly filled. if (sharedBuffer != 0 && minBufCount > 1) { @@ -439,8 +437,8 @@ void AudioTrack::setSampleRate(int rate) return; } // Resampler implementation limits input sampling rate to 2 x output sampling rate. - if (rate <= 0) rate = 1; if (rate > afSamplingRate*2) rate = afSamplingRate*2; + if (rate > MAX_SAMPLE_RATE) rate = MAX_SAMPLE_RATE; mCblk->sampleRate = rate; @@ -468,15 +466,10 @@ status_t AudioTrack::setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount if (loopStart >= loopEnd || loopEnd - loopStart > mFrameCount) { - LOGE("setLoop invalid value: loopStart %d, loopEnd %d, loopCount %d, framecount %d, user %d", loopStart, loopEnd, loopCount, mFrameCount, cblk->user); + LOGW("setLoop invalid value: loopStart %d, loopEnd %d, loopCount %d, framecount %d, user %d", loopStart, loopEnd, loopCount, mFrameCount, cblk->user); return BAD_VALUE; } - - if ((mSharedBuffer != 0) && (loopEnd > mFrameCount)) { - LOGE("setLoop invalid value: loop markers beyond data: loopStart %d, loopEnd %d, framecount %d", - loopStart, loopEnd, mFrameCount); - return BAD_VALUE; - } + // TODO handle shared buffer here: limit loop end to framecount cblk->loopStart = loopStart; cblk->loopEnd = loopEnd; diff --git a/media/libmedia/IMediaRecorder.cpp b/media/libmedia/IMediaRecorder.cpp index f187bf5..507d03e 100644 --- a/media/libmedia/IMediaRecorder.cpp +++ b/media/libmedia/IMediaRecorder.cpp @@ -21,7 +21,6 @@ #include <utils/Parcel.h> #include <ui/ISurface.h> #include <ui/ICamera.h> -#include <media/IMediaPlayerClient.h> #include <media/IMediaRecorder.h> namespace android { @@ -45,8 +44,7 @@ enum { SET_VIDEO_SIZE, SET_VIDEO_FRAMERATE, SET_PREVIEW_SURFACE, - SET_CAMERA, - SET_LISTENER + SET_CAMERA }; class BpMediaRecorder: public BpInterface<IMediaRecorder> @@ -178,16 +176,6 @@ public: return reply.readInt32(); } - status_t setListener(const sp<IMediaPlayerClient>& listener) - { - LOGV("setListener(%p)", listener.get()); - Parcel data, reply; - data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); - data.writeStrongBinder(listener->asBinder()); - remote()->transact(SET_LISTENER, data, &reply); - return reply.readInt32(); - } - status_t prepare() { LOGV("prepare"); @@ -385,14 +373,6 @@ status_t BnMediaRecorder::onTransact( reply->writeInt32(setVideoFrameRate(frames_per_second)); return NO_ERROR; } break; - case SET_LISTENER: { - LOGV("SET_LISTENER"); - CHECK_INTERFACE(IMediaRecorder, data, reply); - sp<IMediaPlayerClient> listener = - interface_cast<IMediaPlayerClient>(data.readStrongBinder()); - reply->writeInt32(setListener(listener)); - return NO_ERROR; - } break; case SET_PREVIEW_SURFACE: { LOGV("SET_PREVIEW_SURFACE"); CHECK_INTERFACE(IMediaRecorder, data, reply); diff --git a/media/libmedia/mediarecorder.cpp b/media/libmedia/mediarecorder.cpp index 98aac39..4ab26ac 100644 --- a/media/libmedia/mediarecorder.cpp +++ b/media/libmedia/mediarecorder.cpp @@ -58,10 +58,6 @@ status_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface) LOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState); return INVALID_OPERATION; } - if (!mIsVideoSourceSet) { - LOGE("try to set preview surface without setting the video source first"); - return INVALID_OPERATION; - } status_t ret = mMediaRecorder->setPreviewSurface(surface->getISurface()); if (OK != ret) { @@ -90,14 +86,6 @@ status_t MediaRecorder::init() mCurrentState = MEDIA_RECORDER_ERROR; return UNKNOWN_ERROR; } - - ret = mMediaRecorder->setListener(this); - if (OK != ret) { - LOGV("setListener failed: %d", ret); - mCurrentState = MEDIA_RECORDER_ERROR; - return UNKNOWN_ERROR; - } - mCurrentState = MEDIA_RECORDER_INITIALIZED; return ret; } @@ -179,10 +167,6 @@ status_t MediaRecorder::setOutputFormat(int of) LOGE("setOutputFormat called in an invalid state: %d", mCurrentState); return INVALID_OPERATION; } - if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_RAW_AMR) { - LOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of); - return INVALID_OPERATION; - } status_t ret = mMediaRecorder->setOutputFormat(of); if (OK != ret) { @@ -201,10 +185,6 @@ status_t MediaRecorder::setVideoEncoder(int ve) LOGE("media recorder is not initialized yet"); return INVALID_OPERATION; } - if (!mIsVideoSourceSet) { - LOGE("try to set the video encoder without setting the video source first"); - return INVALID_OPERATION; - } if (mIsVideoEncoderSet) { LOGE("video encoder has already been set"); return INVALID_OPERATION; @@ -231,10 +211,6 @@ status_t MediaRecorder::setAudioEncoder(int ae) LOGE("media recorder is not initialized yet"); return INVALID_OPERATION; } - if (!mIsAudioSourceSet) { - LOGE("try to set the audio encoder without setting the audio source first"); - return INVALID_OPERATION; - } if (mIsAudioEncoderSet) { LOGE("audio encoder has already been set"); return INVALID_OPERATION; @@ -317,10 +293,6 @@ status_t MediaRecorder::setVideoSize(int width, int height) LOGE("setVideoSize called in an invalid state: %d", mCurrentState); return INVALID_OPERATION; } - if (!mIsVideoSourceSet) { - LOGE("try to set video size without setting video source first"); - return INVALID_OPERATION; - } status_t ret = mMediaRecorder->setVideoSize(width, height); if (OK != ret) { @@ -342,10 +314,6 @@ status_t MediaRecorder::setVideoFrameRate(int frames_per_second) LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState); return INVALID_OPERATION; } - if (!mIsVideoSourceSet) { - LOGE("try to set video frame rate without setting video source first"); - return INVALID_OPERATION; - } status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second); if (OK != ret) { @@ -367,23 +335,6 @@ status_t MediaRecorder::prepare() LOGE("prepare called in an invalid state: %d", mCurrentState); return INVALID_OPERATION; } - if (mIsAudioSourceSet != mIsAudioEncoderSet) { - if (mIsAudioSourceSet) { - LOGE("audio source is set, but audio encoder is not set"); - } else { // must not happen, since setAudioEncoder checks this already - LOGE("audio encoder is set, but audio source is not set"); - } - return INVALID_OPERATION; - } - - if (mIsVideoSourceSet != mIsVideoEncoderSet) { - if (mIsVideoSourceSet) { - LOGE("video source is set, but video encoder is not set"); - } else { // must not happen, since setVideoEncoder checks this already - LOGE("video encoder is set, but video source is not set"); - } - return INVALID_OPERATION; - } status_t ret = mMediaRecorder->prepare(); if (OK != ret) { @@ -587,31 +538,5 @@ MediaRecorder::~MediaRecorder() } } -status_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener) -{ - LOGV("setListener"); - Mutex::Autolock _l(mLock); - mListener = listener; - - return NO_ERROR; -} - -void MediaRecorder::notify(int msg, int ext1, int ext2) -{ - LOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2); - - sp<MediaRecorderListener> listener; - mLock.lock(); - listener = mListener; - mLock.unlock(); - - if (listener != NULL) { - Mutex::Autolock _l(mNotifyLock); - LOGV("callback application"); - listener->notify(msg, ext1, ext2); - LOGV("back from callback"); - } -} - }; // namespace android diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 40705c6..97e3536 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -218,104 +218,6 @@ static int myTid() { #endif } -#if defined(__arm__) -extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overallSize, - size_t* infoSize, size_t* totalMemory, size_t* backtraceSize); -extern "C" void free_malloc_leak_info(uint8_t* info); - -void memStatus(int fd, const Vector<String16>& args) -{ - const size_t SIZE = 256; - char buffer[SIZE]; - String8 result; - - typedef struct { - size_t size; - size_t dups; - intptr_t * backtrace; - } AllocEntry; - - uint8_t *info = NULL; - size_t overallSize = 0; - size_t infoSize = 0; - size_t totalMemory = 0; - size_t backtraceSize = 0; - - get_malloc_leak_info(&info, &overallSize, &infoSize, &totalMemory, &backtraceSize); - if (info) { - uint8_t *ptr = info; - size_t count = overallSize / infoSize; - - snprintf(buffer, SIZE, " Allocation count %i\n", count); - result.append(buffer); - - AllocEntry * entries = new AllocEntry[count]; - - for (size_t i = 0; i < count; i++) { - // Each entry should be size_t, size_t, intptr_t[backtraceSize] - AllocEntry *e = &entries[i]; - - e->size = *reinterpret_cast<size_t *>(ptr); - ptr += sizeof(size_t); - - e->dups = *reinterpret_cast<size_t *>(ptr); - ptr += sizeof(size_t); - - e->backtrace = reinterpret_cast<intptr_t *>(ptr); - ptr += sizeof(intptr_t) * backtraceSize; - } - - // Now we need to sort the entries. They come sorted by size but - // not by stack trace which causes problems using diff. - bool moved; - do { - moved = false; - for (size_t i = 0; i < (count - 1); i++) { - AllocEntry *e1 = &entries[i]; - AllocEntry *e2 = &entries[i+1]; - - bool swap = e1->size < e2->size; - if (e1->size == e2->size) { - for(size_t j = 0; j < backtraceSize; j++) { - if (e1->backtrace[j] == e2->backtrace[j]) { - continue; - } - swap = e1->backtrace[j] < e2->backtrace[j]; - break; - } - } - if (swap) { - AllocEntry t = entries[i]; - entries[i] = entries[i+1]; - entries[i+1] = t; - moved = true; - } - } - } while (moved); - - for (size_t i = 0; i < count; i++) { - AllocEntry *e = &entries[i]; - - snprintf(buffer, SIZE, "size %8i, dup %4i", e->size, e->dups); - result.append(buffer); - for (size_t ct = 0; (ct < backtraceSize) && e->backtrace[ct]; ct++) { - if (ct) { - result.append(", "); - } - snprintf(buffer, SIZE, "0x%08x", e->backtrace[ct]); - result.append(buffer); - } - result.append("\n"); - } - - delete[] entries; - free_malloc_leak_info(info); - } - - write(fd, result.string(), result.size()); -} -#endif - status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) { const size_t SIZE = 256; @@ -398,18 +300,6 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) result.append(buffer); result.append("\n"); } - -#if defined(__arm__) - bool dumpMem = false; - for (size_t i = 0; i < args.size(); i++) { - if (args[i] == String16("-m")) { - dumpMem = true; - } - } - if (dumpMem) { - memStatus(fd, args); - } -#endif } write(fd, result.string(), result.size()); return NO_ERROR; diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp index 4b45acb..e8ba17f 100644 --- a/media/libmediaplayerservice/MediaRecorderClient.cpp +++ b/media/libmediaplayerservice/MediaRecorderClient.cpp @@ -258,16 +258,5 @@ MediaRecorderClient::~MediaRecorderClient() release(); } -status_t MediaRecorderClient::setListener(const sp<IMediaPlayerClient>& listener) -{ - LOGV("setListener"); - Mutex::Autolock lock(mLock); - if (mRecorder == NULL) { - LOGE("recorder is not initialized"); - return NO_INIT; - } - return mRecorder->setListener(listener); -} - }; // namespace android diff --git a/media/libmediaplayerservice/MediaRecorderClient.h b/media/libmediaplayerservice/MediaRecorderClient.h index 93fd802..2b80c10 100644 --- a/media/libmediaplayerservice/MediaRecorderClient.h +++ b/media/libmediaplayerservice/MediaRecorderClient.h @@ -39,7 +39,6 @@ public: virtual status_t setOutputFile(int fd, int64_t offset, int64_t length); virtual status_t setVideoSize(int width, int height); virtual status_t setVideoFrameRate(int frames_per_second); - virtual status_t setListener(const sp<IMediaPlayerClient>& listener); virtual status_t prepare(); virtual status_t getMaxAmplitude(int* max); virtual status_t start(); diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java index 73688cc..453a165 100755 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java @@ -47,9 +47,9 @@ public class MediaFrameworkTestRunner extends InstrumentationTestRunner { suite.addTestSuite(MediaPlayerApiTest.class); suite.addTestSuite(SimTonesTest.class); suite.addTestSuite(MediaMetadataTest.class); - suite.addTestSuite(CameraTest.class); + // suite.addTestSuite(CameraTest.class); suite.addTestSuite(MediaRecorderTest.class); - //suite.addTestSuite(MediaAudioTrackTest.class); + suite.addTestSuite(MediaAudioTrackTest.class); return suite; } @@ -59,4 +59,3 @@ public class MediaFrameworkTestRunner extends InstrumentationTestRunner { } } - diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java index 59803f7..5981a13 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java @@ -136,13 +136,11 @@ public class CameraTest extends ActivityInstrumentationTestCase<MediaFrameworkTe //Implement the RawPictureCallback private final class RawPictureCallback implements PictureCallback { public void onPictureTaken(byte [] rawData, Camera camera) { - // no support for raw data - success if we get the callback - rawPictureCallbackResult = true; - //if (rawData != null) { - // rawPictureCallbackResult = true; - //} else { - // rawPictureCallbackResult = false; - //} + if (rawData != null) { + rawPictureCallbackResult = true; + } else { + rawPictureCallbackResult = false; + } Log.v(TAG, "RawPictureCallback callback"); } }; diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java index 24edb65..b6a0848 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java @@ -34,7 +34,7 @@ import android.test.suitebuilder.annotation.Suppress; */ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { - private String TAG = "MediaAudioTrackTest"; + private String TAG = "MediaAudioTrack"; public MediaAudioTrackTest() { super("com.android.mediaframeworktest", MediaFrameworkTest.class); @@ -50,18 +50,6 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF super.tearDown(); } - private static void assumeTrue(String message, boolean cond) { - assertTrue("(assume)"+message, cond); - } - - private void log(String testName, String message) { - Log.v(TAG, "["+testName+"] "+message); - } - - private void loge(String testName, String message) { - Log.e(TAG, "["+testName+"] "+message); - } - //----------------------------------------------------------------- // private class to hold test reslts public class TestResults { @@ -74,8 +62,7 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF // generic test methods public TestResults constructorTestMultiSampleRate( // parameters tested by this method - int _inTest_streamType, int _inTest_mode, - int _inTest_config, int _inTest_format, + int _inTest_streamType, int _inTest_mode, int _inTest_config, // parameter-dependent expected results int _expected_stateForMode) { @@ -83,7 +70,7 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF String failedRates = "Failure for rate(s): "; boolean localRes, finalRes = true; - for (int i = 0 ; i < testSampleRates.length ; i++) { + for(int i = 0 ; i < testSampleRates.length ; i++) { //Log.v("MediaAudioTrackTest", "[ constructorTestMultiSampleRate ] testing "+ testSampleRates[i]); AudioTrack track = null; try { @@ -91,16 +78,15 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF _inTest_streamType, testSampleRates[i], _inTest_config, - _inTest_format, + AudioFormat.ENCODING_PCM_16BIT, AudioTrack.getMinBufferSize(testSampleRates[i], - _inTest_config, _inTest_format), + _inTest_config, AudioFormat.ENCODING_PCM_16BIT),//testSampleRates[i]*4 _inTest_mode); } catch(IllegalArgumentException iae) { Log.e("MediaAudioTrackTest", "[ constructorTestMultiSampleRate ] exception at SR " + testSampleRates[i]+": \n" + iae); - localRes = false; } - if (track != null) { + if(track != null) { localRes = (track.getState() == _expected_stateForMode); track.release(); } @@ -112,11 +98,11 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF //log the error for the test runner failedRates += Integer.toString(testSampleRates[i]) + "Hz "; //log the error for logcat - log("constructorTestMultiSampleRate", "failed to construct " + Log.e("MediaAudioTrackTest", "[ constructorTestMultiSampleRate ] failed to construct " +"AudioTrack(streamType="+_inTest_streamType +", sampleRateInHz=" + testSampleRates[i] +", channelConfig=" + _inTest_config - +", audioFormat=" + _inTest_format + +", audioFormat=AudioFormat.ENCODING_PCM_16BIT" +", bufferSizeInBytes=" + AudioTrack.getMinBufferSize(testSampleRates[i], _inTest_config, AudioFormat.ENCODING_PCM_16BIT) +", mode="+ _inTest_mode ); @@ -132,16 +118,16 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF //---------------------------------- //----------------------------------------------------------------- - // AudioTrack constructor and AudioTrack.getMinBufferSize(...) for 16bit PCM + // AudioTrack constructor and AudioTrack.getMinBufferSize(...) //---------------------------------- //Test case 1: constructor for streaming AudioTrack, mono, 16bit at misc valid sample rates - @LargeTest + @MediumTest public void testConstructorMono16MusicStream() throws Exception { TestResults res = constructorTestMultiSampleRate( AudioManager.STREAM_MUSIC, AudioTrack.MODE_STREAM, - AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, + AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioTrack.STATE_INITIALIZED); assertTrue("testConstructorMono16MusicStream: " + res.mResultLog, res.mResult); @@ -149,12 +135,12 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF //Test case 2: constructor for streaming AudioTrack, stereo, 16bit at misc valid sample rates - @LargeTest + @MediumTest public void testConstructorStereo16MusicStream() throws Exception { TestResults res = constructorTestMultiSampleRate( AudioManager.STREAM_MUSIC, AudioTrack.MODE_STREAM, - AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, + AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioTrack.STATE_INITIALIZED); assertTrue("testConstructorStereo16MusicStream: " + res.mResultLog, res.mResult); @@ -162,12 +148,12 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF //Test case 3: constructor for static AudioTrack, mono, 16bit at misc valid sample rates - @LargeTest + @MediumTest public void testConstructorMono16MusicStatic() throws Exception { TestResults res = constructorTestMultiSampleRate( AudioManager.STREAM_MUSIC, AudioTrack.MODE_STATIC, - AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, + AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioTrack.STATE_NO_STATIC_DATA); assertTrue("testConstructorMono16MusicStatic: " + res.mResultLog, res.mResult); @@ -175,723 +161,16 @@ public class MediaAudioTrackTest extends ActivityInstrumentationTestCase2<MediaF //Test case 4: constructor for static AudioTrack, stereo, 16bit at misc valid sample rates - @LargeTest + @MediumTest public void testConstructorStereo16MusicStatic() throws Exception { TestResults res = constructorTestMultiSampleRate( AudioManager.STREAM_MUSIC, AudioTrack.MODE_STATIC, - AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, + AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioTrack.STATE_NO_STATIC_DATA); assertTrue("testConstructorStereo16MusicStatic: " + res.mResultLog, res.mResult); } - - - //----------------------------------------------------------------- - // AudioTrack constructor and AudioTrack.getMinBufferSize(...) for 8bit PCM - //---------------------------------- - - //Test case 1: constructor for streaming AudioTrack, mono, 8bit at misc valid sample rates - @LargeTest - public void testConstructorMono8MusicStream() throws Exception { - - TestResults res = constructorTestMultiSampleRate( - AudioManager.STREAM_MUSIC, AudioTrack.MODE_STREAM, - AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT, - AudioTrack.STATE_INITIALIZED); - - assertTrue("testConstructorMono8MusicStream: " + res.mResultLog, res.mResult); - } - - //Test case 2: constructor for streaming AudioTrack, stereo, 8bit at misc valid sample rates - @LargeTest - public void testConstructorStereo8MusicStream() throws Exception { - - TestResults res = constructorTestMultiSampleRate( - AudioManager.STREAM_MUSIC, AudioTrack.MODE_STREAM, - AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_8BIT, - AudioTrack.STATE_INITIALIZED); - - assertTrue("testConstructorStereo8MusicStream: " + res.mResultLog, res.mResult); - } - - //Test case 3: constructor for static AudioTrack, mono, 8bit at misc valid sample rates - @LargeTest - public void testConstructorMono8MusicStatic() throws Exception { - - TestResults res = constructorTestMultiSampleRate( - AudioManager.STREAM_MUSIC, AudioTrack.MODE_STATIC, - AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT, - AudioTrack.STATE_NO_STATIC_DATA); - - assertTrue("testConstructorMono8MusicStatic: " + res.mResultLog, res.mResult); - } - - //Test case 4: constructor for static AudioTrack, stereo, 8bit at misc valid sample rates - @LargeTest - public void testConstructorStereo8MusicStatic() throws Exception { - - TestResults res = constructorTestMultiSampleRate( - AudioManager.STREAM_MUSIC, AudioTrack.MODE_STATIC, - AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_8BIT, - AudioTrack.STATE_NO_STATIC_DATA); - - assertTrue("testConstructorStereo8MusicStatic: " + res.mResultLog, res.mResult); - } - - - //----------------------------------------------------------------- - // AudioTrack constructor for all stream types - //---------------------------------- - - //Test case 1: constructor for all stream types - @LargeTest - public void testConstructorStreamType() throws Exception { - // constants for test - final int TYPE_TEST_SR = 22050; - final int TYPE_TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TYPE_TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TYPE_TEST_MODE = AudioTrack.MODE_STREAM; - final int[] STREAM_TYPES = { AudioManager.STREAM_ALARM, AudioManager.STREAM_BLUETOOTH_SCO, - AudioManager.STREAM_MUSIC, AudioManager.STREAM_NOTIFICATION, - AudioManager.STREAM_RING, AudioManager.STREAM_SYSTEM, - AudioManager.STREAM_VOICE_CALL }; - final String[] STREAM_NAMES = { "STREAM_ALARM", "STREAM_BLUETOOTH_SCO", "STREAM_MUSIC", - "STREAM_NOTIFICATION", "STREAM_RING", "STREAM_SYSTEM", "STREAM_VOICE_CALL" }; - - boolean localTestRes = true; - AudioTrack track = null; - // test: loop constructor on all stream types - for (int i = 0 ; i < STREAM_TYPES.length ; i++) - { - try { - //-------- initialization -------------- - track = new AudioTrack(STREAM_TYPES[i], - TYPE_TEST_SR, TYPE_TEST_CONF, TYPE_TEST_FORMAT, - AudioTrack.getMinBufferSize(TYPE_TEST_SR, TYPE_TEST_CONF, TYPE_TEST_FORMAT), - TYPE_TEST_MODE); - } catch (IllegalArgumentException iae) { - loge("testConstructorStreamType", "exception for stream type " - + STREAM_NAMES[i] + ": "+ iae); - localTestRes = false; - } - //-------- test -------------- - if (track != null) { - if (track.getState() != AudioTrack.STATE_INITIALIZED) { - localTestRes = false; - Log.e("MediaAudioTrackTest", - "[ testConstructorStreamType ] failed for stream type "+STREAM_NAMES[i]); - } - //-------- tear down -------------- - track.release(); - } - else { - localTestRes = false; - } - } - assertTrue("testConstructorStreamType", localTestRes); - } - - - //----------------------------------------------------------------- - // Playback head position - //---------------------------------- - - //Test case 1: getPlaybackHeadPosition() at 0 after initialization - @LargeTest - public void testPlaybackHeadPositionAfterInit() throws Exception { - // constants for test - final String TEST_NAME = "testPlaybackHeadPositionAfterInit"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT), TEST_MODE); - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, track.getPlaybackHeadPosition() == 0); - //-------- tear down -------------- - track.release(); - } - - //Test case 2: getPlaybackHeadPosition() increases after play() - @LargeTest - public void testPlaybackHeadPositionIncrease() throws Exception { - // constants for test - final String TEST_NAME = "testPlaybackHeadPositionIncrease"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - Thread.sleep(100); - log(TEST_NAME, "position ="+ track.getPlaybackHeadPosition()); - assertTrue(TEST_NAME, track.getPlaybackHeadPosition() > 0); - //-------- tear down -------------- - track.release(); - } - - //Test case 3: getPlaybackHeadPosition() is 0 after flush(); - @LargeTest - public void testPlaybackHeadPositionAfterFlush() throws Exception { - // constants for test - final String TEST_NAME = "testPlaybackHeadPositionAfterFlush"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - Thread.sleep(100); - track.stop(); - track.flush(); - log(TEST_NAME, "position ="+ track.getPlaybackHeadPosition()); - assertTrue(TEST_NAME, track.getPlaybackHeadPosition() == 0); - //-------- tear down -------------- - track.release(); - } - - //Test case 3: getPlaybackHeadPosition() is 0 after stop(); - @LargeTest - public void testPlaybackHeadPositionAfterStop() throws Exception { - // constants for test - final String TEST_NAME = "testPlaybackHeadPositionAfterStop"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - Thread.sleep(100); - track.stop(); - Thread.sleep(100); // TODO: what is a sensible value? - int pos = track.getPlaybackHeadPosition(); - log(TEST_NAME, "position ="+ pos); - assertTrue(TEST_NAME, pos == 0); - //-------- tear down -------------- - track.release(); - } - - //Test case 4: getPlaybackHeadPosition() is > 0 after play(); pause(); - @LargeTest - public void testPlaybackHeadPositionAfterPause() throws Exception { - // constants for test - final String TEST_NAME = "testPlaybackHeadPositionAfterPause"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - Thread.sleep(100); - track.pause(); - int pos = track.getPlaybackHeadPosition(); - log(TEST_NAME, "position ="+ pos); - assertTrue(TEST_NAME, pos > 0); - //-------- tear down -------------- - track.release(); - } - - - //----------------------------------------------------------------- - // Playback properties - //---------------------------------- - - //Test case 1: setStereoVolume() with max volume returns SUCCESS - @LargeTest - public void testSetStereoVolumeMax() throws Exception { - // constants for test - final String TEST_NAME = "testSetStereoVolumeMax"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - float maxVol = AudioTrack.getMaxVolume(); - assertTrue(TEST_NAME, track.setStereoVolume(maxVol, maxVol) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 2: setStereoVolume() with min volume returns SUCCESS - @LargeTest - public void testSetStereoVolumeMin() throws Exception { - // constants for test - final String TEST_NAME = "testSetStereoVolumeMin"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - float minVol = AudioTrack.getMinVolume(); - assertTrue(TEST_NAME, track.setStereoVolume(minVol, minVol) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 3: setStereoVolume() with mid volume returns SUCCESS - @LargeTest - public void testSetStereoVolumeMid() throws Exception { - // constants for test - final String TEST_NAME = "testSetStereoVolumeMid"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - float midVol = (AudioTrack.getMaxVolume() - AudioTrack.getMinVolume()) / 2; - assertTrue(TEST_NAME, track.setStereoVolume(midVol, midVol) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 4: setPlaybackRate() with half the content rate returns SUCCESS - @LargeTest - public void testSetPlaybackRate() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackRate"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - //-------- test -------------- - track.write(data, 0, data.length); - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.play(); - assertTrue(TEST_NAME, track.setPlaybackRate((int)(TEST_SR/2)) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 5: setPlaybackRate(0) returns bad value error - @LargeTest - public void testSetPlaybackRateZero() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackRateZero"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, track.setPlaybackRate(0) == AudioTrack.ERROR_BAD_VALUE); - //-------- tear down -------------- - track.release(); - } - - //Test case 6: setPlaybackRate() accepts values twice the output sample rate - @LargeTest - public void testSetPlaybackRateTwiceOutputSR() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackRateTwiceOutputSR"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - int outputSR = AudioTrack.getNativeOutputSampleRate(TEST_STREAM_TYPE); - //-------- test -------------- - track.write(data, 0, data.length); - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.play(); - assertTrue(TEST_NAME, track.setPlaybackRate(2*outputSR) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } -/* - //Test case 7: setPlaybackRate() clips values over twice the output sample rate - @LargeTest - public void testSetPlaybackRateClip() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackRateClip"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_STEREO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize/2]; - int outputSR = AudioTrack.getNativeOutputSampleRate(TEST_STREAM_TYPE); - //-------- test -------------- - track.write(data, 0, data.length); - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.play(); - track.setPlaybackRate(3*outputSR); - assertTrue(TEST_NAME, track.getSampleRate() == 2*outputSR); - //-------- tear down -------------- - track.release(); - } -*/ - //Test case 8: setPlaybackRate() invalid operation if track not initialized - @LargeTest - public void testSetPlaybackRateUninit() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackRateUninit"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STATIC; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_NO_STATIC_DATA); - assertTrue(TEST_NAME, track.setPlaybackRate(TEST_SR/2) == AudioTrack.ERROR_INVALID_OPERATION); - //-------- tear down -------------- - track.release(); - } - - //----------------------------------------------------------------- - // Playback progress - //---------------------------------- - - //Test case 1: setPlaybackHeadPosition() on playing track - @LargeTest - public void testSetPlaybackHeadPositionPlaying() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackHeadPositionPlaying"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - 2*minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - assertTrue(TEST_NAME, - track.setPlaybackHeadPosition(10) == AudioTrack.ERROR_INVALID_OPERATION); - //-------- tear down -------------- - track.release(); - } - - //Test case 2: setPlaybackHeadPosition() on stopped track - @LargeTest - public void testSetPlaybackHeadPositionStopped() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackHeadPositionStopped"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - 2*minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - track.stop(); - assumeTrue(TEST_NAME, track.getPlayState() == AudioTrack.PLAYSTATE_STOPPED); - assertTrue(TEST_NAME, track.setPlaybackHeadPosition(10) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 3: setPlaybackHeadPosition() on paused track - @LargeTest - public void testSetPlaybackHeadPositionPaused() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackHeadPositionPaused"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - 2*minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - track.pause(); - assumeTrue(TEST_NAME, track.getPlayState() == AudioTrack.PLAYSTATE_PAUSED); - assertTrue(TEST_NAME, track.setPlaybackHeadPosition(10) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 4: setPlaybackHeadPosition() beyond what has been written - @LargeTest - public void testSetPlaybackHeadPositionTooFar() throws Exception { - // constants for test - final String TEST_NAME = "testSetPlaybackHeadPositionTooFar"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - 2*minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - // make up a frame index that's beyond what has been written: go from buffer size to frame - // count (given the audio track properties), and add 77. - int frameIndexTooFar = (2*minBuffSize/2) + 77; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - track.write(data, 0, data.length); - track.write(data, 0, data.length); - track.play(); - track.stop(); - assumeTrue(TEST_NAME, track.getPlayState() == AudioTrack.PLAYSTATE_STOPPED); - assertTrue(TEST_NAME, track.setPlaybackHeadPosition(frameIndexTooFar) == AudioTrack.ERROR_BAD_VALUE); - //-------- tear down -------------- - track.release(); - } - - - //Test case 5: setLoopPoints() fails for MODE_STREAM - @LargeTest - public void testSetLoopPointsStream() throws Exception { - // constants for test - final String TEST_NAME = "testSetLoopPointsStream"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STREAM; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - 2*minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - //-------- test -------------- - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, track.setLoopPoints(2, 50, 2) == AudioTrack.ERROR_INVALID_OPERATION); - //-------- tear down -------------- - track.release(); - } - - //Test case 6: setLoopPoints() fails start > end - @LargeTest - public void testSetLoopPointsStartAfterEnd() throws Exception { - // constants for test - final String TEST_NAME = "testSetLoopPointsStartAfterEnd"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STATIC; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - //-------- test -------------- - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, track.setLoopPoints(50, 0, 2) == AudioTrack.ERROR_BAD_VALUE); - //-------- tear down -------------- - track.release(); - } - - //Test case 6: setLoopPoints() success - @LargeTest - public void testSetLoopPointsSuccess() throws Exception { - // constants for test - final String TEST_NAME = "testSetLoopPointsSuccess"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STATIC; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - //-------- test -------------- - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, track.setLoopPoints(0, 50, 2) == AudioTrack.SUCCESS); - //-------- tear down -------------- - track.release(); - } - - //Test case 7: setLoopPoints() fails with loop length bigger than content - @LargeTest - public void testSetLoopPointsLoopTooLong() throws Exception { - // constants for test - final String TEST_NAME = "testSetLoopPointsLoopTooLong"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STATIC; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - int dataSizeInFrames = minBuffSize/2; - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_NO_STATIC_DATA); - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, - track.setLoopPoints(10, dataSizeInFrames+20, 2) == AudioTrack.ERROR_BAD_VALUE); - //-------- tear down -------------- - track.release(); - } -/* - //Test case 7: setLoopPoints() fails with start beyond what can be written for the track - @LargeTest - public void testSetLoopPointsStartTooFar() throws Exception { - // constants for test - final String TEST_NAME = "testSetLoopPointsStartTooFar"; - final int TEST_SR = 22050; - final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO; - final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - final int TEST_MODE = AudioTrack.MODE_STATIC; - final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC; - - //-------- initialization -------------- - int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT); - AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT, - minBuffSize, TEST_MODE); - byte data[] = new byte[minBuffSize]; - int dataSizeInFrames = minBuffSize/2;//16bit data - //-------- test -------------- - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_NO_STATIC_DATA); - track.write(data, 0, data.length); - assumeTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(TEST_NAME, - track.setLoopPoints(dataSizeInFrames+20, dataSizeInFrames+50, 2) - == AudioTrack.ERROR_BAD_VALUE); - //-------- tear down -------------- - track.release(); - } -*/ - } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java index 2f0173d..b606f25 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java @@ -1,17 +1,17 @@ /* * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.android.mediaframeworktest.performance; @@ -19,358 +19,141 @@ package com.android.mediaframeworktest.performance; import com.android.mediaframeworktest.MediaFrameworkTest; import com.android.mediaframeworktest.MediaNames; +import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.media.MediaPlayer; -import android.media.MediaRecorder; import android.os.SystemClock; import android.test.ActivityInstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.Suppress; import android.util.Log; -import android.view.SurfaceHolder; import java.io.FileDescriptor; import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Writer; -import java.io.File; -import java.io.FileWriter; -import java.io.BufferedWriter; - import android.media.MediaMetadataRetriever; /** - * Junit / Instrumentation - performance measurement for media player and - * recorder - */ -public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<MediaFrameworkTest> { - - private String TAG = "MediaFrameworkPerformance"; - - private SQLiteDatabase mDB; - private SurfaceHolder mSurfaceHolder = null; - private static final int NUM_STRESS_LOOP = 10; - private static final int NUM_PLAYBACk_IN_EACH_LOOP = 20; - private static final long MEDIA_STRESS_WAIT_TIME = 5000; //5 seconds - private static final String H263_VIDEO_PLAYBACK_MEMOUT = - "/sdcard/h263VideoPlaybackMemOut.txt"; - private static final String H264_VIDEO_PLAYBACK_MEMOUT = - "/sdcard/h264VideoPlaybackMemOut.txt"; - private static final String WMV_VIDEO_PLAYBACK_MEMOUT = - "/sdcard/WmvVideoPlaybackMemOut.txt"; - private static final String H263_VIDEO_ONLY_RECORD_MEMOUT = - "/sdcard/recordH263VideoOnlyMemOut.txt"; - private static final String MP4_VIDEO_ONLY_RECORD_MEMOUT = - "/sdcard/recordMPEG4VideoOnlyMemOut.txt"; - private static final String H263_VIDEO_AUDIO_RECORD_MEMOUT = - "/sdcard/recordVideoH263AudioMemOut.txt"; - private static final String AUDIO_ONLY_RECORD_MEMOUT = - "/sdcard/recordAudioOnlyMemOut.txt"; - - - public MediaPlayerPerformance() { - super("com.android.mediaframeworktest", MediaFrameworkTest.class); - } + * Junit / Instrumentation test case for the media player api + + */ +public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<MediaFrameworkTest> { + + + private boolean mIsPlaying = true; + private String TAG = "MediaPlayerApiTest"; + Context mContext; + private SQLiteDatabase mDB; + + + public MediaPlayerPerformance() { + super("com.android.mediaframeworktest", MediaFrameworkTest.class); + } protected void setUp() throws Exception { - super.setUp(); - } - - public void createDB() { - mDB = SQLiteDatabase.openOrCreateDatabase("/sdcard/perf.db", null); - mDB.execSQL("CREATE TABLE perfdata (_id INTEGER PRIMARY KEY," + - "file TEXT," + "setdatatime LONG," + "preparetime LONG," + - "playtime LONG" + ");"); - } - - public void audioPlaybackStartupTime(String[] testFile) { - long t1 = 0; - long t2 = 0; - long t3 = 0; - long t4 = 0; - long setDataSourceDuration = 0; - long prepareDuration = 0; - long startDuration = 0; - long totalSetDataTime = 0; - long totalPrepareTime = 0; - long totalStartDuration = 0; - - int numberOfFiles = testFile.length; - Log.v(TAG, "File length " + numberOfFiles); - for (int k = 0; k < numberOfFiles; k++) { - MediaPlayer mp = new MediaPlayer(); - try { - t1 = SystemClock.uptimeMillis(); - FileInputStream fis = new FileInputStream(testFile[k]); - FileDescriptor fd = fis.getFD(); - mp.setDataSource(fd); - fis.close(); - t2 = SystemClock.uptimeMillis(); - mp.prepare(); - t3 = SystemClock.uptimeMillis(); - mp.start(); - t4 = SystemClock.uptimeMillis(); - } catch (Exception e) { - Log.v(TAG, e.toString()); - } - setDataSourceDuration = t2 - t1; - prepareDuration = t3 - t2; - startDuration = t4 - t3; - totalSetDataTime = totalSetDataTime + setDataSourceDuration; - totalPrepareTime = totalPrepareTime + prepareDuration; - totalStartDuration = totalStartDuration + startDuration; - mDB.execSQL("INSERT INTO perfdata (file, setdatatime, preparetime," + - " playtime) VALUES (" + '"' + testFile[k] + '"' + ',' + - setDataSourceDuration + ',' + prepareDuration + - ',' + startDuration + ");"); - Log.v(TAG, "File name " + testFile[k]); - mp.stop(); - mp.release(); - } - Log.v(TAG, "setDataSource average " + totalSetDataTime / numberOfFiles); - Log.v(TAG, "prepare average " + totalPrepareTime / numberOfFiles); - Log.v(TAG, "start average " + totalStartDuration / numberOfFiles); - - } - - @Suppress + + super.setUp(); + } + + public void createDB(){ + mDB = SQLiteDatabase.openOrCreateDatabase("/sdcard/perf.db",null); + mDB.execSQL("CREATE TABLE perfdata (_id INTEGER PRIMARY KEY," + + "file TEXT," + "setdatatime LONG," +"preparetime LONG," +"playtime LONG" + ");"); + } + + public void audioPlaybackStartupTime(String[] testFile){ + long t1 = 0; + long t2 = 0; + long t3 = 0; + long t4 =0; + + long setDataSourceDuration = 0; + long prepareDuration = 0; + long startDuration=0; + + long totalSetDataTime=0; + long totalPrepareTime=0; + long totalStartDuration=0; + + int numberOfFiles = testFile.length; + Log.v(TAG, "File lenght " + numberOfFiles); + for (int k=0; k<numberOfFiles; k++){ + MediaPlayer mp = new MediaPlayer(); + try{ + t1 = SystemClock.uptimeMillis(); + FileInputStream fis = new FileInputStream(testFile[k]); + FileDescriptor fd = fis.getFD(); + mp.setDataSource(fd); + fis.close(); + t2 = SystemClock.uptimeMillis(); + mp.prepare(); + t3 = SystemClock.uptimeMillis(); + mp.start(); + t4 = SystemClock.uptimeMillis(); + Thread.sleep(10000); + mp.pause(); + }catch (Exception e){} + setDataSourceDuration = t2 -t1; + prepareDuration = t3 - t2; + startDuration = t4 - t3; + totalSetDataTime = totalSetDataTime + setDataSourceDuration; + totalPrepareTime = totalPrepareTime + prepareDuration; + totalStartDuration = totalStartDuration + startDuration; + mDB.execSQL("INSERT INTO perfdata (file, setdatatime, preparetime, playtime) VALUES (" + '"' + testFile[k] + '"' +',' + +setDataSourceDuration+ ',' + prepareDuration + ',' + startDuration +");"); + Log.v(TAG,"File name " + testFile[k]); + mp.stop(); + mp.release(); + } + Log.v (TAG, "setDataSource average " + totalSetDataTime/numberOfFiles); + Log.v (TAG, "prepare average " + totalPrepareTime/numberOfFiles); + Log.v (TAG, "start average " + totalStartDuration/numberOfFiles); + + } + + //Test cases for GetCurrentPosition + @LargeTest public void testStartUpTime() throws Exception { - createDB(); - audioPlaybackStartupTime(MediaNames.MP3FILES); - audioPlaybackStartupTime(MediaNames.AACFILES); - - } - - public void wmametadatautility(String[] testFile) { - long t1 = 0; - long t2 = 0; - long sum = 0; - long duration = 0; - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - String value; - for (int i = 0, n = testFile.length; i < n; ++i) { - try { - t1 = SystemClock.uptimeMillis(); - retriever.setDataSource(testFile[i]); - value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); - value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); - value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER); - value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE); - value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); - value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR); - value = - retriever - .extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER); - t2 = SystemClock.uptimeMillis(); - duration = t2 - t1; - Log.v(TAG, "Time taken = " + duration); - sum = sum + duration; - } catch (Exception e) { - Log.v(TAG, e.getMessage()); - } - - } - Log.v(TAG, "Average duration = " + sum / testFile.length); - } - - - // Note: This test is to assume the mediaserver's pid is 34 - public void mediaStressPlayback(String testFilePath) { - for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { - MediaPlayer mp = new MediaPlayer(); - try { - mp.setDataSource(testFilePath); - mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder()); - mp.prepare(); - mp.start(); - Thread.sleep(MEDIA_STRESS_WAIT_TIME); - mp.release(); - } catch (Exception e) { - mp.release(); - Log.v(TAG, e.toString()); - } - } - } - - // Note: This test is to assume the mediaserver's pid is 34 - private void stressVideoRecord(int frameRate, int width, int height, int videoFormat, - int outFormat, String outFile, boolean videoOnly) { - // Video recording - for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { - MediaRecorder mRecorder = new MediaRecorder(); - try { - if (!videoOnly) { - Log.v(TAG, "setAudioSource"); - mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); - } - mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); - mRecorder.setOutputFormat(outFormat); - Log.v(TAG, "output format " + outFormat); - mRecorder.setOutputFile(outFile); - mRecorder.setVideoFrameRate(frameRate); - mRecorder.setVideoSize(width, height); - Log.v(TAG, "setEncoder"); - mRecorder.setVideoEncoder(videoFormat); - if (!videoOnly) { - mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); - } - mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); - mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); - mRecorder.prepare(); - mRecorder.start(); - Thread.sleep(MEDIA_STRESS_WAIT_TIME); - mRecorder.stop(); - mRecorder.release(); - } catch (Exception e) { - Log.v("record video failed ", e.toString()); - mRecorder.release(); - } - } - } - - public void stressAudioRecord(String filePath) { - // This test is only for the short media file - for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { - MediaRecorder mRecorder = new MediaRecorder(); - try { - mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); - mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); - mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); - mRecorder.setOutputFile(filePath); - mRecorder.prepare(); - mRecorder.start(); - Thread.sleep(MEDIA_STRESS_WAIT_TIME); - mRecorder.stop(); - mRecorder.release(); - } catch (Exception e) { - Log.v(TAG, e.toString()); - mRecorder.release(); - } - } - } - - //Write the ps output to the file - public void getMemoryWriteToLog(Writer output) { - String cm = "ps mediaserver"; - String memoryUsage = null; - int ch; - try { - Process p = Runtime.getRuntime().exec(cm); - InputStream in = p.getInputStream(); - StringBuffer sb = new StringBuffer(512); - while ((ch = in.read()) != -1) { - sb.append((char) ch); - } - memoryUsage = sb.toString(); - } catch (IOException e) { - Log.v(TAG, e.toString()); - } - - String[] poList = memoryUsage.split("\r|\n|\r\n"); - String memusage = poList[1].concat("\n"); - Log.v(TAG, memusage); - try { - //Write to file output - output.write(memusage); - } catch (Exception e) { - e.toString(); - } - } - - + createDB(); + audioPlaybackStartupTime(MediaNames.MP3FILES); + audioPlaybackStartupTime(MediaNames.AACFILES); + + } + + public void wmametadatautility(String[] testFile){ + long t1 = 0; + long t2 = 0; + long sum = 0; + long duration = 0; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + String value; + for(int i = 0, n = testFile.length; i < n; ++i) { + try { + t1 = SystemClock.uptimeMillis(); + retriever.setDataSource(testFile[i]); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR); + value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER); + t2 = SystemClock.uptimeMillis(); + duration = t2 - t1; + Log.v(TAG, "Time taken = " + duration); + sum=sum+duration; + } + catch (Exception e){Log.v(TAG, e.getMessage());} + + } + Log.v(TAG, "Average duration = " + sum/testFile.length); + } + @Suppress public void testWmaParseTime() throws Exception { - // createDB(); - wmametadatautility(MediaNames.WMASUPPORTED); - } - - - // Test case 1: Capture the memory usage after every 20 h263 playback - @LargeTest - public void testH263VideoPlaybackMemoryUsage() throws Exception { - File h263MemoryOut = new File(H263_VIDEO_PLAYBACK_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(h263MemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - mediaStressPlayback(MediaNames.VIDEO_HIGHRES_H263); - getMemoryWriteToLog(output); - } - output.close(); - } - - // Test case 2: Capture the memory usage after every 20 h264 playback - @LargeTest - public void testH264VideoPlaybackMemoryUsage() throws Exception { - File h264MemoryOut = new File(H264_VIDEO_PLAYBACK_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(h264MemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - mediaStressPlayback(MediaNames.VIDEO_H264_AMR); - getMemoryWriteToLog(output); - } - output.close(); - } - - // Test case 3: Capture the memory usage after each 20 WMV playback - @LargeTest - public void testWMVVideoPlaybackMemoryUsage() throws Exception { - File wmvMemoryOut = new File(WMV_VIDEO_PLAYBACK_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(wmvMemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - mediaStressPlayback(MediaNames.VIDEO_WMV); - getMemoryWriteToLog(output); - } - output.close(); - } - - // Test case 4: Capture the memory usage after every 20 video only recorded - @LargeTest - public void testH263RecordVideoOnlyMemoryUsage() throws Exception { - File videoH263RecordOnlyMemoryOut = new File(H263_VIDEO_ONLY_RECORD_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(videoH263RecordOnlyMemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.H263, - MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true); - getMemoryWriteToLog(output); - } - output.close(); - } - - // Test case 5: Capture the memory usage after every 20 video only recorded - @LargeTest - public void testMpeg4RecordVideoOnlyMemoryUsage() throws Exception { - File videoMp4RecordOnlyMemoryOut = new File(MP4_VIDEO_ONLY_RECORD_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(videoMp4RecordOnlyMemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.MPEG_4_SP, - MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true); - getMemoryWriteToLog(output); - } - output.close(); - } - - // Test case 6: Capture the memory usage after every 20 video and audio recorded - @LargeTest - public void testRecordVidedAudioMemoryUsage() throws Exception { - File videoRecordAudioMemoryOut = new File(H263_VIDEO_AUDIO_RECORD_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(videoRecordAudioMemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.H263, - MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, false); - getMemoryWriteToLog(output); - } - output.close(); - } - - // Test case 7: Capture the memory usage after every 20 audio only recorded - @LargeTest - public void testRecordAudioOnlyMemoryUsage() throws Exception { - File audioOnlyMemoryOut = new File(AUDIO_ONLY_RECORD_MEMOUT); - Writer output = new BufferedWriter(new FileWriter(audioOnlyMemoryOut)); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - stressAudioRecord(MediaNames.RECORDER_OUTPUT); - getMemoryWriteToLog(output); - } - output.close(); + // createDB(); + wmametadatautility(MediaNames.WMASUPPORTED); } + + } + |