Hi,
when i play an announcement with the following sbb and then i try to
record something, it does not work! The mediaserver saves a wav file
with header informations ( 44 Byte) and no speech. When i only record
something with this sbb it works.
Can you help me?
I use Mobicents ALL
v1.2.1.GA with Mobicents Media Server
v1.0.3.GA
(JSR309).
Greetings
Klaus
package de.hda.voicemail;
import de.hda.voicemail.events.MsEvent;
import javax.slee.ActivityContextInterface;
import javax.slee.UnrecognizedActivityException;
import org.apache.log4j.Logger;
import org.mobicents.mscontrol.*;
import org.mobicents.mscontrol.events.MsEventAction;
import org.mobicents.mscontrol.events.MsEventFactory;
import org.mobicents.mscontrol.events.MsRequestedEvent;
import org.mobicents.mscontrol.events.MsRequestedSignal;
import org.mobicents.mscontrol.events.ann.MsPlayRequestedSignal;
import org.mobicents.mscontrol.events.audio.MsRecordRequestedSignal;
import org.mobicents.mscontrol.events.dtmf.MsDtmfRequestedEvent;
import org.mobicents.mscontrol.events.dtmf.MsDtmfRequestedSignal;
import org.mobicents.mscontrol.events.pkg.DTMF;
import org.mobicents.mscontrol.events.pkg.MsAnnouncement;
import org.mobicents.mscontrol.events.pkg.MsAudio;
public abstract class MediaSbb extends CommonSbb {
private final static String IVR_ENDPOINT = "media/trunk/IVR/$";
public MediaSbb() {
super();
logger = Logger.getLogger(MediaSbb.class);
}
public void start(String endpointName) {
logger.info("Joining " + endpointName + " with " +
IVR_ENDPOINT);
setEndpointName(endpointName);
}
public void onIVRConnected(MsLinkEvent evt,
ActivityContextInterface aci) {
logger.info("Joined IVR connected");
MsEvent event = getMsEvent();
MsLink link = getLocalLink();
if (null == link) {
logger.info("link is null");
return;
}
logger.info("announcement: " + event.getFilePathAnnouncement
());
logger.info("record: " + event.getFilePathRecord());
logger.info("typ: " + event.getTyp());
logger.info("recordTime: " + event.getRecordTime());
MsEndpoint ivr = link.getEndpoints()[1];
if (null == ivr) {
logger.info("ivr is null");
return;
}
MsEventFactory eventFactory = msProvider.getEventFactory();
//Record
MsRecordRequestedSignal record = (MsRecordRequestedSignal)
eventFactory.createRequestedSignal(MsAudio.RECORD);
record.setFile(event.getFilePathRecord());
record.setRecordTime(event.getRecordTime());
MsRequestedEvent onFailed = eventFactory.createRequestedEvent
(MsAudio.FAILED);
onFailed.setEventAction(MsEventAction.NOTIFY);
//Dtmf
MsDtmfRequestedEvent onDtmf = (MsDtmfRequestedEvent)
eventFactory.createRequestedEvent(DTMF.TONE);
MsDtmfRequestedSignal dtmfSignal = (MsDtmfRequestedSignal)
eventFactory.createRequestedSignal(DTMF.TONE);
dtmfSignal.setTone("1");
//Announcement
MsPlayRequestedSignal play = (MsPlayRequestedSignal)
eventFactory.createRequestedSignal(MsAnnouncement.PLAY);
play.setURL(event.getFilePathAnnouncement());
MsRequestedEvent onAnnouncementCompleted =
eventFactory.createRequestedEvent(MsAnnouncement.COMPLETED);
onAnnouncementCompleted.setEventAction(MsEventAction.NOTIFY);
MsRequestedEvent onAnnouncementFailed =
eventFactory.createRequestedEvent(MsAnnouncement.FAILED);
onFailed.setEventAction(MsEventAction.NOTIFY);
MsRequestedSignal[] requestedSignals = null;
MsRequestedEvent[] requestedEvents = null;
switch (event.getTyp()) {
case MsEvent.DTMF:
logger.info("dtmf");
requestedEvents = new MsRequestedEvent[]{onDtmf};
requestedSignals = new MsRequestedSignal[]
{dtmfSignal};
break;
case MsEvent.RECORD:
logger.info("record");
requestedEvents = new MsRequestedEvent[]{onFailed};
requestedSignals = new MsRequestedSignal[]{record};
break;
case MsEvent.DTMF | MsEvent.RECORD:
logger.info("dtmf record");
requestedEvents = new MsRequestedEvent[]{onFailed,
onDtmf};
requestedSignals = new MsRequestedSignal[]{record,
dtmfSignal};
break;
case MsEvent.ANNOUNCEMENT:
logger.info("announcement");
requestedEvents = new MsRequestedEvent[]
{onAnnouncementCompleted, onAnnouncementFailed};
requestedSignals = new MsRequestedSignal[]{play};
break;
case MsEvent.DTMF | MsEvent.ANNOUNCEMENT:
logger.info("dtmf announcement");
requestedEvents = new MsRequestedEvent[]
{onAnnouncementCompleted, onAnnouncementFailed, onDtmf};
requestedSignals = new MsRequestedSignal[]{play,
dtmfSignal};
break;
case MsEvent.RECORD | MsEvent.ANNOUNCEMENT:
logger.info("record announcement");
requestedEvents = new MsRequestedEvent[]
{onAnnouncementCompleted, onAnnouncementFailed, onFailed};
requestedSignals = new MsRequestedSignal[]{play,
record};
break;
case MsEvent.DTMF | MsEvent.RECORD | MsEvent.ANNOUNCEMENT:
logger.info("dtmf record announcement");
requestedEvents = new MsRequestedEvent[]
{onAnnouncementCompleted, onAnnouncementFailed, onFailed, onDtmf};
requestedSignals = new MsRequestedSignal[]{play,
record, dtmfSignal};
break;
default:
return;
}
ivr.execute(requestedSignals, requestedEvents, link);
}
public void onLinkFailed(MsLinkEvent evt, ActivityContextInterface
aci) {
logger.info("LinkFailed");
}
public void onLinkDisconnected(MsLinkEvent evt,
ActivityContextInterface aci) {
logger.info("LinkDisconnected");
if(getRestart())
{
makeLink();
setRestart(new Boolean(false));
}
}
public void onMsEvent(MsEvent event, ActivityContextInterface aci)
{
logger.info("==== onMsEvent ====");
startMedia(event);
}
public ActivityContextInterface startMedia(MsEvent event) {
logger.info("==== start ====");
setMsEvent(event);
if (null != getLink()) {
getLink().release();
setRestart(new Boolean(true));
return null;
}
setRestart(new Boolean(false));
return makeLink();
}
public ActivityContextInterface makeLink()
{
MsConnection connection = (MsConnection) getConnectionActivity
().getActivity();
MsSession session = connection.getSession();
MsLink link = session.createLink(MsLinkMode.FULL_DUPLEX);
ActivityContextInterface linkActivity = null;
try {
linkActivity =
msActivityFactory.getActivityContextInterface(link);
} catch (UnrecognizedActivityException ex) {
}
linkActivity.attach(sbbContext.getSbbLocalObject());
setLinkAci(linkActivity);
setLocalLink(link);
link.join(getEndpointName(), IVR_ENDPOINT);
return linkActivity;
}
public void onAnnouncementComplete(MsNotifyEvent evt,
ActivityContextInterface aci) {
logger.info("call onAnnouncementComplete");
}
public void onAnnouncementFailed(MsNotifyEvent evt,
ActivityContextInterface aci) {
logger.info("call onAnnouncementFailed");
}
public void onFailed(MsNotifyEvent evt, ActivityContextInterface
aci) {
logger.info("call onFailed");
}
public void onDtmf(MsNotifyEvent evt, ActivityContextInterface
aci) {
logger.info("call onDtmf");
}
public abstract MsLink getLocalLink();
public abstract void setLocalLink(MsLink link);
public abstract MsEvent getMsEvent();
public abstract void setMsEvent(MsEvent msEvent);
public abstract String getEndpointName();
public abstract void setEndpointName(String endpointName);
public abstract Boolean getRestart();
public abstract void setRestart(Boolean restart) ;
}