diff options
Diffstat (limited to 'media/java')
-rw-r--r-- | media/java/android/media/AudioManager.java | 62 | ||||
-rw-r--r-- | media/java/android/media/AudioPortEventHandler.java | 2 | ||||
-rw-r--r-- | media/java/android/media/AudioTrack.java | 32 | ||||
-rw-r--r-- | media/java/android/media/MediaCodec.java | 33 | ||||
-rw-r--r-- | media/java/android/media/MediaPlayer.java | 67 | ||||
-rw-r--r-- | media/java/android/media/MediaSync.java | 74 | ||||
-rw-r--r-- | media/java/android/media/PlaybackParams.java (renamed from media/java/android/media/PlaybackSettings.java) | 42 | ||||
-rw-r--r-- | media/java/android/media/SyncParams.java (renamed from media/java/android/media/SyncSettings.java) | 46 | ||||
-rw-r--r-- | media/java/android/media/midi/MidiDeviceInfo.java | 3 | ||||
-rw-r--r-- | media/java/android/media/midi/MidiDeviceStatus.java | 3 |
10 files changed, 202 insertions, 162 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 19900d0..56f0400 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3402,7 +3402,17 @@ public class AudioManager { * @hide */ public static int listAudioPorts(ArrayList<AudioPort> ports) { - return updateAudioPortCache(ports, null); + return updateAudioPortCache(ports, null, null); + } + + /** + * Returns a list of descriptors for all audio ports managed by the audio framework as + * it was before the last update calback. + * @param ports An AudioPort ArrayList where the list will be returned. + * @hide + */ + public static int listPreviousAudioPorts(ArrayList<AudioPort> ports) { + return updateAudioPortCache(null, null, ports); } /** @@ -3411,19 +3421,44 @@ public class AudioManager { * @hide */ public static int listAudioDevicePorts(ArrayList<AudioDevicePort> devices) { + if (devices == null) { + return ERROR_BAD_VALUE; + } ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); - int status = updateAudioPortCache(ports, null); + int status = updateAudioPortCache(ports, null, null); if (status == SUCCESS) { - devices.clear(); - for (int i = 0; i < ports.size(); i++) { - if (ports.get(i) instanceof AudioDevicePort) { - devices.add((AudioDevicePort)ports.get(i)); - } - } + filterDevicePorts(ports, devices); + } + return status; + } + + /** + * Specialized version of listPreviousAudioPorts() listing only audio devices (AudioDevicePort) + * @see listPreviousAudioPorts(ArrayList<AudioPort>) + * @hide + */ + public static int listPreviousAudioDevicePorts(ArrayList<AudioDevicePort> devices) { + if (devices == null) { + return ERROR_BAD_VALUE; + } + ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); + int status = updateAudioPortCache(null, null, ports); + if (status == SUCCESS) { + filterDevicePorts(ports, devices); } return status; } + private static void filterDevicePorts(ArrayList<AudioPort> ports, + ArrayList<AudioDevicePort> devices) { + devices.clear(); + for (int i = 0; i < ports.size(); i++) { + if (ports.get(i) instanceof AudioDevicePort) { + devices.add((AudioDevicePort)ports.get(i)); + } + } + } + /** * Create a connection between two or more devices. The framework will reject the request if * device types are not compatible or the implementation does not support the requested @@ -3474,7 +3509,7 @@ public class AudioManager { * @hide */ public static int listAudioPatches(ArrayList<AudioPatch> patches) { - return updateAudioPortCache(null, patches); + return updateAudioPortCache(null, patches, null); } /** @@ -3540,6 +3575,7 @@ public class AudioManager { static final int AUDIOPORT_GENERATION_INIT = 0; static Integer sAudioPortGeneration = new Integer(AUDIOPORT_GENERATION_INIT); static ArrayList<AudioPort> sAudioPortsCached = new ArrayList<AudioPort>(); + static ArrayList<AudioPort> sPreviousAudioPortsCached = new ArrayList<AudioPort>(); static ArrayList<AudioPatch> sAudioPatchesCached = new ArrayList<AudioPatch>(); static int resetAudioPortGeneration() { @@ -3551,7 +3587,8 @@ public class AudioManager { return generation; } - static int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches) { + static int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches, + ArrayList<AudioPort> previousPorts) { synchronized (sAudioPortGeneration) { if (sAudioPortGeneration == AUDIOPORT_GENERATION_INIT) { @@ -3610,6 +3647,7 @@ public class AudioManager { } } + sPreviousAudioPortsCached = sAudioPortsCached; sAudioPortsCached = newPorts; sAudioPatchesCached = newPatches; sAudioPortGeneration = portGeneration[0]; @@ -3622,6 +3660,10 @@ public class AudioManager { patches.clear(); patches.addAll(sAudioPatchesCached); } + if (previousPorts != null) { + previousPorts.clear(); + previousPorts.addAll(sPreviousAudioPortsCached); + } } return SUCCESS; } diff --git a/media/java/android/media/AudioPortEventHandler.java b/media/java/android/media/AudioPortEventHandler.java index c49e8c2..c152245 100644 --- a/media/java/android/media/AudioPortEventHandler.java +++ b/media/java/android/media/AudioPortEventHandler.java @@ -84,7 +84,7 @@ class AudioPortEventHandler { ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); ArrayList<AudioPatch> patches = new ArrayList<AudioPatch>(); if (msg.what != AUDIOPORT_EVENT_SERVICE_DIED) { - int status = AudioManager.updateAudioPortCache(ports, patches); + int status = AudioManager.updateAudioPortCache(ports, patches, null); if (status != AudioManager.SUCCESS) { return; } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index a66a1e5..dc37700 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -908,13 +908,13 @@ public class AudioTrack } /** - * Returns the current playback settings. - * See {@link #setPlaybackSettings(PlaybackSettings)} to set playback settings - * @return current {@link PlaybackSettings}. + * Returns the current playback params. + * See {@link #setPlaybackParams(PlaybackParams)} to set playback params + * @return current {@link PlaybackParams}. * @throws IllegalStateException if track is not initialized. */ - public @NonNull PlaybackSettings getPlaybackSettings() { - return native_get_playback_settings(); + public @NonNull PlaybackParams getPlaybackParams() { + return native_get_playback_params(); } /** @@ -1294,7 +1294,7 @@ public class AudioTrack * playback to last twice as long, but will also result in a pitch shift down by one octave. * The valid sample rate range is from 1 Hz to twice the value returned by * {@link #getNativeOutputSampleRate(int)}. - * Use {@link #setPlaybackSettings(PlaybackSettings)} for speed control. + * Use {@link #setPlaybackParams(PlaybackParams)} for speed control. * @param sampleRateInHz the sample rate expressed in Hz * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, * {@link #ERROR_INVALID_OPERATION} @@ -1311,24 +1311,24 @@ public class AudioTrack /** - * Sets the playback settings. - * This method returns failure if it cannot apply the playback settings. + * Sets the playback params. + * This method returns failure if it cannot apply the playback params. * One possible cause is that the parameters for speed or pitch are out of range. * Another possible cause is that the <code>AudioTrack</code> is streaming * (see {@link #MODE_STREAM}) and the * buffer size is too small. For speeds greater than 1.0f, the <code>AudioTrack</code> buffer * on configuration must be larger than the speed multiplied by the minimum size * {@link #getMinBufferSize(int, int, int)}) to allow proper playback. - * @param settings see {@link PlaybackSettings}. In particular, + * @param params see {@link PlaybackParams}. In particular, * speed, pitch, and audio mode should be set. - * @throws IllegalArgumentException if the settings are invalid or not accepted. + * @throws IllegalArgumentException if the params are invalid or not accepted. * @throws IllegalStateException if track is not initialized. */ - public void setPlaybackSettings(@NonNull PlaybackSettings settings) { - if (settings == null) { - throw new IllegalArgumentException("settings is null"); + public void setPlaybackParams(@NonNull PlaybackParams params) { + if (params == null) { + throw new IllegalArgumentException("params is null"); } - native_set_playback_settings(settings); + native_set_playback_params(params); } @@ -2353,8 +2353,8 @@ public class AudioTrack private native final int native_set_playback_rate(int sampleRateInHz); private native final int native_get_playback_rate(); - private native final void native_set_playback_settings(@NonNull PlaybackSettings settings); - private native final @NonNull PlaybackSettings native_get_playback_settings(); + private native final void native_set_playback_params(@NonNull PlaybackParams params); + private native final @NonNull PlaybackParams native_get_playback_params(); private native final int native_set_marker_pos(int marker); private native final int native_get_marker_pos(); diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 6f7b583..72198b6 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -816,10 +816,9 @@ final public class MediaCodec { * Thrown when an internal codec error occurs. */ public final static class CodecException extends IllegalStateException { - CodecException(int errorCode, int actionCode, @Nullable String detailMessage, int reason) { + CodecException(int errorCode, int actionCode, @Nullable String detailMessage) { super(detailMessage); mErrorCode = errorCode; - mReason = reason; mActionCode = actionCode; // TODO get this from codec @@ -847,21 +846,7 @@ final public class MediaCodec { } /** - * Retrieve the reason associated with a CodecException. - * The reason could be one of {@link #REASON_HARDWARE} or {@link #REASON_RECLAIMED}. - * - */ - @ReasonCode - public int getReason() { - return mReason; - } - - /** - * Retrieve the error code associated with a CodecException. - * This is opaque diagnostic information and may depend on - * hardware or API level. - * - * @hide + * Retrieve the error code associated with a CodecException */ public int getErrorCode() { return mErrorCode; @@ -878,22 +863,21 @@ final public class MediaCodec { } /** - * This indicates the exception is caused by the hardware. + * This indicates required resource was not able to be allocated. */ - public static final int REASON_HARDWARE = 0; + public static final int ERROR_INSUFFICIENT_RESOURCE = 1100; /** - * This indicates the exception is because the resource manager reclaimed - * the media resource used by the codec. + * This indicates the resource manager reclaimed the media resource used by the codec. * <p> * With this exception, the codec must be released, as it has moved to terminal state. */ - public static final int REASON_RECLAIMED = 1; + public static final int ERROR_RECLAIMED = 1101; /** @hide */ @IntDef({ - REASON_HARDWARE, - REASON_RECLAIMED, + ERROR_INSUFFICIENT_RESOURCE, + ERROR_RECLAIMED, }) @Retention(RetentionPolicy.SOURCE) public @interface ReasonCode {} @@ -904,7 +888,6 @@ final public class MediaCodec { private final String mDiagnosticInfo; private final int mErrorCode; - private final int mReason; private final int mActionCode; } diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 6ec10c7..aaafa55 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -47,12 +47,12 @@ import android.graphics.SurfaceTexture; import android.media.AudioManager; import android.media.MediaFormat; import android.media.MediaTimeProvider; -import android.media.PlaybackSettings; +import android.media.PlaybackParams; import android.media.SubtitleController; import android.media.SubtitleController.Anchor; import android.media.SubtitleData; import android.media.SubtitleTrack.RenderingWidget; -import android.media.SyncSettings; +import android.media.SyncParams; import com.android.internal.app.IAppOpsService; @@ -481,7 +481,7 @@ import java.lang.ref.WeakReference; * <td>{} </p></td> * <td>This method can be called in any state and calling it does not change * the object state. </p></td></tr> - * <tr><td>setPlaybackSettings</p></td> + * <tr><td>setPlaybackParams</p></td> * <td>any </p></td> * <td>{} </p></td> * <td>This method can be called in any state and calling it does not change @@ -1408,68 +1408,68 @@ public class MediaPlayer implements SubtitleController.Listener * @throws IllegalArgumentException if audioMode is not supported. */ public void setPlaybackRate(float rate, @PlaybackRateAudioMode int audioMode) { - PlaybackSettings settings = new PlaybackSettings(); - settings.allowDefaults(); + PlaybackParams params = new PlaybackParams(); + params.allowDefaults(); switch (audioMode) { case PLAYBACK_RATE_AUDIO_MODE_DEFAULT: - settings.setSpeed(rate).setPitch(1.0f); + params.setSpeed(rate).setPitch(1.0f); break; case PLAYBACK_RATE_AUDIO_MODE_STRETCH: - settings.setSpeed(rate).setPitch(1.0f) - .setAudioFallbackMode(settings.AUDIO_FALLBACK_MODE_FAIL); + params.setSpeed(rate).setPitch(1.0f) + .setAudioFallbackMode(params.AUDIO_FALLBACK_MODE_FAIL); break; case PLAYBACK_RATE_AUDIO_MODE_RESAMPLE: - settings.setSpeed(rate).setPitch(rate); + params.setSpeed(rate).setPitch(rate); break; default: final String msg = "Audio playback mode " + audioMode + " is not supported"; throw new IllegalArgumentException(msg); } - setPlaybackSettings(settings); + setPlaybackParams(params); } /** - * Sets playback rate using {@link PlaybackSettings}. + * Sets playback rate using {@link PlaybackParams}. * - * @param settings the playback settings. + * @param params the playback params. * * @throws IllegalStateException if the internal player engine has not been * initialized. - * @throws IllegalArgumentException if settings is not supported. + * @throws IllegalArgumentException if params is not supported. */ - public native void setPlaybackSettings(@NonNull PlaybackSettings settings); + public native void setPlaybackParams(@NonNull PlaybackParams params); /** - * Gets the playback settings, containing the current playback rate. + * Gets the playback params, containing the current playback rate. * - * @return the playback settings. + * @return the playback params. * @throws IllegalStateException if the internal player engine has not been * initialized. */ @NonNull - public native PlaybackSettings getPlaybackSettings(); + public native PlaybackParams getPlaybackParams(); /** * Sets A/V sync mode. * - * @param settings the A/V sync settings to apply + * @param params the A/V sync params to apply * * @throws IllegalStateException if the internal player engine has not been * initialized. - * @throws IllegalArgumentException if settings are not supported. + * @throws IllegalArgumentException if params are not supported. */ - public native void setSyncSettings(@NonNull SyncSettings settings); + public native void setSyncParams(@NonNull SyncParams params); /** * Gets the A/V sync mode. * - * @return the A/V sync settings + * @return the A/V sync params * * @throws IllegalStateException if the internal player engine has not been * initialized. */ @NonNull - public native SyncSettings getSyncSettings(); + public native SyncParams getSyncParams(); /** * Seeks to specified time position. @@ -1507,7 +1507,7 @@ public class MediaPlayer implements SubtitleController.Listener return new MediaTimestamp( getCurrentPosition() * 1000L, System.nanoTime(), - isPlaying() ? getPlaybackSettings().getSpeed() : 0.f); + isPlaying() ? getPlaybackParams().getSpeed() : 0.f); } catch (IllegalStateException e) { return null; } @@ -2824,6 +2824,13 @@ public class MediaPlayer implements SubtitleController.Listener mSubtitleController.selectDefaultTrack(); } break; + case MEDIA_INFO_BUFFERING_START: + case MEDIA_INFO_BUFFERING_END: + TimeProvider timeProvider = mTimeProvider; + if (timeProvider != null) { + timeProvider.onBuffering(msg.arg1 == MEDIA_INFO_BUFFERING_START); + } + break; } if (mOnInfoListener != null) { @@ -3362,6 +3369,7 @@ public class MediaPlayer implements SubtitleController.Listener private MediaPlayer mPlayer; private boolean mPaused = true; private boolean mStopped = true; + private boolean mBuffering; private long mLastReportedTime; private long mTimeAdjustment; // since we are expecting only a handful listeners per stream, there is @@ -3455,12 +3463,22 @@ public class MediaPlayer implements SubtitleController.Listener } /** @hide */ + public void onBuffering(boolean buffering) { + synchronized (this) { + if (DEBUG) Log.d(TAG, "onBuffering: " + buffering); + mBuffering = buffering; + scheduleNotification(REFRESH_AND_NOTIFY_TIME, 0 /* delay */); + } + } + + /** @hide */ public void onStopped() { synchronized(this) { if (DEBUG) Log.d(TAG, "onStopped"); mPaused = true; mStopped = true; mSeeking = false; + mBuffering = false; scheduleNotification(NOTIFY_STOP, 0 /* delay */); } } @@ -3481,6 +3499,7 @@ public class MediaPlayer implements SubtitleController.Listener synchronized(this) { mStopped = false; mSeeking = true; + mBuffering = false; scheduleNotification(NOTIFY_SEEK, 0 /* delay */); } } @@ -3683,7 +3702,7 @@ public class MediaPlayer implements SubtitleController.Listener nanoTime >= mLastNanoTime + MAX_NS_WITHOUT_POSITION_CHECK) { try { mLastTimeUs = mPlayer.getCurrentPosition() * 1000L; - mPaused = !mPlayer.isPlaying(); + mPaused = !mPlayer.isPlaying() || mBuffering; if (DEBUG) Log.v(TAG, (mPaused ? "paused" : "playing") + " at " + mLastTimeUs); } catch (IllegalStateException e) { if (mPausing) { diff --git a/media/java/android/media/MediaSync.java b/media/java/android/media/MediaSync.java index a5b0d39..b7ef95c 100644 --- a/media/java/android/media/MediaSync.java +++ b/media/java/android/media/MediaSync.java @@ -20,7 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.media.AudioTrack; -import android.media.PlaybackSettings; +import android.media.PlaybackParams; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -62,7 +62,7 @@ import java.util.List; * // videoDecoder.releaseOutputBuffer(videoOutputBufferIx, videoPresentationTimeNs); * // More details are available as below. * ... - * sync.queueAudio(audioByteBuffer, bufferIndex, size, audioPresentationTimeUs); // non-blocking. + * sync.queueAudio(audioByteBuffer, bufferIndex, audioPresentationTimeUs); // non-blocking. * // The audioByteBuffer and bufferIndex will be returned via callback. * // More details are available as below. * ... @@ -112,7 +112,7 @@ import java.util.List; * initial underrun. * <p> */ -final public class MediaSync { +public final class MediaSync { /** * MediaSync callback interface. Used to notify the user asynchronously * of various MediaSync events. @@ -170,14 +170,12 @@ final public class MediaSync { private static class AudioBuffer { public ByteBuffer mByteBuffer; public int mBufferIndex; - public int mSizeInBytes; long mPresentationTimeUs; public AudioBuffer(@NonNull ByteBuffer byteBuffer, int bufferIndex, - int sizeInBytes, long presentationTimeUs) { + long presentationTimeUs) { mByteBuffer = byteBuffer; mBufferIndex = bufferIndex; - mSizeInBytes = sizeInBytes; mPresentationTimeUs = presentationTimeUs; } } @@ -413,18 +411,18 @@ final public class MediaSync { * @throws IllegalArgumentException if audioMode is not supported. */ public void setPlaybackRate(float rate, @PlaybackRateAudioMode int audioMode) { - PlaybackSettings rateSettings = new PlaybackSettings(); - rateSettings.allowDefaults(); + PlaybackParams rateParams = new PlaybackParams(); + rateParams.allowDefaults(); switch (audioMode) { case PLAYBACK_RATE_AUDIO_MODE_DEFAULT: - rateSettings.setSpeed(rate).setPitch(1.0f); + rateParams.setSpeed(rate).setPitch(1.0f); break; case PLAYBACK_RATE_AUDIO_MODE_STRETCH: - rateSettings.setSpeed(rate).setPitch(1.0f) - .setAudioFallbackMode(rateSettings.AUDIO_FALLBACK_MODE_FAIL); + rateParams.setSpeed(rate).setPitch(1.0f) + .setAudioFallbackMode(rateParams.AUDIO_FALLBACK_MODE_FAIL); break; case PLAYBACK_RATE_AUDIO_MODE_RESAMPLE: - rateSettings.setSpeed(rate).setPitch(rate); + rateParams.setSpeed(rate).setPitch(rate); break; default: { @@ -432,19 +430,19 @@ final public class MediaSync { throw new IllegalArgumentException(msg); } } - setPlaybackSettings(rateSettings); + setPlaybackParams(rateParams); } /** - * Sets playback rate using {@link PlaybackSettings}. + * Sets playback rate using {@link PlaybackParams}. * <p> - * When using MediaSync with {@link AudioTrack}, set playback settings using this + * When using MediaSync with {@link AudioTrack}, set playback params using this * call instead of calling it directly on the track, so that the sync is aware of - * the settings change. + * the params change. * <p> * This call also works if there is no audio track. * - * @param settings the playback settings to use. {@link PlaybackSettings#getSpeed + * @param params the playback params to use. {@link PlaybackParams#getSpeed * Speed} is the ratio between desired playback rate and normal one. 1.0 means * normal playback speed. 0.0 means pause. Value larger than 1.0 means faster playback, * while value between 0.0 and 1.0 for slower playback. <b>Note:</b> the normal rate @@ -453,11 +451,11 @@ final public class MediaSync { * * @throws IllegalStateException if the internal sync engine or the audio track has not * been initialized. - * @throws IllegalArgumentException if the settings are not supported. + * @throws IllegalArgumentException if the params are not supported. */ - public void setPlaybackSettings(@NonNull PlaybackSettings settings) { + public void setPlaybackParams(@NonNull PlaybackParams params) { synchronized(mAudioLock) { - mPlaybackRate = native_setPlaybackSettings(settings);; + mPlaybackRate = native_setPlaybackParams(params);; } if (mPlaybackRate != 0.0 && mAudioThread != null) { postRenderAudio(0); @@ -465,7 +463,7 @@ final public class MediaSync { } /** - * Gets the playback rate using {@link PlaybackSettings}. + * Gets the playback rate using {@link PlaybackParams}. * * @return the playback rate being used. * @@ -473,40 +471,40 @@ final public class MediaSync { * been initialized. */ @NonNull - public native PlaybackSettings getPlaybackSettings(); + public native PlaybackParams getPlaybackParams(); - private native float native_setPlaybackSettings(@NonNull PlaybackSettings settings); + private native float native_setPlaybackParams(@NonNull PlaybackParams params); /** * Sets A/V sync mode. * - * @param settings the A/V sync settings to apply + * @param params the A/V sync params to apply * * @throws IllegalStateException if the internal player engine has not been * initialized. - * @throws IllegalArgumentException if settings are not supported. + * @throws IllegalArgumentException if params are not supported. */ - public void setSyncSettings(@NonNull SyncSettings settings) { + public void setSyncParams(@NonNull SyncParams params) { synchronized(mAudioLock) { - mPlaybackRate = native_setSyncSettings(settings);; + mPlaybackRate = native_setSyncParams(params);; } if (mPlaybackRate != 0.0 && mAudioThread != null) { postRenderAudio(0); } } - private native float native_setSyncSettings(@NonNull SyncSettings settings); + private native float native_setSyncParams(@NonNull SyncParams params); /** * Gets the A/V sync mode. * - * @return the A/V sync settings + * @return the A/V sync params * * @throws IllegalStateException if the internal player engine has not been * initialized. */ @NonNull - public native SyncSettings getSyncSettings(); + public native SyncParams getSyncParams(); /** * Flushes all buffers from the sync object. @@ -567,23 +565,20 @@ final public class MediaSync { * to the client via registered callback. * @param bufferIndex the buffer index used to identify audioData. It will be returned to * the client along with audioData. This helps applications to keep track of audioData. - * @param sizeInBytes number of bytes to queue. * @param presentationTimeUs the presentation timestamp in microseconds for the first frame * in the buffer. * @throws IllegalStateException if audio track is not set or internal configureation * has not been done correctly. */ public void queueAudio( - @NonNull ByteBuffer audioData, int bufferIndex, int sizeInBytes, - long presentationTimeUs) { + @NonNull ByteBuffer audioData, int bufferIndex, long presentationTimeUs) { if (mAudioTrack == null || mAudioThread == null) { throw new IllegalStateException( "AudioTrack is NOT set or audio thread is not created"); } synchronized(mAudioLock) { - mAudioBuffers.add(new AudioBuffer( - audioData, bufferIndex, sizeInBytes, presentationTimeUs)); + mAudioBuffers.add(new AudioBuffer(audioData, bufferIndex, presentationTimeUs)); } if (mPlaybackRate != 0.0) { @@ -605,18 +600,19 @@ final public class MediaSync { } AudioBuffer audioBuffer = mAudioBuffers.get(0); + int size = audioBuffer.mByteBuffer.remaining(); int sizeWritten = mAudioTrack.write( audioBuffer.mByteBuffer, - audioBuffer.mSizeInBytes, + size, AudioTrack.WRITE_NON_BLOCKING); if (sizeWritten > 0) { if (audioBuffer.mPresentationTimeUs != -1) { native_updateQueuedAudioData( - audioBuffer.mSizeInBytes, audioBuffer.mPresentationTimeUs); + size, audioBuffer.mPresentationTimeUs); audioBuffer.mPresentationTimeUs = -1; } - if (sizeWritten == audioBuffer.mSizeInBytes) { + if (sizeWritten == size) { postReturnByteBuffer(audioBuffer); mAudioBuffers.remove(0); if (!mAudioBuffers.isEmpty()) { @@ -624,8 +620,6 @@ final public class MediaSync { } return; } - - audioBuffer.mSizeInBytes -= sizeWritten; } long pendingTimeMs = TimeUnit.MICROSECONDS.toMillis( native_getPlayTimeForPendingAudioFrames()); diff --git a/media/java/android/media/PlaybackSettings.java b/media/java/android/media/PlaybackParams.java index b2e1033..e41b2b6 100644 --- a/media/java/android/media/PlaybackSettings.java +++ b/media/java/android/media/PlaybackParams.java @@ -22,21 +22,21 @@ import java.lang.annotation.RetentionPolicy; import android.annotation.IntDef; /** - * Structure for common playback settings. + * Structure for common playback params. * - * Used by {@link AudioTrack} {@link AudioTrack#getPlaybackSettings()} and - * {@link AudioTrack#setPlaybackSettings(PlaybackSettings)} + * Used by {@link AudioTrack} {@link AudioTrack#getPlaybackParams()} and + * {@link AudioTrack#setPlaybackParams(PlaybackParams)} * to control playback behavior. * <p> <strong>audio fallback mode:</strong> * select out-of-range parameter handling. * <ul> - * <li> {@link PlaybackSettings#AUDIO_FALLBACK_MODE_DEFAULT}: + * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_DEFAULT}: * System will determine best handling. </li> - * <li> {@link PlaybackSettings#AUDIO_FALLBACK_MODE_MUTE}: - * Play silence for settings normally out of range.</li> - * <li> {@link PlaybackSettings#AUDIO_FALLBACK_MODE_FAIL}: + * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_MUTE}: + * Play silence for params normally out of range.</li> + * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_FAIL}: * Return {@link java.lang.IllegalArgumentException} from - * <code>AudioTrack.setPlaybackSettings(PlaybackSettings)</code>.</li> + * <code>AudioTrack.setPlaybackParams(PlaybackParams)</code>.</li> * </ul> * <p> <strong>pitch:</strong> increases or decreases the tonal frequency of the audio content. * It is expressed as a multiplicative factor, where normal pitch is 1.0f. @@ -52,7 +52,7 @@ import android.annotation.IntDef; * similar to {@link AudioTrack#setPlaybackRate(int)}.</li> * </ul> */ -public final class PlaybackSettings { +public final class PlaybackParams { /** @hide */ @IntDef( value = { @@ -81,14 +81,14 @@ public final class PlaybackSettings { /** @hide */ public static final int AUDIO_STRETCH_MODE_VOICE = 1; - // flags to indicate which settings are actually set + // flags to indicate which params are actually set private static final int SET_SPEED = 1 << 0; private static final int SET_PITCH = 1 << 1; private static final int SET_AUDIO_FALLBACK_MODE = 1 << 2; private static final int SET_AUDIO_STRETCH_MODE = 1 << 3; private int mSet = 0; - // settings + // params private int mAudioFallbackMode = AUDIO_FALLBACK_MODE_DEFAULT; private int mAudioStretchMode = AUDIO_STRETCH_MODE_DEFAULT; private float mPitch = 1.0f; @@ -99,9 +99,9 @@ public final class PlaybackSettings { * Otherwise a {@link java.lang.IllegalArgumentException} exception * is raised when getting those properties * which have defaults but have never been set. - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings allowDefaults() { + public PlaybackParams allowDefaults() { mSet |= SET_AUDIO_FALLBACK_MODE | SET_AUDIO_STRETCH_MODE | SET_PITCH | SET_SPEED; return this; } @@ -109,9 +109,9 @@ public final class PlaybackSettings { /** * Sets the audio fallback mode. * @param audioFallbackMode - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setAudioFallbackMode(@AudioFallbackMode int audioFallbackMode) { + public PlaybackParams setAudioFallbackMode(@AudioFallbackMode int audioFallbackMode) { mAudioFallbackMode = audioFallbackMode; mSet |= SET_AUDIO_FALLBACK_MODE; return this; @@ -133,9 +133,9 @@ public final class PlaybackSettings { * @hide * Sets the audio stretch mode. * @param audioStretchMode - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setAudioStretchMode(@AudioStretchMode int audioStretchMode) { + public PlaybackParams setAudioStretchMode(@AudioStretchMode int audioStretchMode) { mAudioStretchMode = audioStretchMode; mSet |= SET_AUDIO_STRETCH_MODE; return this; @@ -157,9 +157,9 @@ public final class PlaybackSettings { /** * Sets the pitch factor. * @param pitch - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setPitch(float pitch) { + public PlaybackParams setPitch(float pitch) { mPitch = pitch; mSet |= SET_PITCH; return this; @@ -180,9 +180,9 @@ public final class PlaybackSettings { /** * Sets the speed factor. * @param speed - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setSpeed(float speed) { + public PlaybackParams setSpeed(float speed) { mSpeed = speed; mSet |= SET_SPEED; return this; diff --git a/media/java/android/media/SyncSettings.java b/media/java/android/media/SyncParams.java index 9740147..00a8dc0 100644 --- a/media/java/android/media/SyncSettings.java +++ b/media/java/android/media/SyncParams.java @@ -22,31 +22,31 @@ import java.lang.annotation.RetentionPolicy; import android.annotation.IntDef; /** - * Structure for common A/V sync settings. + * Structure for common A/V sync params. * - * Used by {@link MediaSync} {link MediaSync#getSyncSettings()} and - * {link MediaSync#setSyncSettings(SyncSettings)} + * Used by {@link MediaSync} {link MediaSync#getSyncParams()} and + * {link MediaSync#setSyncParams(SyncParams)} * to control A/V sync behavior. * <p> <strong>audio adjust mode:</strong> * select handling of audio track when changing playback speed due to sync. * <ul> - * <li> {@link SyncSettings#AUDIO_ADJUST_MODE_DEFAULT}: + * <li> {@link SyncParams#AUDIO_ADJUST_MODE_DEFAULT}: * System will determine best handling. </li> - * <li> {@link SyncSettings#AUDIO_ADJUST_MODE_STRETCH}: + * <li> {@link SyncParams#AUDIO_ADJUST_MODE_STRETCH}: * Change the speed of audio playback without altering its pitch.</li> - * <li> {@link SyncSettings#AUDIO_ADJUST_MODE_RESAMPLE}: + * <li> {@link SyncParams#AUDIO_ADJUST_MODE_RESAMPLE}: * Change the speed of audio playback by resampling the audio.</li> * </ul> * <p> <strong>sync source:</strong> select * clock source for sync. * <ul> - * <li> {@link SyncSettings#SYNC_SOURCE_DEFAULT}: + * <li> {@link SyncParams#SYNC_SOURCE_DEFAULT}: * System will determine best selection.</li> - * <li> {@link SyncSettings#SYNC_SOURCE_SYSTEM_CLOCK}: + * <li> {@link SyncParams#SYNC_SOURCE_SYSTEM_CLOCK}: * Use system clock for sync source.</li> - * <li> {@link SyncSettings#SYNC_SOURCE_AUDIO}: + * <li> {@link SyncParams#SYNC_SOURCE_AUDIO}: * Use audio track for sync source.</li> - * <li> {@link SyncSettings#SYNC_SOURCE_VSYNC}: + * <li> {@link SyncParams#SYNC_SOURCE_VSYNC}: * Syncronize media to vsync.</li> * </ul> * <p> <strong>tolerance:</strong> specifies the amount of allowed playback rate @@ -55,7 +55,7 @@ import android.annotation.IntDef; * <p> <strong>frameRate:</strong> initial hint for video frame rate. Used when * sync source is vsync. */ -public final class SyncSettings { +public final class SyncParams { /** @hide */ @IntDef( value = { @@ -155,14 +155,14 @@ public final class SyncSettings { */ public static final int AUDIO_ADJUST_MODE_RESAMPLE = 2; - // flags to indicate which settings are actually set + // flags to indicate which params are actually set private static final int SET_SYNC_SOURCE = 1 << 0; private static final int SET_AUDIO_ADJUST_MODE = 1 << 1; private static final int SET_TOLERANCE = 1 << 2; private static final int SET_FRAME_RATE = 1 << 3; private int mSet = 0; - // settings + // params private int mAudioAdjustMode = AUDIO_ADJUST_MODE_STRETCH; private int mSyncSource = SYNC_SOURCE_DEFAULT; private float mTolerance = 0.f; @@ -173,9 +173,9 @@ public final class SyncSettings { * Otherwise a {@link java.lang.IllegalArgumentException} exception * is raised when getting those properties * which have defaults but have never been set. - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings allowDefaults() { + public SyncParams allowDefaults() { mSet |= SET_SYNC_SOURCE | SET_AUDIO_ADJUST_MODE | SET_TOLERANCE; return this; } @@ -183,9 +183,9 @@ public final class SyncSettings { /** * Sets the audio adjust mode. * @param audioAdjustMode - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setAudioAdjustMode(@AudioAdjustMode int audioAdjustMode) { + public SyncParams setAudioAdjustMode(@AudioAdjustMode int audioAdjustMode) { mAudioAdjustMode = audioAdjustMode; mSet |= SET_AUDIO_ADJUST_MODE; return this; @@ -206,9 +206,9 @@ public final class SyncSettings { /** * Sets the sync source. * @param syncSource - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setSyncSource(@SyncSource int syncSource) { + public SyncParams setSyncSource(@SyncSource int syncSource) { mSyncSource = syncSource; mSet |= SET_SYNC_SOURCE; return this; @@ -231,9 +231,9 @@ public final class SyncSettings { * @param tolerance A non-negative number representing * the maximum deviation of the playback rate from the playback rate * set. ({@code abs(actual_rate - set_rate) / set_rate}) - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setTolerance(float tolerance) { + public SyncParams setTolerance(float tolerance) { mTolerance = tolerance; mSet |= SET_TOLERANCE; return this; @@ -257,9 +257,9 @@ public final class SyncSettings { * Sets the video frame rate hint to be used. By default the frame rate is unspecified. * @param frameRate A non-negative number used as an initial hint on * the video frame rate to be used when using vsync as the sync source. - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setFrameRate(float frameRate) { + public SyncParams setFrameRate(float frameRate) { mFrameRate = frameRate; mSet |= SET_FRAME_RATE; return this; diff --git a/media/java/android/media/midi/MidiDeviceInfo.java b/media/java/android/media/midi/MidiDeviceInfo.java index 35374ed..57607e9 100644 --- a/media/java/android/media/midi/MidiDeviceInfo.java +++ b/media/java/android/media/midi/MidiDeviceInfo.java @@ -298,6 +298,9 @@ public final class MidiDeviceInfo implements Parcelable { @Override public String toString() { + // This is a hack to force the mProperties Bundle to unparcel so we can + // print all the names and values. + mProperties.getString(PROPERTY_NAME); return ("MidiDeviceInfo[mType=" + mType + ",mInputPortCount=" + mInputPortCount + ",mOutputPortCount=" + mOutputPortCount + diff --git a/media/java/android/media/midi/MidiDeviceStatus.java b/media/java/android/media/midi/MidiDeviceStatus.java index 7522dcf..d4abeff 100644 --- a/media/java/android/media/midi/MidiDeviceStatus.java +++ b/media/java/android/media/midi/MidiDeviceStatus.java @@ -89,10 +89,9 @@ public final class MidiDeviceStatus implements Parcelable { @Override public String toString() { - StringBuilder builder = new StringBuilder(mDeviceInfo.toString()); int inputPortCount = mDeviceInfo.getInputPortCount(); int outputPortCount = mDeviceInfo.getOutputPortCount(); - builder.append(" mInputPortOpen=["); + StringBuilder builder = new StringBuilder("mInputPortOpen=["); for (int i = 0; i < inputPortCount; i++) { builder.append(mInputPortOpen[i]); if (i < inputPortCount -1) { |