@@ -592,34 +592,21 @@ public async Task PreviousAsync()
592592
593593 public async Task SeekAsync ( TimeSpan position )
594594 {
595- if ( _mediaPlayer == null || _mediaPlayer . Length <= 0 )
596- {
597- System . Diagnostics . Debug . WriteLine ( $ "[AudioPlayer] SeekAsync: Cannot seek - player null or length 0") ;
598- return ;
599- }
595+ if ( _mediaPlayer == null ) return ;
600596
601- _lastSeekTime = DateTime . UtcNow ;
602597 var length = _mediaPlayer . Length ;
603- var isSeekable = _mediaPlayer . IsSeekable ;
604- var posBefore = _mediaPlayer . Position ;
605- var timeBefore = _mediaPlayer . Time ;
598+ if ( length <= 0 ) return ;
606599
607- System . Diagnostics . Debug . WriteLine ( $ "[AudioPlayer] === SEEK START === target={ position . TotalSeconds : F1} s, isSeekable={ isSeekable } ") ;
600+ _lastSeekTime = DateTime . UtcNow ;
601+
602+ // Use Position (0.0 to 1.0 ratio) which is more reliable than Time
603+ var positionRatio = ( float ) ( position . TotalMilliseconds / length ) ;
604+ positionRatio = Math . Clamp ( positionRatio , 0f , 0.99f ) ;
608605
609606 await MainThread . InvokeOnMainThreadAsync ( ( ) =>
610607 {
611- // Try using Time property (milliseconds) - sometimes works better than Position
612- _mediaPlayer . Time = ( long ) position . TotalMilliseconds ;
608+ _mediaPlayer . Position = positionRatio ;
613609 } ) ;
614-
615- // Check if seek worked
616- await Task . Delay ( 200 ) ;
617- if ( _mediaPlayer != null )
618- {
619- var posAfter = _mediaPlayer . Position ;
620- var timeAfter = _mediaPlayer . Time ;
621- System . Diagnostics . Debug . WriteLine ( $ "[AudioPlayer] === SEEK END === before={ timeBefore } ms, after={ timeAfter } ms, isSeekable={ isSeekable } ") ;
622- }
623610 }
624611
625612 public async Task PlayAtIndexAsync ( int index )
0 commit comments