/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package net.java.sip.communicator.service.protocol.media; import net.java.sip.communicator.service.protocol.*; import org.jitsi.service.configuration.*; import org.jitsi.service.neomedia.*; import org.jitsi.service.neomedia.codec.*; import org.jitsi.service.neomedia.format.*; import org.jitsi.util.*; import java.util.*; /** * Represents a default/base implementation of OperationSetDTMF * which attempts to make it easier for implementers to provide complete * solutions while focusing on implementation-specific functionality. * * @author Damian Minkov */ public abstract class AbstractOperationSetDTMF implements OperationSetDTMF { /** * The DTMF method used to send tones. */ protected DTMFMethod dtmfMethod; /** * The minimal tone duration. */ protected int minimalToneDuration; /** * The maximal tone duration. */ protected int maximalToneDuration; /** * The tone volume. */ protected int volume; /** * Creates the AbstractOperationSetDTMF and initialize * some settings. * * @param pps the protocol provider. */ public AbstractOperationSetDTMF(ProtocolProviderService pps) { this.dtmfMethod = getDTMFMethod(pps); this.minimalToneDuration = getMinimalToneDurationSetting(pps); this.maximalToneDuration = getMaximalToneDurationSetting(); this.volume = getVolumeSetting(pps); } /** * Gets the minimal DTMF tone duration for this account. * * @param pps the Protocol provider service * * @return The minimal DTMF tone duration for this account. */ private static int getMinimalToneDurationSetting(ProtocolProviderService pps) { AccountID accountID = pps.getAccountID(); String minimalToneDurationString = accountID.getAccountPropertyString("DTMF_MINIMAL_TONE_DURATION"); int minimalToneDuration = OperationSetDTMF.DEFAULT_DTMF_MINIMAL_TONE_DURATION; // Check if there is a specific value for this account. if(!StringUtils.isNullOrEmpty(minimalToneDurationString)) { minimalToneDuration = Integer.valueOf(minimalToneDurationString); } // Else look at the global property. else { ConfigurationService cfg = ProtocolProviderActivator.getConfigurationService(); // Check if there is a custom value for the minimal tone duration. if(cfg != null) { minimalToneDuration = cfg.getInt( OperationSetDTMF.PROP_MINIMAL_RTP_DTMF_TONE_DURATION, minimalToneDuration); } } return minimalToneDuration; } /** * Gets the maximal DTMF tone duration for this account. * * @return The maximal DTMF tone duration for this account. */ private static int getMaximalToneDurationSetting() { int maximalToneDuration = OperationSetDTMF.DEFAULT_DTMF_MAXIMAL_TONE_DURATION; // Look at the global property. ConfigurationService cfg = ProtocolProviderActivator.getConfigurationService(); // Check if there is a custom value for the maximal tone duration. if(cfg != null) { maximalToneDuration = cfg.getInt( OperationSetDTMF.PROP_MAXIMAL_RTP_DTMF_TONE_DURATION, maximalToneDuration); } return maximalToneDuration; } /** * Returns the corresponding DTMF method used for this account. * * @param pps the Protocol provider service * * @return the DTMFEnum corresponding to the DTMF method set for this * account. */ private static DTMFMethod getDTMFMethod(ProtocolProviderService pps) { AccountID accountID = pps.getAccountID(); String dtmfString = accountID.getAccountPropertyString("DTMF_METHOD"); // Verifies that the DTMF_METHOD property string is correctly set. // If not, sets this account to the "auto" DTMF method and corrects the // property string. if(dtmfString == null || (!dtmfString.equals("AUTO_DTMF") && !dtmfString.equals("RTP_DTMF") && !dtmfString.equals("SIP_INFO_DTMF") && !dtmfString.equals("INBAND_DTMF"))) { dtmfString = "AUTO_DTMF"; accountID.putAccountProperty("DTMF_METHOD", dtmfString); } if(dtmfString.equals("AUTO_DTMF")) { return DTMFMethod.AUTO_DTMF; } else if(dtmfString.equals("RTP_DTMF")) { return DTMFMethod.RTP_DTMF; } else if(dtmfString.equals("SIP_INFO_DTMF")) { return DTMFMethod.SIP_INFO_DTMF; } else // if(dtmfString.equals(INBAND_DTMF")) { return DTMFMethod.INBAND_DTMF; } } /** * Checks whether rfc4733 is negotiated for this call. * * @param peer the call peer. * @return whether we can use rfc4733 in this call. */ protected static boolean isRFC4733Active(MediaAwareCallPeer peer) { Iterator iter = peer .getMediaHandler() .getStream(MediaType.AUDIO) .getDynamicRTPPayloadTypes() .values() .iterator(); while (iter.hasNext()) { MediaFormat mediaFormat = iter.next(); if(Constants.TELEPHONE_EVENT.equals(mediaFormat.getEncoding())) return true; } return false; } /** * Gets the DTMF tone volume for this account. * * @return The DTMF tone volume for this account. */ private static int getVolumeSetting(ProtocolProviderService pps) { AccountID accountID = pps.getAccountID(); String volumeString = accountID.getAccountPropertyString("DTMF_TONE_VOLUME"); int vol = OperationSetDTMF.DEFAULT_DTMF_TONE_VOLUME; // Check if there is a specific value for this account. if(!StringUtils.isNullOrEmpty(volumeString)) { vol = Integer.valueOf(vol); } return vol; } }