Can not record after announcement

6 views
Skip to first unread message

klaus1977

unread,
Dec 8, 2009, 6:00:43 AM12/8/09
to mobicents-public
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) ;
}

Klaus Schwarzkopf

unread,
Dec 9, 2009, 6:44:56 AM12/9/09
to mobicent...@googlegroups.com
Hi,

in media/1.x.y/core/server-impl/src/main/java/org
/mobicents/media/server/impl/events/audio/Recorder.java

line 181: AudioFormat fmt = (AudioFormat) buffer.getFormat();

The fmt.toString() prints telephone-event/8000 and sampleRate an
sampleSizeInBits is not NOT_SPECIFIED.

I play an announcement with dtmf.

Is this an bug? I use now the svn.

Regards,

Klaus

Bartosz Baranowski

unread,
Dec 9, 2009, 10:32:54 AM12/9/09
to mobicent...@googlegroups.com
Ops, sorry , missed this thread. I Will check wtih src once I get a minute. Will reply here for first message.

On Wed, Dec 9, 2009 at 12:44 PM, Klaus Schwarzkopf <klau...@gmx.de> wrote:
Hi,

in media/1.x.y/core/server-impl/src/main/java/org
/mobicents/media/server/impl/events/audio/Recorder.java

line 181: AudioFormat fmt = (AudioFormat) buffer.getFormat();

The fmt.toString() prints telephone-event/8000 and sampleRate an sampleSizeInBits is not NOT_SPECIFIED.

I play an announcement with dtmf.

Wdym? What are You exactly doing? And how.
Is this an bug? I use now the svn.

Regards,

Klaus



klaus1977 wrote:
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



--
Bartosz Baranowski
JBoss R & D
==================================
Word of criticism meant to improve is always step forward.

Klaus Schwarzkopf

unread,
Dec 9, 2009, 2:35:55 PM12/9/09
to mobicent...@googlegroups.com
Hi,

1. i make a Packet Relay Endpoint
2. onConnectionOpen i create the MediaSbb (see first post)

SbbIf MediaSbb = null;
try {
MediaSbb = (SbbIf) this.getMediaSbb().create();
} catch (CreateException e) {
logger.error("Unexpected error", e);
return;
}
aci.attach(MediaSbb);
MediaSbb.start(evt.getConnection().getEndpoint().getLocalName());

3. play an announcement with dtmf
MsEvent msEvent = new MsEvent((MsEvent.ANNOUNCEMENT |
MsEvent.DTMF), getAnnouncement(), null);
getMediaObject().startMedia(msEvent);

4. receive dmtf and if the dtmfsequence (password) is ok, record speech
without dtmf

String recordFile = "recorder/" + getGroupId() + "/" + new
SimpleDateFormat("yyyy-MM-dd_").format(new Date()) + new
Date().getTime() + ".wav";
MsEvent msEvent = new MsEvent((MsEvent.RECORD), null, recordFile);
msEvent.setRecordTime(60);
getMediaObject().startMedia(msEvent);
5. MediaSbb disconnect the IVR Endpoint and reconnect it
6. record the message -> failed

After restart mobicents, i get this exception on first try:

20:29:58,819 ERROR [STDERR] Exception in thread "Thread-209"
20:29:58,819 ERROR [STDERR] java.lang.NullPointerException
20:29:58,819 ERROR [STDERR] at
com.sun.media.sound.WaveFileWriter.writeWaveFile(WaveFileWriter.java:238)
20:29:58,819 ERROR [STDERR] at
com.sun.media.sound.WaveFileWriter.write(WaveFileWriter.java:117)
20:29:58,819 ERROR [STDERR] at
javax.sound.sampled.AudioSystem.write(AudioSystem.java:1297)
20:29:58,820 ERROR [STDERR] at
org.mobicents.media.server.impl.events.audio.Recorder$RecorderRunnable.run(Recorder.java:140)
20:29:58,820 ERROR [STDERR] at java.lang.Thread.run(Thread.java:595)

See also my second post.

Regards,

Klaus
> I use Mobicents ALL v1.2.1.GA <http://v1.2.1.GA> with Mobicents
> Media Server v1.0.3.GA <http://v1.0.3.GA>

Klaus Schwarzkopf

unread,
Dec 13, 2009, 10:21:55 AM12/13/09
to mobicent...@googlegroups.com
Hi,

i made an example that shows my problem. The url is
http://fbi.hooster.de/download/master/jslee/voicemail.zip

The resource adapters msc-ra and sip11-ra are needed.

The user agent (twinkle) settings are the same as converged demo.

I hope somebody can help me.

Regards,

Klaus

Bartosz Baranowski

unread,
Dec 14, 2009, 4:51:59 PM12/14/09
to mobicent...@googlegroups.com
Hey Klaus
Sorry for delay. Im the last MMS team member available till xmass and we are already undergoing one release, followed by another, and another I think, not sure, so Im rather short on time. I will give it a look asap. Thanks for providing test case, this is how things like this should be dealt with.

Bartosz Baranowski

unread,
Jan 5, 2010, 4:40:18 AM1/5/10
to mobicent...@googlegroups.com
Hey Klaus.
Seems fixed.
1. Your service does not close link properly on bye I think(did not see it happen),
2. correct, rfc dtmfs shouyld not be recorded, added filter.

Not sure if I got everything correctly service lacks sound files, but recording worked fine now. If You are bound to certain release You could change dtmf to inband.

Klaus Schwarzkopf

unread,
Jan 5, 2010, 5:57:54 AM1/5/10
to mobicent...@googlegroups.com
Hey Bartosz,

thanks, the service record now the message, but i get this message very
often:

11:47:53,779 INFO [Recorder] recorderStream blocked

Thanks for your hints, too.

Regards,

Klaus

Reply all
Reply to author
Forward
0 new messages