diff --git a/internal/player/unified_ffmpeg_player.go b/internal/player/unified_ffmpeg_player.go index 62c4ace..f3ff241 100644 --- a/internal/player/unified_ffmpeg_player.go +++ b/internal/player/unified_ffmpeg_player.go @@ -146,7 +146,6 @@ func (p *UnifiedPlayer) Load(path string, offset time.Duration) error { // Initialize audio context for playback sampleRate := 48000 channels := 2 - bytesPerSample := 2 // 16-bit = 2 bytes ctx, ready, err := oto.NewContext(&oto.NewContextOptions{ SampleRate: sampleRate, @@ -612,47 +611,26 @@ func (p *UnifiedPlayer) startVideoProcess() error { // readAudioStream reads and processes audio from the audio pipe func (p *UnifiedPlayer) readAudioStream() { - buffer := make([]byte, 4096) // 85ms chunks + if p.audioContext == nil || p.audioPipeReader == nil { + return + } + + p.mu.Lock() + if p.audioPlayer == nil { + p.audioPlayer = p.audioContext.NewPlayer(p.audioPipeReader) + p.audioPlayer.Play() + } + p.mu.Unlock() + + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() for { select { case <-p.ctx.Done(): logging.Debug(logging.CatPlayer, "Audio reading goroutine stopped") return - - default: - // Read from audio pipe - n, err := p.audioPipeReader.Read(buffer) - if err != nil && err.Error() != "EOF" { - logging.Error(logging.CatPlayer, "Audio read error: %v", err) - continue - } - - if n == 0 { - continue - } - - // Initialize audio player if needed - if p.audioPlayer == nil && p.audioContext != nil { - player, err := p.audioContext.NewPlayer(p.audioPipeReader) - if err != nil { - logging.Error(logging.CatPlayer, "Failed to create audio player: %v", err) - return - } - p.audioPlayer = player - } - - // Write audio data to player buffer - if p.audioPlayer != nil { - p.audioPlayer.Write(buffer[:n]) - } - - // Buffer for sync monitoring (keep small to avoid memory issues) - if len(p.audioBuffer) > 32768 { // Max 1 second at 48kHz - p.audioBuffer = p.audioBuffer[len(p.audioBuffer)-16384:] // Keep half - } - - // Simple audio sync timing + case <-ticker.C: p.updateAVSync() } }