Bowen951209 / open-karaoke-toolkit

This is a karaoke lyrics animation maker project in development.
MIT License
1 stars 1 forks source link

The timeline pointer bug. #63

Closed Bowen951209 closed 1 month ago

Bowen951209 commented 2 months ago

When pausing, pointer won't stop at the exact time pause but jump forward a little bit.

Bowen951209 commented 1 month ago

Leave a quick test here for frequent tests.

package net.okt;

import net.okt.audioUtils.Audio;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;

public class AudioPointerTest extends JFrame {
    public static void main(String[] args) throws Exception {
        new AudioPointerTest();
    }

    private long startPlaySystemTime;
    private int pauseTimePosition;
    private boolean isPLaying;

    private final Audio audio = new Audio(new File("D:\\Desktop\\Bowen\\code\\JAVA\\open-karaoke-toolkit\\samples\\LiuLongKid\\LiuLongKid.wav"));

    public AudioPointerTest() throws Exception {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        JPanel canvas = new JPanel() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                Graphics2D g2d = (Graphics2D) g;

                g2d.setColor(Color.RED);
                g2d.fillRect(audio.getTimePosition() / 2, 0, 1, 100);
            }
        };
        canvas.setPreferredSize(new Dimension(1000, 400));
        canvas.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == ' ') {
                    pause();
                }
            }
        });

        JButton playBtn = new JButton("Play");
        playBtn.addActionListener((e -> {
            play();
            canvas.requestFocus();
        }));

        JButton pauseBtn = new JButton("Pause");
        pauseBtn.addActionListener(e -> pause());

        add(canvas);
        add(playBtn);
        add(pauseBtn);
        pack();
        setVisible(true);

        new Timer(10, e -> canvas.repaint()).start();
    }

    private void play() {
        System.out.println("PLAY");
        startPlaySystemTime = System.currentTimeMillis();
        isPLaying = true;
        audio.play();
    }

    private void pause() {
        System.out.println("PAUSE");
        pauseTimePosition = getTimePosition();
        isPLaying = false;
        audio.pause();
    }

    private int getTimePosition() {
        if (isPLaying)
            return (int) (System.currentTimeMillis() - startPlaySystemTime);
        else
            return pauseTimePosition;
    }
}