JAudioTrack: Add getRoutedDeviceId() and other methods
This CL adds following methods:
- getRoutedDeviceId()
- latency()
- dump()
Bug: 70363744
Test: build successfully
Change-Id: I31d2299828a3e389b070f5d9b2c4240dfb98c57d
diff --git a/media/libmedia/JAudioTrack.cpp b/media/libmedia/JAudioTrack.cpp
index b228d8b..99da0f7 100644
--- a/media/libmedia/JAudioTrack.cpp
+++ b/media/libmedia/JAudioTrack.cpp
@@ -112,6 +112,11 @@
return env->CallIntMethod(mAudioTrackObj, jGetChannelCount);
}
+uint32_t JAudioTrack::latency() {
+ // TODO: Currently hard-coded as returning zero.
+ return 0;
+}
+
status_t JAudioTrack::getPosition(uint32_t *position) {
if (position == NULL) {
return BAD_VALUE;
@@ -125,7 +130,7 @@
return NO_ERROR;
}
-bool JAudioTrack::getTimeStamp(AudioTimestamp& timestamp) {
+bool JAudioTrack::getTimestamp(AudioTimestamp& timestamp) {
JNIEnv *env = AndroidRuntime::getJNIEnv();
jclass jAudioTimeStampCls = env->FindClass("android/media/AudioTimestamp");
@@ -392,6 +397,51 @@
return audioFormatToNative(javaFormat);
}
+status_t JAudioTrack::dump(int fd, const Vector<String16>& args __unused) const
+{
+ String8 result;
+
+ result.append(" JAudioTrack::dump\n");
+
+ // TODO: Remove logs that includes unavailable information from below.
+// result.appendFormat(" status(%d), state(%d), session Id(%d), flags(%#x)\n",
+// mStatus, mState, mSessionId, mFlags);
+// result.appendFormat(" stream type(%d), left - right volume(%f, %f)\n",
+// (mStreamType == AUDIO_STREAM_DEFAULT) ?
+// audio_attributes_to_stream_type(&mAttributes) : mStreamType,
+// mVolume[AUDIO_INTERLEAVE_LEFT], mVolume[AUDIO_INTERLEAVE_RIGHT]);
+// result.appendFormat(" format(%#x), channel mask(%#x), channel count(%u)\n",
+// format(), mChannelMask, channelCount());
+// result.appendFormat(" sample rate(%u), original sample rate(%u), speed(%f)\n",
+// getSampleRate(), mOriginalSampleRate, mPlaybackRate.mSpeed);
+// result.appendFormat(" frame count(%zu), req. frame count(%zu)\n",
+// frameCount(), mReqFrameCount);
+// result.appendFormat(" notif. frame count(%u), req. notif. frame count(%u),"
+// " req. notif. per buff(%u)\n",
+// mNotificationFramesAct, mNotificationFramesReq, mNotificationsPerBufferReq);
+// result.appendFormat(" latency (%d), selected device Id(%d), routed device Id(%d)\n",
+// latency(), mSelectedDeviceId, getRoutedDeviceId());
+// result.appendFormat(" output(%d) AF latency (%u) AF frame count(%zu) AF SampleRate(%u)\n",
+// mOutput, mAfLatency, mAfFrameCount, mAfSampleRate);
+ ::write(fd, result.string(), result.size());
+ return NO_ERROR;
+}
+
+audio_port_handle_t JAudioTrack::getRoutedDeviceId() {
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ jmethodID jGetRoutedDevice = env->GetMethodID(mAudioTrackCls, "getRoutedDevice",
+ "()Landroid/media/AudioDeviceInfo;");
+ jobject jAudioDeviceInfoObj = env->CallObjectMethod(mAudioTrackObj, jGetRoutedDevice);
+ if (env->IsSameObject(jAudioDeviceInfoObj, NULL)) {
+ return AUDIO_PORT_HANDLE_NONE;
+ }
+
+ jclass jAudioDeviceInfoCls = env->FindClass("Landroid/media/AudioDeviceInfo");
+ jmethodID jGetId = env->GetMethodID(jAudioDeviceInfoCls, "getId", "()I");
+ jint routedDeviceId = env->CallIntMethod(jAudioDeviceInfoObj, jGetId);
+ return routedDeviceId;
+}
+
jobject JAudioTrack::createVolumeShaperConfigurationObj(
const sp<media::VolumeShaper::Configuration>& config) {
diff --git a/media/libmedia/include/media/JAudioTrack.h b/media/libmedia/include/media/JAudioTrack.h
index 8af30b7..10fa5e8 100644
--- a/media/libmedia/include/media/JAudioTrack.h
+++ b/media/libmedia/include/media/JAudioTrack.h
@@ -104,6 +104,12 @@
size_t frameCount();
size_t channelCount();
+ /* Returns this track's estimated latency in milliseconds.
+ * This includes the latency due to AudioTrack buffer size, AudioMixer (if any)
+ * and audio hardware driver.
+ */
+ uint32_t latency();
+
/* Return the total number of frames played since playback start.
* The counter will wrap (overflow) periodically, e.g. every ~27 hours at 44.1 kHz.
* It is reset to zero by flush(), reload(), and stop().
@@ -130,7 +136,7 @@
* Returns true if timestamp is valid.
* The timestamp parameter is undefined on return, if false is returned.
*/
- bool getTimeStamp(AudioTimestamp& timestamp);
+ bool getTimestamp(AudioTimestamp& timestamp);
/* Set source playback rate for timestretch
* 1.0 is normal speed: < 1.0 is slower, > 1.0 is faster
@@ -253,6 +259,17 @@
audio_format_t format();
+ /*
+ * Dumps the state of an audio track.
+ * Not a general-purpose API; intended only for use by media player service to dump its tracks.
+ */
+ status_t dump(int fd, const Vector<String16>& args) const;
+
+ /* Returns the ID of the audio device actually used by the output to which this AudioTrack is
+ * attached. When the AudioTrack is inactive, it will return AUDIO_PORT_HANDLE_NONE.
+ */
+ audio_port_handle_t getRoutedDeviceId();
+
private:
jclass mAudioTrackCls;
jobject mAudioTrackObj;