001package jmri.jmrit.logixng.actions; 002 003import java.util.*; 004 005import jmri.*; 006import jmri.jmrit.audio.AudioListener; 007import jmri.jmrit.audio.AudioSource; 008import jmri.jmrit.logixng.*; 009import jmri.jmrit.logixng.util.LogixNG_SelectEnum; 010import jmri.jmrit.logixng.util.LogixNG_SelectNamedBean; 011import jmri.jmrit.logixng.util.parser.*; 012import jmri.util.ThreadingUtil; 013 014/** 015 * This action controls an audio object. 016 * 017 * @author Daniel Bergqvist Copyright 2021 018 */ 019public class ActionAudio extends AbstractDigitalAction { 020 021 private final LogixNG_SelectNamedBean<Audio> _selectNamedBean = 022 new LogixNG_SelectNamedBean<>( 023 this, Audio.class, InstanceManager.getDefault(AudioManager.class)); 024 025 private final LogixNG_SelectEnum<Operation> _selectEnum = 026 new LogixNG_SelectEnum<>(this, Operation.values(), Operation.Play); 027 028 029 public ActionAudio(String sys, String user) 030 throws BadUserNameException, BadSystemNameException { 031 super(sys, user); 032 } 033 034 @Override 035 public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException { 036 DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class); 037 String sysName = systemNames.get(getSystemName()); 038 String userName = userNames.get(getSystemName()); 039 if (sysName == null) sysName = manager.getAutoSystemName(); 040 ActionAudio copy = new ActionAudio(sysName, userName); 041 copy.setComment(getComment()); 042 _selectNamedBean.copy(copy._selectNamedBean); 043 _selectEnum.copy(copy._selectEnum); 044 return manager.registerAction(copy); 045 } 046 047 public LogixNG_SelectNamedBean<Audio> getSelectNamedBean() { 048 return _selectNamedBean; 049 } 050 051 public LogixNG_SelectEnum<Operation> getSelectEnum() { 052 return _selectEnum; 053 } 054 055 /** {@inheritDoc} */ 056 @Override 057 public LogixNG_Category getCategory() { 058 return LogixNG_Category.ITEM; 059 } 060 061 /** {@inheritDoc} */ 062 @Override 063 public void execute() throws JmriException { 064 Audio audio = _selectNamedBean.evaluateNamedBean(getConditionalNG()); 065 066 if (audio == null) return; 067 068 Operation operation = _selectEnum.evaluateEnum(getConditionalNG()); 069 070 ThreadingUtil.runOnLayoutWithJmriException(() -> { 071 if (audio.getSubType() == Audio.SOURCE) { 072 AudioSource audioSource = (AudioSource) audio; 073 switch (operation) { 074 case Play: 075 audioSource.play(); 076 break; 077 case Stop: 078 audioSource.stop(); 079 break; 080 case PlayToggle: 081 audioSource.togglePlay(); 082 break; 083 case Pause: 084 audioSource.pause(); 085 break; 086 case Resume: 087 audioSource.resume(); 088 break; 089 case PauseToggle: 090 audioSource.togglePause(); 091 break; 092 case Rewind: 093 audioSource.rewind(); 094 break; 095 case FadeIn: 096 audioSource.fadeIn(); 097 break; 098 case FadeOut: 099 audioSource.fadeOut(); 100 break; 101 case ResetPosition: 102 audioSource.resetCurrentPosition(); 103 break; 104 default: 105 break; 106 } 107 } else if (audio.getSubType() == Audio.LISTENER) { 108 AudioListener audioListener = (AudioListener) audio; 109 switch (operation) { 110 case ResetPosition: 111 audioListener.resetCurrentPosition(); 112 break; 113 default: 114 break; // nothing needed for others 115 } 116 } 117 }); 118 } 119 120 @Override 121 public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException { 122 throw new UnsupportedOperationException("Not supported."); 123 } 124 125 @Override 126 public int getChildCount() { 127 return 0; 128 } 129 130 @Override 131 public String getShortDescription(Locale locale) { 132 return Bundle.getMessage(locale, "ActionAudio_Short"); 133 } 134 135 @Override 136 public String getLongDescription(Locale locale) { 137 String namedBean = _selectNamedBean.getDescription(locale); 138 String operation = _selectEnum.getDescription(locale); 139 140 return Bundle.getMessage(locale, "ActionAudio_Long", operation, namedBean); 141 } 142 143 /** {@inheritDoc} */ 144 @Override 145 public void setup() { 146 // Do nothing 147 } 148 149 /** {@inheritDoc} */ 150 @Override 151 public void disposeMe() { 152 } 153 154 155 public enum Operation { 156 Play(Bundle.getMessage("ActionAudio_Operation_Play")), 157 PlayToggle(Bundle.getMessage("ActionAudio_Operation_PlayToggle")), 158 Pause(Bundle.getMessage("ActionAudio_Operation_Pause")), 159 PauseToggle(Bundle.getMessage("ActionAudio_Operation_PauseToggle")), 160 Resume(Bundle.getMessage("ActionAudio_Operation_Resume")), 161 Stop(Bundle.getMessage("ActionAudio_Operation_Stop")), 162 FadeIn(Bundle.getMessage("ActionAudio_Operation_FadeIn")), 163 FadeOut(Bundle.getMessage("ActionAudio_Operation_FadeOut")), 164 Rewind(Bundle.getMessage("ActionAudio_Operation_Rewind")), 165 ResetPosition(Bundle.getMessage("ActionAudio_Operation_ResetPosition")); 166 167 private final String _text; 168 169 private Operation(String text) { 170 this._text = text; 171 } 172 173 @Override 174 public String toString() { 175 return _text; 176 } 177 178 } 179 180 /** {@inheritDoc} */ 181 @Override 182 public void getUsageDetail(int level, NamedBean bean, List<NamedBeanUsageReport> report, NamedBean cdl) { 183 _selectNamedBean.getUsageDetail(level, bean, report, cdl, this, LogixNG_SelectNamedBean.Type.Action); 184 } 185 186// private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionAudio.class); 187 188}