summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt2
-rw-r--r--api/system-current.txt2
-rw-r--r--core/jni/android_media_AudioTrack.cpp9
-rw-r--r--media/java/android/media/AudioTrack.java35
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
//------------------