summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_media_AudioTrack.cpp6
-rw-r--r--media/java/android/media/AudioTrack.java32
2 files changed, 18 insertions, 20 deletions
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index a64d3ba..3a5b566 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -606,7 +606,7 @@ static jint android_media_AudioTrack_write_byte(JNIEnv *env, jobject thiz,
// ----------------------------------------------------------------------------
static jint android_media_AudioTrack_write_native_bytes(JNIEnv *env, jobject thiz,
- jbyteArray javaBytes, jint byteOffset, jint offsetInBytes, jint sizeInBytes,
+ jbyteArray javaBytes, jint byteOffset, jint sizeInBytes,
jint javaAudioFormat, jboolean isWriteBlocking) {
//ALOGV("android_media_AudioTrack_write_native_bytes(offset=%d, sizeInBytes=%d) called",
// offsetInBytes, sizeInBytes);
@@ -623,7 +623,7 @@ static jint android_media_AudioTrack_write_native_bytes(JNIEnv *env, jobject th
return AUDIOTRACK_ERROR_BAD_VALUE;
}
- jint written = writeToTrack(lpTrack, javaAudioFormat, bytes.get() + byteOffset, offsetInBytes,
+ jint written = writeToTrack(lpTrack, javaAudioFormat, bytes.get(), byteOffset,
sizeInBytes, isWriteBlocking == JNI_TRUE /* blocking */);
return written;
@@ -922,7 +922,7 @@ static JNINativeMethod gMethods[] = {
{"native_release", "()V", (void *)android_media_AudioTrack_release},
{"native_write_byte", "([BIIIZ)I",(void *)android_media_AudioTrack_write_byte},
{"native_write_native_bytes",
- "(Ljava/lang/Object;IIIIZ)I",
+ "(Ljava/lang/Object;IIIZ)I",
(void *)android_media_AudioTrack_write_native_bytes},
{"native_write_short", "([SIII)I", (void *)android_media_AudioTrack_write_short},
{"native_setVolume", "(FF)V", (void *)android_media_AudioTrack_set_volume},
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 5611efb..fdcba07 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -1177,14 +1177,11 @@ public class AudioTrack
* In streaming mode, the blocking behavior will depend on the write mode.
* @param audioData the buffer that holds the data to play, starting at the position reported
* by <code>audioData.position()</code>.
- * <BR>Note that this method will not update the position in this buffer, therefore when
- * writing a loop to write all the data in the buffer, you should increment the
- * <code>offsetInBytes</code> parameter at each pass by the amount that was previously
- * written for this buffer.
- * @param offsetInBytes offset to read from in bytes (note this differs from
- * <code>audioData.position()</code>).
- * @param sizeInBytes number of bytes to read (note this differs from
- * <code>audioData.remaining()</code>).
+ * <BR>Note that upon return, the buffer position (<code>audioData.position()</code>) will
+ * have been advanced to reflect the amount of data that was successfully written to
+ * the AudioTrack.
+ * @param sizeInBytes number of bytes to write.
+ * <BR>Note this may differ from <code>audioData.remaining()</code>, but cannot exceed it.
* @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no
* effect in static mode.
* <BR>With {@link #WRITE_BLOCKING}, the write will block until all data has been written
@@ -1194,7 +1191,7 @@ public class AudioTrack
* @return 0 or a positive number of bytes that were written, or
* {@link #ERROR_BAD_VALUE}, {@link #ERROR_INVALID_OPERATION}
*/
- public int write(ByteBuffer audioData, int offsetInBytes, int sizeInBytes,
+ public int write(ByteBuffer audioData, int sizeInBytes,
@WriteMode int writeMode) {
if (mState == STATE_UNINITIALIZED) {
@@ -1207,22 +1204,19 @@ public class AudioTrack
return ERROR_BAD_VALUE;
}
- if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0)
- || (offsetInBytes + sizeInBytes < 0) // detect integer overflow
- || (offsetInBytes + sizeInBytes > audioData.remaining())) {
- Log.e(TAG, "AudioTrack.write() called with invalid size/offset values");
+ if ( (audioData == null) || (sizeInBytes < 0) || (sizeInBytes > audioData.remaining())) {
+ Log.e(TAG, "AudioTrack.write() called with invalid size (" + sizeInBytes + ") value");
return ERROR_BAD_VALUE;
}
int ret = 0;
if (audioData.isDirect()) {
ret = native_write_native_bytes(audioData,
- audioData.position(),
- offsetInBytes, sizeInBytes, mAudioFormat,
+ audioData.position(), sizeInBytes, mAudioFormat,
writeMode == WRITE_BLOCKING);
} else {
ret = native_write_byte(NioUtils.unsafeArray(audioData),
- NioUtils.unsafeArrayOffset(audioData) + audioData.position() + offsetInBytes,
+ NioUtils.unsafeArrayOffset(audioData) + audioData.position(),
sizeInBytes, mAudioFormat,
writeMode == WRITE_BLOCKING);
}
@@ -1234,6 +1228,10 @@ public class AudioTrack
mState = STATE_INITIALIZED;
}
+ if (ret > 0) {
+ audioData.position(audioData.position() + ret);
+ }
+
return ret;
}
@@ -1443,7 +1441,7 @@ public class AudioTrack
int offsetInShorts, int sizeInShorts, int format);
private native final int native_write_native_bytes(Object audioData,
- int positionInBytes, int offsetInBytes, int sizeInBytes, int format, boolean blocking);
+ int positionInBytes, int sizeInBytes, int format, boolean blocking);
private native final int native_reload_static();