private boolean provideShadowFrame(MutableAudioFrame targetFrame) { InternalAudioTrack shadow = shadowTrack; if (shadow != null && shadow.provide(targetFrame)) { if (targetFrame.isTerminator()) { shadowTrack = null; return false; } return true; } return false; }
private AudioFrame provideShadowFrame() { InternalAudioTrack shadow = shadowTrack; AudioFrame frame = null; if (shadow != null) { frame = shadow.provide(); if (frame != null && frame.isTerminator()) { shadowTrack = null; frame = null; } } return frame; }
@Override public AudioFrame provide(long timeout, TimeUnit unit) throws TimeoutException, InterruptedException { InternalAudioTrack track; lastRequestTime = System.currentTimeMillis(); if (timeout == 0 && paused.get()) { return null; } while ((track = activeTrack) != null) { AudioFrame frame = timeout > 0 ? track.provide(timeout, unit) : track.provide(); if (frame != null) { lastReceiveTime = System.nanoTime(); shadowTrack = null; if (frame.isTerminator()) { handleTerminator(track); continue; } } else if (timeout == 0) { checkStuck(track); frame = provideShadowFrame(); } return frame; } return null; }
@Override public boolean provide(MutableAudioFrame targetFrame, long timeout, TimeUnit unit) throws TimeoutException, InterruptedException { InternalAudioTrack track; lastRequestTime = System.currentTimeMillis(); if (timeout == 0 && paused.get()) { return false; } while ((track = activeTrack) != null) { if (timeout > 0 ? track.provide(targetFrame, timeout, unit) : track.provide(targetFrame)) { lastReceiveTime = System.nanoTime(); shadowTrack = null; if (targetFrame.isTerminator()) { handleTerminator(track); continue; } return true; } else if (timeout == 0) { checkStuck(track); return provideShadowFrame(targetFrame); } else { return false; } } return false; }