001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.gui.layer.markerlayer; 003 004 import java.awt.event.ActionEvent; 005 import java.net.URL; 006 007 import org.openstreetmap.josm.Main; 008 import org.openstreetmap.josm.data.coor.LatLon; 009 import org.openstreetmap.josm.tools.AudioPlayer; 010 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider; 011 012 /** 013 * Marker class with audio playback capability. 014 * 015 * @author Frederik Ramm <frederik@remote.org> 016 * 017 */ 018 public class AudioMarker extends ButtonMarker { 019 020 private URL audioUrl; 021 private static AudioMarker recentlyPlayedMarker = null; 022 public double syncOffset; 023 public boolean timeFromAudio = false; // as opposed to from the GPX track 024 025 public AudioMarker(LatLon ll, TemplateEngineDataProvider dataProvider, URL audioUrl, MarkerLayer parentLayer, double time, double offset) { 026 super(ll, dataProvider, "speech.png", parentLayer, time, offset); 027 this.audioUrl = audioUrl; 028 this.syncOffset = 0.0; 029 this.timeFromAudio = false; 030 } 031 032 @Override public void actionPerformed(ActionEvent ev) { 033 play(); 034 } 035 036 public static AudioMarker recentlyPlayedMarker() { 037 return recentlyPlayedMarker; 038 } 039 040 public URL url() { 041 return audioUrl; 042 } 043 044 /** 045 * Starts playing the audio associated with the marker offset by the given amount 046 * @param after : seconds after marker where playing should start 047 */ 048 public void play(double after) { 049 try { 050 // first enable tracing the audio along the track 051 Main.map.mapView.playHeadMarker.animate(); 052 053 AudioPlayer.play(audioUrl, offset + syncOffset + after); 054 recentlyPlayedMarker = this; 055 } catch (Exception e) { 056 AudioPlayer.audioMalfunction(e); 057 } 058 } 059 060 /** 061 * Starts playing the audio associated with the marker: used in response to pressing 062 * the marker as well as indirectly 063 * 064 */ 065 public void play() { play(0.0); } 066 067 public void adjustOffset(double adjustment) { 068 syncOffset = adjustment; // added to offset may turn out negative, but that's ok 069 } 070 071 public double syncOffset() { 072 return syncOffset; 073 } 074 075 @Override 076 protected TemplateEntryProperty getTextTemplate() { 077 return TemplateEntryProperty.forAudioMarker(parentLayer.getName()); 078 } 079 }