/*
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.restcomm.media.control.mgcp.resources;
import org.apache.log4j.Logger;
import org.restcomm.media.Component;
import org.restcomm.media.ComponentFactory;
import org.restcomm.media.ComponentType;
import org.restcomm.media.control.mgcp.connection.LocalConnectionImpl;
import org.restcomm.media.control.mgcp.connection.RtpConnectionImpl;
import org.restcomm.media.resource.dtmf.DetectorImpl;
import org.restcomm.media.resource.dtmf.GeneratorImpl;
import org.restcomm.media.resource.player.audio.AudioPlayerImpl;
import org.restcomm.media.resource.recorder.audio.AudioRecorderImpl;
import org.restcomm.media.spi.Connection;
import org.restcomm.media.spi.pooling.ResourcePool;
/**
* Implements connection's FSM.
*
* @author Oifa Yulian
* @author Henrique Rosa (henrique.rosa@telestax.com)
*/
public class ResourcesPool implements ComponentFactory {
private static final Logger logger = Logger.getLogger(ResourcesPool.class);
// Media resources
private final ResourcePool<AudioPlayerImpl> players;
private final ResourcePool<AudioRecorderImpl> recorders;
private final ResourcePool<DetectorImpl> dtmfDetectors;
private final ResourcePool<GeneratorImpl> dtmfGenerators;
// Connections
private final ResourcePool<LocalConnectionImpl> localConnections;
private final ResourcePool<RtpConnectionImpl> remoteConnections;
public ResourcesPool(ResourcePool<RtpConnectionImpl> rtpConnections, ResourcePool<LocalConnectionImpl> localConnections,
ResourcePool<AudioPlayerImpl> players, ResourcePool<AudioRecorderImpl> recorders,
ResourcePool<DetectorImpl> dtmfDetectors, ResourcePool<GeneratorImpl> dtmfGenerators) {
// Media Resources
this.players = players;
this.recorders = recorders;
this.dtmfDetectors = dtmfDetectors;
this.dtmfGenerators = dtmfGenerators;
// Connections
this.localConnections = localConnections;
this.remoteConnections = rtpConnections;
}
@Override
public Component newAudioComponent(ComponentType componentType) {
Component result = null;
switch (componentType) {
case DTMF_DETECTOR:
result = this.dtmfDetectors.poll();
if (logger.isDebugEnabled()) {
logger.debug("Allocated DTMF Detector [pool size:" + dtmfDetectors.size() + ", free:" + dtmfDetectors.count()+"]");
}
break;
case DTMF_GENERATOR:
result = this.dtmfGenerators.poll();
if (logger.isDebugEnabled()) {
logger.debug("Allocated DTMF Generator [pool size:" + dtmfGenerators.size() + ", free:" + dtmfDetectors.count() + "]");
}
break;
case PLAYER:
result = this.players.poll();
if (logger.isDebugEnabled()) {
logger.debug("Allocated Player [pool size:" + players.size() + ", free:" + players.count() +"]");
}
break;
case RECORDER:
result = this.recorders.poll();
if (logger.isDebugEnabled()) {
logger.debug("Allocated Recorder [pool size:" + recorders.size() + ", free:" + recorders.count()+"]");
}
break;
default:
break;
}
return result;
}
@Override
public void releaseAudioComponent(Component component, ComponentType componentType) {
switch (componentType) {
case DTMF_DETECTOR:
this.dtmfDetectors.offer((DetectorImpl) component);
if (logger.isDebugEnabled()) {
logger.debug("Released DTMF Detector [pool size:" + dtmfDetectors.size() + ", free:" + dtmfDetectors.size() + "]");
}
break;
case DTMF_GENERATOR:
this.dtmfGenerators.offer((GeneratorImpl) component);
if (logger.isDebugEnabled()) {
logger.debug("Released DTMF Generator [pool size:" + dtmfGenerators.size() + ",free:" + dtmfGenerators.count() +"]");
}
break;
case PLAYER:
this.players.offer((AudioPlayerImpl) component);
if (logger.isDebugEnabled()) {
logger.debug("Released Player [pool size:" + players.size() + ", free:" + players.count()+"]");
}
break;
case RECORDER:
this.recorders.offer((AudioRecorderImpl) component);
if (logger.isDebugEnabled()) {
logger.debug("Released Recorder [pool size:" + recorders.size() + ", free:" + recorders.count()+"]");
}
break;
default:
break;
}
}
@Override
public Connection newConnection(boolean isLocal) {
Connection result = null;
if (isLocal) {
result = this.localConnections.poll();
if (logger.isDebugEnabled()) {
logger.debug("Allocated local connection [pool size:" + localConnections.size() + ", free:" + localConnections.count() +"]");
}
} else {
result = this.remoteConnections.poll();
if (logger.isDebugEnabled()) {
logger.debug("Allocated remote connection [pool size:" + remoteConnections.size() + ", free:" + remoteConnections.count()+"]");
}
}
return result;
}
@Override
public void releaseConnection(Connection connection, boolean isLocal) {
if (isLocal) {
this.localConnections.offer((LocalConnectionImpl) connection);
if (logger.isDebugEnabled()) {
logger.debug("Released local connection [pool size:" + localConnections.size() + ", free:" + localConnections.count() +"]");
}
} else {
this.remoteConnections.offer((RtpConnectionImpl) connection);
if (logger.isDebugEnabled()) {
logger.debug("Released remote connection [pool size:" + remoteConnections.size() + ", free:" + remoteConnections.count()+"]");
}
}
}
}