001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.audio;
003
004import java.awt.event.ActionEvent;
005import java.io.IOException;
006
007import org.openstreetmap.josm.io.audio.AudioPlayer;
008import org.openstreetmap.josm.io.audio.AudioUtil;
009import org.openstreetmap.josm.spi.preferences.Config;
010import org.openstreetmap.josm.tools.Shortcut;
011
012/**
013 * Abstract superclass of {@link AudioFasterAction} and {@link AudioSlowerAction}.
014 * @since 563
015 */
016public abstract class AudioFastSlowAction extends AbstractAudioAction {
017
018    private double multiplier;
019
020    /**
021     * Constructs a new {@code AudioFastSlowAction}.
022     *
023     * @param name the action's text as displayed on the menu (if it is added to a menu)
024     * @param iconName the filename of the icon to use
025     * @param tooltip  a longer description of the action that will be displayed in the tooltip.
026     * @param shortcut a ready-created shortcut object.
027     * @param fast {@code true} to increase speed (faster audio), {@code false} to decrease it (slower audio).
028     */
029    public AudioFastSlowAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean fast) {
030        super(name, iconName, tooltip, shortcut, true);
031        multiplier = Config.getPref().getDouble("audio.fastfwdmultiplier", 1.3);
032        if (!fast)
033            multiplier = 1.0 / multiplier;
034    }
035
036    @Override
037    public void actionPerformed(ActionEvent e) {
038        double speed = AudioPlayer.speed();
039        if (speed * multiplier <= 0.1)
040            return;
041        try {
042            if (AudioPlayer.playing() || AudioPlayer.paused())
043                AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position(), speed * multiplier);
044        } catch (IOException | InterruptedException ex) {
045            AudioUtil.audioMalfunction(ex);
046        }
047    }
048}