diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java index 32a4df6f1e..f114b20727 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java @@ -27,6 +27,7 @@ import androidx.media3.common.PlaybackParameters; import androidx.media3.common.Player; import androidx.media3.common.util.UnstableApi; import androidx.media3.exoplayer.ExoPlaybackException; +import androidx.media3.exoplayer.analytics.PlayerId; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -285,6 +286,13 @@ public interface AudioSink { */ void setListener(Listener listener); + /** + * Sets the {@link PlayerId} of the player using this audio sink. + * + * @param playerId The {@link PlayerId}, or null to clear a previously set id. + */ + default void setPlayerId(@Nullable PlayerId playerId) {} + /** * Returns whether the sink supports a given {@link Format}. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java index 4d8a1ea957..e15bf7ab09 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java @@ -534,6 +534,7 @@ public abstract class DecoderAudioRenderer< } else { audioSink.disableTunneling(); } + audioSink.setPlayerId(getPlayerId()); } @Override diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java index 5c26cc8332..ceedeed8c2 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java @@ -23,6 +23,7 @@ import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; import android.media.PlaybackParams; +import android.media.metrics.LogSessionId; import android.os.ConditionVariable; import android.os.Handler; import android.os.SystemClock; @@ -40,6 +41,7 @@ import androidx.media3.common.util.Assertions; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.audio.AudioProcessor.UnhandledAudioFormatException; import androidx.media3.extractor.AacUtil; import androidx.media3.extractor.Ac3Util; @@ -332,6 +334,7 @@ public final class DefaultAudioSink implements AudioSink { initializationExceptionPendingExceptionHolder; private final PendingExceptionHolder writeExceptionPendingExceptionHolder; + @Nullable private PlayerId playerId; @Nullable private Listener listener; @Nullable private Configuration pendingConfiguration; @MonotonicNonNull private Configuration configuration; @@ -486,6 +489,11 @@ public final class DefaultAudioSink implements AudioSink { this.listener = listener; } + @Override + public void setPlayerId(@Nullable PlayerId playerId) { + this.playerId = playerId; + } + @Override public boolean supportsFormat(Format format) { return getFormatSupport(format) != SINK_FORMAT_UNSUPPORTED; @@ -674,6 +682,9 @@ public final class DefaultAudioSink implements AudioSink { configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding); } } + if (Util.SDK_INT >= 31 && playerId != null) { + Api31.setLogSessionIdOnAudioTrack(audioTrack, playerId); + } audioSessionId = audioTrack.getAudioSessionId(); audioTrackPositionTracker.setAudioTrack( audioTrack, @@ -2103,6 +2114,7 @@ public final class DefaultAudioSink implements AudioSink { audioSessionId); } + @SuppressWarnings("deprecation") // Using deprecated AudioTrack constructor. private AudioTrack createAudioTrackV9(AudioAttributes audioAttributes, int audioSessionId) { int streamType = Util.getStreamTypeForAudioUsage(audioAttributes.usage); if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) { @@ -2225,4 +2237,16 @@ public final class DefaultAudioSink implements AudioSink { pendingException = null; } } + + @RequiresApi(31) + private static final class Api31 { + private Api31() {} + + public static void setLogSessionIdOnAudioTrack(AudioTrack audioTrack, PlayerId playerId) { + LogSessionId logSessionId = playerId.getLogSessionId(); + if (!logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) { + audioTrack.setLogSessionId(logSessionId); + } + } + } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioSink.java index f622c8e1f4..a9983b40dc 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioSink.java @@ -21,6 +21,7 @@ import androidx.media3.common.AuxEffectInfo; import androidx.media3.common.Format; import androidx.media3.common.PlaybackParameters; import androidx.media3.common.util.UnstableApi; +import androidx.media3.exoplayer.analytics.PlayerId; import java.nio.ByteBuffer; /** An overridable {@link AudioSink} implementation forwarding all methods to another sink. */ @@ -38,6 +39,11 @@ public class ForwardingAudioSink implements AudioSink { sink.setListener(listener); } + @Override + public void setPlayerId(@Nullable PlayerId playerId) { + sink.setPlayerId(playerId); + } + @Override public boolean supportsFormat(Format format) { return sink.supportsFormat(format); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java index a4337fea1d..eecae10e7e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java @@ -504,6 +504,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media } else { audioSink.disableTunneling(); } + audioSink.setPlayerId(getPlayerId()); } @Override diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java index 350af1f9a6..6b2ac17f18 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java @@ -35,6 +35,7 @@ import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.SimpleDecoder; import androidx.media3.decoder.SimpleDecoderOutputBuffer; import androidx.media3.exoplayer.RendererConfiguration; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DrmSessionEventListener; import androidx.media3.exoplayer.drm.DrmSessionManager; import androidx.media3.exoplayer.upstream.DefaultAllocator; @@ -84,6 +85,7 @@ public class DecoderAudioRendererTest { return FORMAT; } }; + audioRenderer.init(/* index= */ 0, PlayerId.UNSET); } @Config(sdk = 19) diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java index 03ad1ca555..1419a882e1 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java @@ -38,6 +38,7 @@ import androidx.media3.common.MimeTypes; import androidx.media3.common.PlaybackException; import androidx.media3.exoplayer.ExoPlaybackException; import androidx.media3.exoplayer.RendererConfiguration; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DrmSessionEventListener; import androidx.media3.exoplayer.drm.DrmSessionManager; import androidx.media3.exoplayer.mediacodec.MediaCodecInfo; @@ -110,6 +111,7 @@ public class MediaCodecAudioRendererTest { eventHandler, audioRendererEventListener, audioSink); + mediaCodecAudioRenderer.init(/* index= */ 0, PlayerId.UNSET); } @Test @@ -264,6 +266,7 @@ public class MediaCodecAudioRendererTest { oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM)); fakeSampleStream.writeData(/* startPositionUs= */ 0); + exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET); exceptionThrowingRenderer.enable( RendererConfiguration.DEFAULT, new Format[] {AUDIO_AAC, changedFormat},