Skip to content
Snippets Groups Projects
Select Git revision
  • fc9957b21aefb6a9bc36137255c6fb0cf822ad0e
  • develop default protected
  • master protected
  • feature/scrollbars
  • native-audio
  • v7.3.0
  • v7.2.0
  • v7.1.0
  • v7.0.2
  • v7.0.1
  • v7.0.0
  • v5.0.1
  • v5.1.0
  • v6.1.0
  • v6.0.0
15 results

NativeAudioMacHandler.java

Blame
  • NativeAudioMacHandler.java 3.75 KiB
    package de.tobias.playpad;
    
    import java.nio.file.Path;
    import java.util.ArrayList;
    import java.util.ConcurrentModificationException;
    import java.util.Iterator;
    import java.util.List;
    
    import de.tobias.playpad.audio.AudioHandler;
    import de.tobias.playpad.pad.PadStatus;
    import de.tobias.playpad.pad.conntent.PadContent;
    import de.tobias.utils.util.Worker;
    import javafx.application.Platform;
    import javafx.beans.property.ObjectProperty;
    import javafx.beans.property.ReadOnlyObjectProperty;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.util.Duration;
    
    public class NativeAudioMacHandler extends AudioHandler {
    
    	private static final int SLEEP_TIME_POSITION = 100;
    
    	private static int counter = 0;
    
    	private final int id;
    	private ObjectProperty<Duration> positionProperty;
    	private ObjectProperty<Duration> durationProperty;
    	private boolean isLoaded;
    
    	private static Thread positionThread;
    	private static List<NativeAudioMacHandler> playedHandlers = new ArrayList<>();
    
    	static {
    		positionThread = new Thread(() ->
    		{
    			while (true) {
    				try {
    					if (playedHandlers.isEmpty()) {
    						synchronized (positionThread) {
    							positionThread.wait();
    						}
    					}
    
    					for (Iterator<NativeAudioMacHandler> iterator = playedHandlers.iterator(); iterator.hasNext();) {
    						NativeAudioMacHandler handler = iterator.next();
    						Duration seconds = Duration.seconds(NativeAudio.getPosition(handler.id));
    
    						Platform.runLater(() -> handler.positionProperty.set(seconds));
    					}
    
    					Thread.sleep(SLEEP_TIME_POSITION);
    				} catch (InterruptedException e) {
    				} catch (ConcurrentModificationException e) {
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    
    		positionThread.start();
    	}
    
    	public NativeAudioMacHandler(PadContent content) {
    		super(content);
    
    		id = counter++;
    		positionProperty = new SimpleObjectProperty<>();
    		durationProperty = new SimpleObjectProperty<>();
    	}
    
    	@Override
    	public void play() {
    		NativeAudio.play(id);
    
    		boolean start = false;
    		if (playedHandlers.isEmpty()) {
    			start = true;
    		}
    
    		if (!playedHandlers.contains(this))
    			playedHandlers.add(this);
    		if (start) {
    			synchronized (positionThread) {
    				positionThread.notify();
    			}
    		}
    	}
    
    	@Override
    	public void pause() {
    		NativeAudio.pause(id);
    		if (playedHandlers.contains(this))
    			playedHandlers.remove(this);
    	}
    
    	@Override
    	public void stop() {
    		NativeAudio.stop(id);
    		if (playedHandlers.contains(this))
    			playedHandlers.remove(this);
    	}
    
    	@Override
    	public Duration getPosition() {
    		return positionProperty.get();
    	}
    
    	@Override
    	public ReadOnlyObjectProperty<Duration> positionProperty() {
    		return positionProperty;
    	}
    
    	@Override
    	public Duration getDuration() {
    		return durationProperty.get();
    	}
    
    	@Override
    	public ReadOnlyObjectProperty<Duration> durationProperty() {
    		return durationProperty;
    	}
    
    	@Override
    	public void setVolume(double volume, double masterVolume, double customVolume) {
    		double vol = customVolume * volume * masterVolume;
    		NativeAudio.setVolume(id, vol);
    
    	}
    
    	@Override
    	public boolean isMediaLoaded() {
    		return isLoaded;
    	}
    
    	@Override
    	public void loadMedia(Path[] paths) {
    		Platform.runLater(() ->
    		{
    			if (getContent().getPad().isPadVisible()) {
    				getContent().getPad().getController().getView().showBusyView(true);
    			}
    		});
    		Worker.runLater(() ->
    		{
    			isLoaded = NativeAudio.load(id, paths[0].toString().replace(" ", "%20"));
    			if (isLoaded) {
    				Platform.runLater(() ->
    				{
    					durationProperty.set(Duration.seconds(NativeAudio.getDuration(id)));
    					getContent().getPad().setStatus(PadStatus.READY);
    					if (getContent().getPad().isPadVisible()) {
    						getContent().getPad().getController().getView().showBusyView(false);
    					}
    				});
    			}
    		});
    	}
    
    	@Override
    	public void unloadMedia() {
    		NativeAudio.dispose(id);
    	}
    
    }