diff options
-rw-r--r-- | api/current.txt | 2 | ||||
-rw-r--r-- | api/system-current.txt | 2 | ||||
-rw-r--r-- | core/jni/android_media_AudioTrack.cpp | 9 | ||||
-rw-r--r-- | media/java/android/media/AudioTrack.java | 35 |
4 files changed, 48 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt index d73b9f9..86c2d8f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -14965,6 +14965,7 @@ package android.media { method public int getPlaybackHeadPosition(); method public int getPlaybackRate(); method public int getPositionNotificationPeriod(); + method public android.media.AudioDeviceInfo getPreferredOutputDevice(); method public int getSampleRate(); method public int getState(); method public int getStreamType(); @@ -14981,6 +14982,7 @@ package android.media { method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler); method public int setPlaybackRate(int); method public int setPositionNotificationPeriod(int); + method public boolean setPreferredOutputDevice(android.media.AudioDeviceInfo); method protected deprecated void setState(int); method public deprecated int setStereoVolume(float, float); method public int setVolume(float); diff --git a/api/system-current.txt b/api/system-current.txt index f98e15f..f33da37 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -16177,6 +16177,7 @@ package android.media { method public int getPlaybackHeadPosition(); method public int getPlaybackRate(); method public int getPositionNotificationPeriod(); + method public android.media.AudioDeviceInfo getPreferredOutputDevice(); method public int getSampleRate(); method public int getState(); method public int getStreamType(); @@ -16193,6 +16194,7 @@ package android.media { method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler); method public int setPlaybackRate(int); method public int setPositionNotificationPeriod(int); + method public boolean setPreferredOutputDevice(android.media.AudioDeviceInfo); method protected deprecated void setState(int); method public deprecated int setStereoVolume(float, float); method public int setVolume(float); diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 1f688e1..610c7ed 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -957,6 +957,13 @@ static jint android_media_AudioTrack_attachAuxEffect(JNIEnv *env, jobject thiz, return nativeToJavaStatus( lpTrack->attachAuxEffect(effectId) ); } +static jboolean android_media_AudioTrack_setOutputDevice( + JNIEnv *env, jobject thiz, jint device_id) { + + sp<AudioTrack> lpTrack = getAudioTrack(env, thiz); + return lpTrack->setOutputDevice(device_id) == NO_ERROR; +} + // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { @@ -1002,6 +1009,8 @@ static JNINativeMethod gMethods[] = { "(F)I", (void *)android_media_AudioTrack_setAuxEffectSendLevel}, {"native_attachAuxEffect", "(I)I", (void *)android_media_AudioTrack_attachAuxEffect}, + {"native_setOutputDevice", "(I)Z", + (void *)android_media_AudioTrack_setOutputDevice}, }; diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index fac69ea..6c41a2a 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -1851,6 +1851,39 @@ public class AudioTrack return err == 0 ? SUCCESS : ERROR; } + //-------------------------------------------------------------------------- + // Explicit Routing + //-------------------- + private AudioDeviceInfo mPreferredDevice = null; + + /** + * Specifies an audio device (via and {@link AudioDeviceInfo} object) to route + * the output from this AudioTrack. + * @param deviceSpec The {@link AudioDeviceInfo} specifying the physical audio device. + * If deviceSpec is null, default routing is restored. + * @return true if succesful, false if the specified {@link AudioDeviceInfo} is non-null and + * does not correspond to a valid audio output device. + */ + public boolean setPreferredOutputDevice(AudioDeviceInfo deviceSpec) { + // Do some validation.... + if (deviceSpec != null && !deviceSpec.isSink()) { + return false; + } + + mPreferredDevice = deviceSpec; + int routingDeviceId = mPreferredDevice != null ? deviceSpec.getId() : 0; + + return native_setOutputDevice(routingDeviceId); + } + + /** + * Returns the selected output specified by {@link #setPreferredOutputDevice}. Note that this + * is not guarenteed to correspond to the actual device being used for playback. + */ + public AudioDeviceInfo getPreferredOutputDevice() { + return mPreferredDevice; + } + //--------------------------------------------------------- // Interface definitions //-------------------- @@ -2027,6 +2060,8 @@ public class AudioTrack private native final int native_attachAuxEffect(int effectId); private native final int native_setAuxEffectSendLevel(float level); + private native final boolean native_setOutputDevice(int deviceId); + //--------------------------------------------------------- // Utility methods //------------------ |