package com.rayo.core.verb; import javax.media.mscontrol.Value; import javax.media.mscontrol.mediagroup.CodecConstants; import javax.media.mscontrol.mediagroup.FileFormatConstants; import javax.validation.Valid; import javax.validation.constraints.NotNull; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.joda.time.Duration; import com.voxeo.moho.media.output.OutputCommand.BargeinType; public class Output extends BaseVerb { public static final String MISSING_PROMPT = "Nothing to do"; private BargeinType bargeinType; private Duration startOffset; private Boolean startPaused; private Duration repeatInterval; private Integer repeatTimes; private Duration maxTime; private String voice; private Boolean broadcast; @Valid @NotNull(message=Output.MISSING_PROMPT) private Ssml prompt; public Ssml getPrompt() { return prompt; } public void setPrompt(Ssml prompt) { this.prompt = prompt; } public BargeinType getBargeinType() { return bargeinType; } public void setBargeinType(BargeinType type) { this.bargeinType = type; } public String getVoice() { return voice; } public void setVoice(String voice) { this.voice = voice; } public Duration getStartOffset() { return startOffset; } public void setStartOffset(Duration offset) { this.startOffset = offset; } public Integer getRepeatTimes() { return repeatTimes; } public void setRepeatTimes(Integer repeatTimes) { this.repeatTimes = repeatTimes; } public Boolean isStartPaused() { return startPaused; } public void setStartPaused(Boolean startInPauseMode) { this.startPaused = startInPauseMode; } public static Value toFileFormat(String format) { // Adapt the input value to FileFormatConstants' toString() format format = "FORMAT_" + format; if (FileFormatConstants.FORMAT_3G2.toString().equalsIgnoreCase(format)) { return FileFormatConstants.FORMAT_3G2; } else if (FileFormatConstants.FORMAT_3GP.toString().equalsIgnoreCase(format)) { return FileFormatConstants.FORMAT_3GP; } else if (FileFormatConstants.GSM.toString().equalsIgnoreCase(format)) { return FileFormatConstants.GSM; } else if (FileFormatConstants.INFERRED.toString().equalsIgnoreCase(format)) { return FileFormatConstants.INFERRED; } else if (FileFormatConstants.RAW.toString().equalsIgnoreCase(format)) { return FileFormatConstants.RAW; } else if (FileFormatConstants.WAV.toString().equalsIgnoreCase(format)) { return FileFormatConstants.WAV; } else { // Manual assignments as FileFormatConstants does not include all supported file types if (format.equalsIgnoreCase("FORMAT_MP3")) { return FileFormatConstants.INFERRED; } } return null; } public static Value toCodecValue(String codec) { if (CodecConstants.ADPCM_16K_G726.toString().equalsIgnoreCase(codec)) { return CodecConstants.ADPCM_16K_G726; } else if (CodecConstants.ADPCM_32K.toString().equalsIgnoreCase(codec)) { return CodecConstants.ADPCM_32K; } else if (CodecConstants.ADPCM_32K_G726.toString().equalsIgnoreCase(codec)) { return CodecConstants.ADPCM_32K_G726; } else if (CodecConstants.ADPCM_32K_OKI.toString().equalsIgnoreCase(codec)) { return CodecConstants.ADPCM_32K_OKI; } else if (CodecConstants.ALAW_PCM_48K.toString().equalsIgnoreCase(codec)) { return CodecConstants.ALAW_PCM_48K; } else if (CodecConstants.ALAW_PCM_64K.toString().equalsIgnoreCase(codec)) { return CodecConstants.ALAW_PCM_64K; } else if (CodecConstants.AMR.toString().equalsIgnoreCase(codec)) { return CodecConstants.AMR; } else if (CodecConstants.AMR_WB.toString().equalsIgnoreCase(codec)) { return CodecConstants.AMR_WB; } else if (CodecConstants.EVRC.toString().equalsIgnoreCase(codec)) { return CodecConstants.EVRC; } else if (CodecConstants.G723_1B.toString().equalsIgnoreCase(codec)) { return CodecConstants.G723_1B; } else if (CodecConstants.G729_A.toString().equalsIgnoreCase(codec)) { return CodecConstants.G729_A; } else if (CodecConstants.GSM.toString().equalsIgnoreCase(codec)) { return CodecConstants.GSM; } else if (CodecConstants.H263.toString().equalsIgnoreCase(codec)) { return CodecConstants.H263; } else if (CodecConstants.H263_1998.toString().equalsIgnoreCase(codec)) { return CodecConstants.H263_1998; } else if (CodecConstants.H264.toString().equalsIgnoreCase(codec)) { return CodecConstants.H264; } else if (CodecConstants.INFERRED.toString().equalsIgnoreCase("CODEC_" + codec)) { return CodecConstants.INFERRED; } else if (CodecConstants.LINEAR_16BIT_128K.toString().equalsIgnoreCase(codec)) { return CodecConstants.LINEAR_16BIT_128K; } else if (CodecConstants.LINEAR_16BIT_256K.toString().equalsIgnoreCase(codec)) { return CodecConstants.LINEAR_16BIT_256K; } else if (CodecConstants.LINEAR_8BIT_64K.toString().equalsIgnoreCase(codec)) { return CodecConstants.LINEAR_8BIT_64K; } else if (CodecConstants.MP4V_ES.toString().equalsIgnoreCase(codec)) { return CodecConstants.MP4V_ES; } else if (CodecConstants.MULAW_PCM_64K.toString().equalsIgnoreCase(codec)) { return CodecConstants.MULAW_PCM_64K; } return null; } public Duration getRepeatInterval() { return repeatInterval; } public void setRepeatInterval(Duration repeatInterval) { this.repeatInterval = repeatInterval; } public Duration getMaxTime() { return maxTime; } public void setMaxTime(Duration maxTime) { this.maxTime = maxTime; } public Boolean getBroadcast() { return broadcast; } public void setBroadcast(Boolean broadcast) { this.broadcast = broadcast; } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .append("callId", getCallId()) .append("verbId", getVerbId()) .append("interrupt-on", getBargeinType()) .append("start-offset", getStartOffset() != null ? getStartOffset().getMillis() : null) .append("start-paused", isStartPaused()) .append("repeatInterval", getRepeatInterval() != null ? getRepeatInterval().getMillis() : null) .append("repeatTimes", getRepeatTimes()) .append("maxTime", getMaxTime() != null ? getMaxTime().getMillis() : null) .append("voice", getVoice()) .append("prompt", getPrompt()) .toString(); } }