Set LogSessionId on AudioTrack.
This requires forwarding the PlayerId to the AudioSink. PiperOrigin-RevId: 410509605
This commit is contained in:
parent
57212088c6
commit
fb09c4615c
@ -27,6 +27,7 @@ import androidx.media3.common.PlaybackParameters;
|
|||||||
import androidx.media3.common.Player;
|
import androidx.media3.common.Player;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import androidx.media3.exoplayer.ExoPlaybackException;
|
import androidx.media3.exoplayer.ExoPlaybackException;
|
||||||
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
@ -285,6 +286,13 @@ public interface AudioSink {
|
|||||||
*/
|
*/
|
||||||
void setListener(Listener listener);
|
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}.
|
* Returns whether the sink supports a given {@link Format}.
|
||||||
*
|
*
|
||||||
|
@ -534,6 +534,7 @@ public abstract class DecoderAudioRenderer<
|
|||||||
} else {
|
} else {
|
||||||
audioSink.disableTunneling();
|
audioSink.disableTunneling();
|
||||||
}
|
}
|
||||||
|
audioSink.setPlayerId(getPlayerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -23,6 +23,7 @@ import android.media.AudioFormat;
|
|||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.media.AudioTrack;
|
import android.media.AudioTrack;
|
||||||
import android.media.PlaybackParams;
|
import android.media.PlaybackParams;
|
||||||
|
import android.media.metrics.LogSessionId;
|
||||||
import android.os.ConditionVariable;
|
import android.os.ConditionVariable;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.SystemClock;
|
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.Log;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.audio.AudioProcessor.UnhandledAudioFormatException;
|
import androidx.media3.exoplayer.audio.AudioProcessor.UnhandledAudioFormatException;
|
||||||
import androidx.media3.extractor.AacUtil;
|
import androidx.media3.extractor.AacUtil;
|
||||||
import androidx.media3.extractor.Ac3Util;
|
import androidx.media3.extractor.Ac3Util;
|
||||||
@ -332,6 +334,7 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
initializationExceptionPendingExceptionHolder;
|
initializationExceptionPendingExceptionHolder;
|
||||||
private final PendingExceptionHolder<WriteException> writeExceptionPendingExceptionHolder;
|
private final PendingExceptionHolder<WriteException> writeExceptionPendingExceptionHolder;
|
||||||
|
|
||||||
|
@Nullable private PlayerId playerId;
|
||||||
@Nullable private Listener listener;
|
@Nullable private Listener listener;
|
||||||
@Nullable private Configuration pendingConfiguration;
|
@Nullable private Configuration pendingConfiguration;
|
||||||
@MonotonicNonNull private Configuration configuration;
|
@MonotonicNonNull private Configuration configuration;
|
||||||
@ -486,6 +489,11 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayerId(@Nullable PlayerId playerId) {
|
||||||
|
this.playerId = playerId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsFormat(Format format) {
|
public boolean supportsFormat(Format format) {
|
||||||
return getFormatSupport(format) != SINK_FORMAT_UNSUPPORTED;
|
return getFormatSupport(format) != SINK_FORMAT_UNSUPPORTED;
|
||||||
@ -674,6 +682,9 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding);
|
configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (Util.SDK_INT >= 31 && playerId != null) {
|
||||||
|
Api31.setLogSessionIdOnAudioTrack(audioTrack, playerId);
|
||||||
|
}
|
||||||
audioSessionId = audioTrack.getAudioSessionId();
|
audioSessionId = audioTrack.getAudioSessionId();
|
||||||
audioTrackPositionTracker.setAudioTrack(
|
audioTrackPositionTracker.setAudioTrack(
|
||||||
audioTrack,
|
audioTrack,
|
||||||
@ -2103,6 +2114,7 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
audioSessionId);
|
audioSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Using deprecated AudioTrack constructor.
|
||||||
private AudioTrack createAudioTrackV9(AudioAttributes audioAttributes, int audioSessionId) {
|
private AudioTrack createAudioTrackV9(AudioAttributes audioAttributes, int audioSessionId) {
|
||||||
int streamType = Util.getStreamTypeForAudioUsage(audioAttributes.usage);
|
int streamType = Util.getStreamTypeForAudioUsage(audioAttributes.usage);
|
||||||
if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) {
|
if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) {
|
||||||
@ -2225,4 +2237,16 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
pendingException = null;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import androidx.media3.common.AuxEffectInfo;
|
|||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.PlaybackParameters;
|
import androidx.media3.common.PlaybackParameters;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
/** An overridable {@link AudioSink} implementation forwarding all methods to another sink. */
|
/** An overridable {@link AudioSink} implementation forwarding all methods to another sink. */
|
||||||
@ -38,6 +39,11 @@ public class ForwardingAudioSink implements AudioSink {
|
|||||||
sink.setListener(listener);
|
sink.setListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayerId(@Nullable PlayerId playerId) {
|
||||||
|
sink.setPlayerId(playerId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsFormat(Format format) {
|
public boolean supportsFormat(Format format) {
|
||||||
return sink.supportsFormat(format);
|
return sink.supportsFormat(format);
|
||||||
|
@ -504,6 +504,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
} else {
|
} else {
|
||||||
audioSink.disableTunneling();
|
audioSink.disableTunneling();
|
||||||
}
|
}
|
||||||
|
audioSink.setPlayerId(getPlayerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -35,6 +35,7 @@ import androidx.media3.decoder.DecoderInputBuffer;
|
|||||||
import androidx.media3.decoder.SimpleDecoder;
|
import androidx.media3.decoder.SimpleDecoder;
|
||||||
import androidx.media3.decoder.SimpleDecoderOutputBuffer;
|
import androidx.media3.decoder.SimpleDecoderOutputBuffer;
|
||||||
import androidx.media3.exoplayer.RendererConfiguration;
|
import androidx.media3.exoplayer.RendererConfiguration;
|
||||||
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
@ -84,6 +85,7 @@ public class DecoderAudioRendererTest {
|
|||||||
return FORMAT;
|
return FORMAT;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
audioRenderer.init(/* index= */ 0, PlayerId.UNSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Config(sdk = 19)
|
@Config(sdk = 19)
|
||||||
|
@ -38,6 +38,7 @@ import androidx.media3.common.MimeTypes;
|
|||||||
import androidx.media3.common.PlaybackException;
|
import androidx.media3.common.PlaybackException;
|
||||||
import androidx.media3.exoplayer.ExoPlaybackException;
|
import androidx.media3.exoplayer.ExoPlaybackException;
|
||||||
import androidx.media3.exoplayer.RendererConfiguration;
|
import androidx.media3.exoplayer.RendererConfiguration;
|
||||||
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.mediacodec.MediaCodecInfo;
|
import androidx.media3.exoplayer.mediacodec.MediaCodecInfo;
|
||||||
@ -110,6 +111,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
eventHandler,
|
eventHandler,
|
||||||
audioRendererEventListener,
|
audioRendererEventListener,
|
||||||
audioSink);
|
audioSink);
|
||||||
|
mediaCodecAudioRenderer.init(/* index= */ 0, PlayerId.UNSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -264,6 +266,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
|
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
||||||
|
|
||||||
|
exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET);
|
||||||
exceptionThrowingRenderer.enable(
|
exceptionThrowingRenderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {AUDIO_AAC, changedFormat},
|
new Format[] {AUDIO_AAC, changedFormat},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user