@Override public void onReceive(Context context, Intent intent) { if (!isInitialStickyBroadcast()) { AudioCapabilities newAudioCapabilities = AudioCapabilities.getCapabilities(intent); if (!newAudioCapabilities.equals(audioCapabilities)) { audioCapabilities = newAudioCapabilities; listener.onAudioCapabilitiesChanged(newAudioCapabilities); } } }
@Override protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException { audioSink.reset(); currentPositionUs = positionUs; allowFirstBufferPositionDiscontinuity = true; allowPositionDiscontinuity = true; inputStreamEnded = false; outputStreamEnded = false; if (decoder != null) { flushDecoder(); } }
@Override public void onUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) { eventDispatcher.audioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs); onAudioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs); }
@Override protected void onEnabled(boolean joining) throws ExoPlaybackException { super.onEnabled(joining); eventDispatcher.enabled(decoderCounters); int tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId; if (tunnelingAudioSessionId != C.AUDIO_SESSION_ID_UNSET) { audioSink.enableTunnelingV21(tunnelingAudioSessionId); } else { audioSink.disableTunneling(); } }
@Override protected void onEnabled(boolean joining) throws ExoPlaybackException { decoderCounters = new DecoderCounters(); eventDispatcher.enabled(decoderCounters); int tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId; if (tunnelingAudioSessionId != C.AUDIO_SESSION_ID_UNSET) { audioSink.enableTunnelingV21(tunnelingAudioSessionId); } else { audioSink.disableTunneling(); } }
@Override public void onAudioSessionId(int audioSessionId) { eventDispatcher.audioSessionId(audioSessionId); MediaCodecAudioRenderer.this.onAudioSessionId(audioSessionId); }
@Override public void onAudioSessionId(int audioSessionId) { eventDispatcher.audioSessionId(audioSessionId); SimpleDecoderAudioRenderer.this.onAudioSessionId(audioSessionId); }
@Override public boolean hasPendingData() { return isInitialized() && audioTrackPositionTracker.hasPendingData(getWrittenFrames()); }
@Override public void release() { reset(); releaseKeepSessionIdAudioTrack(); for (AudioProcessor audioProcessor : toIntPcmAvailableAudioProcessors) { audioProcessor.reset(); } for (AudioProcessor audioProcessor : toFloatPcmAvailableAudioProcessors) { audioProcessor.reset(); } audioSessionId = C.AUDIO_SESSION_ID_UNSET; playing = false; }
private void setVolumeInternal() { if (!isInitialized()) { // Do nothing. } else if (Util.SDK_INT >= 21) { setVolumeInternalV21(audioTrack, volume); } else { setVolumeInternalV3(audioTrack, volume); } }
@Override public void onUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) { eventDispatcher.audioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs); onAudioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs); }
@Override protected void onStopped() { updateCurrentPosition(); audioSink.pause(); }
@Override public boolean isReady() { return audioSink.hasPendingData() || (inputFormat != null && !waitingForKeys && (isSourceReady() || outputBuffer != null)); }
@Override public void setAudioAttributes(AudioAttributes audioAttributes) { if (this.audioAttributes.equals(audioAttributes)) { return; } this.audioAttributes = audioAttributes; if (tunneling) { // The audio attributes are ignored in tunneling mode, so no need to reset. return; } reset(); audioSessionId = C.AUDIO_SESSION_ID_UNSET; }
@Override protected void onCodecInitialized(String name, long initializedTimestampMs, long initializationDurationMs) { eventDispatcher.decoderInitialized(name, initializedTimestampMs, initializationDurationMs); }
@Override public long getPositionUs() { if (getState() == STATE_STARTED) { updateCurrentPosition(); } return currentPositionUs; }
@Override public void reset() { flush(); buffer = EMPTY_BUFFER; channelCount = Format.NO_VALUE; sampleRateHz = Format.NO_VALUE; outputChannels = null; pendingOutputChannels = null; active = false; }
/** * Rejects the timestamp last polled in {@link #maybePollTimestamp(long)}. The instance will enter * the error state and poll timestamps infrequently until the next call to {@link * #acceptTimestamp()}. */ public void rejectTimestamp() { updateState(STATE_ERROR); }
@Override public void onAudioDecoderInitialized(String decoderName, long initializedTimestampMs, long initializationDurationMs) { for (AudioRendererEventListener audioDebugListener : audioDebugListeners) { audioDebugListener.onAudioDecoderInitialized(decoderName, initializedTimestampMs, initializationDurationMs); } }
@Override public void onAudioDisabled(DecoderCounters counters) { for (AudioRendererEventListener audioDebugListener : audioDebugListeners) { audioDebugListener.onAudioDisabled(counters); } audioFormat = null; audioDecoderCounters = null; audioSessionId = C.AUDIO_SESSION_ID_UNSET; }