@Override public boolean isEnded() { return !isInitialized() || (handledEndOfStream && !hasPendingData()); }
private void setVolumeInternal() { if (!isInitialized()) { // Do nothing. } else if (Util.SDK_INT >= 21) { setVolumeInternalV21(audioTrack, volume); } else { setVolumeInternalV3(audioTrack, volume); } }
@Override public void play() { playing = true; if (isInitialized()) { audioTrackPositionTracker.start(); audioTrack.play(); } }
@Override public void pause() { playing = false; if (isInitialized() && audioTrackPositionTracker.pause()) { audioTrack.pause(); } }
@Override public boolean hasPendingData() { return isInitialized() && audioTrackPositionTracker.hasPendingData(getWrittenFrames()); }
@Override public PlaybackParameters setPlaybackParameters(PlaybackParameters playbackParameters) { if (isInitialized() && !canApplyPlaybackParameters) { this.playbackParameters = PlaybackParameters.DEFAULT; return this.playbackParameters; } PlaybackParameters lastSetPlaybackParameters = afterDrainPlaybackParameters != null ? afterDrainPlaybackParameters : !playbackParametersCheckpoints.isEmpty() ? playbackParametersCheckpoints.getLast().playbackParameters : this.playbackParameters; if (!playbackParameters.equals(lastSetPlaybackParameters)) { if (isInitialized()) { // Drain the audio processors so we can determine the frame position at which the new // parameters apply. afterDrainPlaybackParameters = playbackParameters; } else { // Update the playback parameters now. this.playbackParameters = audioProcessorChain.applyPlaybackParameters(playbackParameters); } } return this.playbackParameters; }
@Override public long getCurrentPositionUs(boolean sourceEnded) { if (!isInitialized() || startMediaTimeState == START_NOT_SET) { return CURRENT_POSITION_NOT_SET; } long positionUs = audioTrackPositionTracker.getCurrentPositionUs(sourceEnded); positionUs = Math.min(positionUs, framesToDurationUs(getWrittenFrames())); return startMediaTimeUs + applySkipping(applySpeedup(positionUs)); }
@Override public void playToEndOfStream() throws WriteException { if (handledEndOfStream || !isInitialized()) { return; } if (drainAudioProcessorsToEndOfStream()) { // The audio processors have drained, so drain the underlying audio track. audioTrackPositionTracker.handleEndOfStream(getWrittenFrames()); audioTrack.stop(); bytesUntilNextAvSync = 0; handledEndOfStream = true; } }
@Override public void reset() { if (isInitialized()) { submittedPcmBytes = 0; submittedEncodedFrames = 0;
throws InitializationException, WriteException { Assertions.checkArgument(inputBuffer == null || buffer == inputBuffer); if (!isInitialized()) { initialize(); if (playing) {
&& isInitialized() && outputEncoding == encoding && outputSampleRate == sampleRate