auto import from //depot/cupcake/@132589
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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) );
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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(); }
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user