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}