@@ -463,6 +463,70 @@ protected void onFlush(StreamMetadata streamMetadata) {
463463 assertThat (lastPositionOffsetUs .get ()).isEqualTo (500_000 );
464464 }
465465
466+ @ Test
467+ public void flush_beforeRegisteringFirstInput_maintainsPreviousPositionOffset () throws Exception {
468+ AtomicLong lastPositionOffsetUs = new AtomicLong (C .TIME_UNSET );
469+ BaseAudioProcessor fakeProcessor =
470+ new PassthroughAudioProcessor () {
471+ @ Override
472+ protected void onFlush (StreamMetadata streamMetadata ) {
473+ lastPositionOffsetUs .set (streamMetadata .positionOffsetUs );
474+ }
475+ };
476+ AudioGraph audioGraph =
477+ new AudioGraph (
478+ new DefaultAudioMixer .Factory (), /* effects= */ ImmutableList .of (fakeProcessor ));
479+
480+ audioGraph .flush (/* positionOffsetUs= */ 500_000 );
481+ lastPositionOffsetUs .set (C .TIME_UNSET );
482+ audioGraph .registerInput (FAKE_ITEM , getPcmFormat (MONO_44100 ));
483+
484+ assertThat (lastPositionOffsetUs .get ()).isEqualTo (500_000 );
485+ }
486+
487+ @ Test
488+ public void flush_multipleTimes_propagatesLastPositionOffsetAfterFirstInput () throws Exception {
489+ AtomicLong lastPositionOffsetUs = new AtomicLong (C .TIME_UNSET );
490+ BaseAudioProcessor fakeProcessor =
491+ new PassthroughAudioProcessor () {
492+ @ Override
493+ protected void onFlush (StreamMetadata streamMetadata ) {
494+ lastPositionOffsetUs .set (streamMetadata .positionOffsetUs );
495+ }
496+ };
497+ AudioGraph audioGraph =
498+ new AudioGraph (
499+ new DefaultAudioMixer .Factory (), /* effects= */ ImmutableList .of (fakeProcessor ));
500+
501+ audioGraph .flush (/* positionOffsetUs= */ 500_000 );
502+ audioGraph .flush (/* positionOffsetUs= */ 600_000 );
503+ audioGraph .flush (/* positionOffsetUs= */ 700_000 );
504+ audioGraph .registerInput (FAKE_ITEM , getPcmFormat (MONO_44100 ));
505+
506+ assertThat (lastPositionOffsetUs .get ()).isEqualTo (700_000 );
507+ }
508+
509+ @ Test
510+ public void flush_afterRegisteringFirstInput_updatesPositionOffset () throws Exception {
511+ AtomicLong lastPositionOffsetUs = new AtomicLong (C .TIME_UNSET );
512+ BaseAudioProcessor fakeProcessor =
513+ new PassthroughAudioProcessor () {
514+ @ Override
515+ protected void onFlush (StreamMetadata streamMetadata ) {
516+ lastPositionOffsetUs .set (streamMetadata .positionOffsetUs );
517+ }
518+ };
519+ AudioGraph audioGraph =
520+ new AudioGraph (
521+ new DefaultAudioMixer .Factory (), /* effects= */ ImmutableList .of (fakeProcessor ));
522+
523+ audioGraph .registerInput (FAKE_ITEM , getPcmFormat (MONO_44100 ));
524+ assertThat (lastPositionOffsetUs .get ()).isEqualTo (0 );
525+ audioGraph .flush (/* positionOffsetUs= */ 500_000 );
526+
527+ assertThat (lastPositionOffsetUs .get ()).isEqualTo (500_000 );
528+ }
529+
466530 /** Drains the graph and returns the number of bytes output. */
467531 private static int drainAudioGraph (AudioGraph audioGraph ) throws ExportException {
468532 int bytesOutput = 0 ;
0 commit comments