@Override public boolean isEnded() { return outputStreamEnded && audioSink.isEnded(); }
@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(); } }
private void updateCurrentPosition() { long newCurrentPositionUs = audioSink.getCurrentPositionUs(isEnded()); if (newCurrentPositionUs != AudioSink.CURRENT_POSITION_NOT_SET) { currentPositionUs = allowPositionDiscontinuity ? newCurrentPositionUs : Math.max(currentPositionUs, newCurrentPositionUs); allowPositionDiscontinuity = false; } }
@Test public void testImmediatelyReadEndOfStreamPlaysAudioSinkToEndOfStream() throws Exception { audioRenderer.enable( RendererConfiguration.DEFAULT, new Format[] {FORMAT}, new FakeSampleStream(FORMAT, /* eventDispatcher= */ null, /* shouldOutputSample= */ false), 0, false, 0); audioRenderer.setCurrentStreamFinal(); when(mockAudioSink.isEnded()).thenReturn(true); while (!audioRenderer.isEnded()) { audioRenderer.render(0, 0); } verify(mockAudioSink, times(1)).playToEndOfStream(); audioRenderer.disable(); verify(mockAudioSink, times(1)).release(); }
audioSink.handleDiscontinuity(); audioSink.configure(outputFormat.pcmEncoding, outputFormat.channelCount, outputFormat.sampleRate, 0, null, encoderDelay, encoderPadding); audioTrackNeedsConfigure = false; if (audioSink.handleBuffer(outputBuffer.data, outputBuffer.timeUs)) { decoderCounters.renderedOutputBufferCount++; outputBuffer.release();
private void processEndOfStream() throws ExoPlaybackException { outputStreamEnded = true; try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { throw ExoPlaybackException.createForRenderer(e, getIndex()); } }
@Override protected void onDisabled() { try { lastInputTimeUs = C.TIME_UNSET; pendingStreamChangeCount = 0; audioSink.release(); } finally { try { super.onDisabled(); } finally { decoderCounters.ensureUpdated(); eventDispatcher.disabled(decoderCounters); } } }
codec.releaseOutputBuffer(bufferIndex, false); decoderCounters.skippedOutputBufferCount++; audioSink.handleDiscontinuity(); return true; if (audioSink.handleBuffer(buffer, bufferPresentationTimeUs)) { codec.releaseOutputBuffer(bufferIndex, false); decoderCounters.renderedOutputBufferCount++;
@Override public PlaybackParameters getPlaybackParameters() { return audioSink.getPlaybackParameters(); }
@CallSuper @Override protected void onProcessedOutputBuffer(long presentationTimeUs) { while (pendingStreamChangeCount != 0 && presentationTimeUs >= pendingStreamChangeTimesUs[0]) { audioSink.handleDiscontinuity(); pendingStreamChangeCount--; System.arraycopy( pendingStreamChangeTimesUs, /* srcPos= */ 1, pendingStreamChangeTimesUs, /* destPos= */ 0, pendingStreamChangeCount); } }
@Override protected void onOutputFormatChanged(MediaCodec codec, MediaFormat outputFormat) throws ExoPlaybackException { @C.Encoding int encoding; MediaFormat format; if (passthroughMediaFormat != null) { encoding = MimeTypes.getEncoding(passthroughMediaFormat.getString(MediaFormat.KEY_MIME)); format = passthroughMediaFormat; } else { encoding = pcmEncoding; format = outputFormat; } int channelCount = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT); int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE); int[] channelMap; if (codecNeedsDiscardChannelsWorkaround && channelCount == 6 && this.channelCount < 6) { channelMap = new int[this.channelCount]; for (int i = 0; i < this.channelCount; i++) { channelMap[i] = i; } } else { channelMap = null; } try { audioSink.configure(encoding, channelCount, sampleRate, 0, channelMap, encoderDelay, encoderPadding); } catch (AudioSink.ConfigurationException e) { throw ExoPlaybackException.createForRenderer(e, getIndex()); } }
@Override protected void renderToEndOfStream() throws ExoPlaybackException { try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { throw ExoPlaybackException.createForRenderer(e, getIndex()); } }
@Override protected void onDisabled() { inputFormat = null; audioTrackNeedsConfigure = true; waitingForKeys = false; try { releaseDecoder(); audioSink.release(); } finally { try { if (drmSession != null) { drmSessionManager.releaseSession(drmSession); } } finally { try { if (pendingDrmSession != null && pendingDrmSession != drmSession) { drmSessionManager.releaseSession(pendingDrmSession); } } finally { drmSession = null; pendingDrmSession = null; decoderCounters.ensureUpdated(); eventDispatcher.disabled(decoderCounters); } } } }
@Override public PlaybackParameters getPlaybackParameters() { return audioSink.getPlaybackParameters(); }
if (outputStreamEnded) { try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { throw ExoPlaybackException.createForRenderer(e, getIndex());
@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 boolean isEnded() { return super.isEnded() && audioSink.isEnded(); }
private void updateCurrentPosition() { long newCurrentPositionUs = audioSink.getCurrentPositionUs(isEnded()); if (newCurrentPositionUs != AudioSink.CURRENT_POSITION_NOT_SET) { currentPositionUs = allowPositionDiscontinuity ? newCurrentPositionUs : Math.max(currentPositionUs, newCurrentPositionUs); allowPositionDiscontinuity = false; } }