Hmm...it looks to me the actual problem is actually simple. There is
only a dtmf handler and a stop state for exiting. If the stop state
is triggered, then the engine does not step but immediately falls back
to step state, and hence re-executes the record command all over
again. This sounds to me like what is happening based on what was
described.
I would need to know exactly which event->id's are received in the
record state as it runs, but whichever one it is, it should do a
signal step to advance the interpreter. I would expect audio idle to
eventually come out, and it may make more sense to eliminate changing
to the step state on stop and dtmf handlers entirely, and then
fallback to the interpreter only on a AUDIO_IDLE, but it would be much
better to see the event sequence you do receive to be certain.
address@hidden wrote:
> On Apr 27 2005, David Sugar wrote:
> >> Hmm...so you can build against 141?
>>
>> Perhaps tracing the record state in the aculab driver would help.
You >> can have it report each event->id it receives. Are you using a
>> timeout to set a maximum record duration? Does the timer go off?
>> What happens in the TRUNK_TIMER_EXPIRED handler in aculab/record.cpp?
>>
>> Luca Bariani wrote:
>> > have you already posted this to bayonne-aculab mailing list?
>> > > Luca
>> > > >> First, we do not use DTK111 we use DTK141 with patch from >>
DTK140 that >> gives options of building drivers as Prosody2 (TiNG) or
>> Prosody 1, >> since we could not get dtk111 to load firmware onto
our >> boards.
>> >>
>> >> You only need to create sysmbolic link of ln -s >> >>
/usr/src/aculab/dtk141 dtk111 and bayonne will build >> >>
straightforward.
>> >>
>> >> In bayonne.conf we set firmware=/root/ets_supu.upr and it >>
downloaded >> the firmware ok, it will look for dtk111 this time under
>> >> /home/aculab/dtk111 , which is another symbolic link from dtk141.
>> >>
>> >>We made thousands of calls, most of them in bulk and everthing is
ok.
>> >>
>> >> We do have problem though of recording, it keep looping and >>
>> overwriting the audio and the script will not advance unless you
press >> >> #, however if we replace record with sleep the script will
complete.
>> >>
>> >> There has been similar problem with other drivers, I believe and
I >> was >> wondering those who have been running aculab resolved this
>> aculab >> recording issue we use bayonne-1.2.14
>> >>
>> >>We are getting similar problem with bayonne-1.2.8 which we have
run >> with
>> >>dialogic with great sucess.
>> >>
>> >>Your help will be very appriciated.
>> >>
>> >>Thanks,
>> >>
>> >>Mo
>> >>
>> >>
>> >>
>> >>_______________________________________________
>> >>Bayonne-devel mailing list
>> >>address@hidden
>> >>http://lists.gnu.org/mailman/listinfo/bayonne-devel
>> > > > > > > > _______________________________________________
>> > Bayonne-devel mailing list
>> > address@hidden
>> > http://lists.gnu.org/mailman/listinfo/bayonne-devel
> > > > > Source code of record.cpp in bayonne-1.2.14
> > > #include "driver.h"
> > #ifdef CCXX_NAMESPACES
> using namespace std;
> namespace ost {
> #endif
> > bool AculabTrunk::recordHandler(TrunkEvent *event)
> {
> struct tm *dt, tbuf;
> struct stat ino;
> char buffer[32];
> const char *ext;
> Audio::Info info;
> unsigned mask;
> > switch(event->id)
> {
> case TRUNK_STOP_STATE:
> endTimer();
> handler = &AculabTrunk::stepHandler;
> StopRecordFile();
> Trunk::flags.dsp=DSP_MODE_INACTIVE;
> return true;
> case TRUNK_DTMF_KEYUP:
> mask = (1 << event->parm.dtmf.digit);
> if(!(mask & data.record.term)) {
> return false;
> }
> endTimer();
> StopRecordFile();
> Trunk::flags.dsp=DSP_MODE_INACTIVE;
> trunkSignal(TRUNK_SIGNAL_STEP);
> handler = &AculabTrunk::stepHandler;
> return true;
> case TRUNK_ENTER_STATE:
> enterState("record");
> status[id] = 'r';
> > setTimer(data.record.timeout);
> if(data.record.term) {
> setDTMFDetect(true);
> }
> else {
> Trunk::setDTMFDetect();
> }
> > ext = strrchr(data.record.name, '/');
> if(!ext)
> ext = data.record.name;
> > ext = strrchr(ext, '.');
> > info.format = raw;
> info.encoding = mulawAudio;
> info.order = 0;
> info.annotation = (char *)data.record.annotation;
> info.rate = 8000;
> > if(!ext) {
> ext = data.record.extension;
> strcat(data.record.name, ext);
> }
> > if(!stricmp(ext, ".al")) {
> info.encoding = alawAudio;
> }
> else if(!stricmp(ext, ".au"))
> {
> info.format = sun;
> info.order = __BIG_ENDIAN;
> }
> else if(!stricmp(ext, ".wav"))
> {
> info.format = riff;
> info.order = __LITTLE_ENDIAN;
> }
> > close();
> > filename=data.record.name;
> > if(data.record.offset != (unsigned long)-1)
> {
> open(data.record.name);
> setPosition(data.record.offset);
> }
> else if(data.record.append)
> open(data.record.name);
> else
> create(data.record.name, &info);
> > setSymbol(SYM_OFFSET, "0");
> setSymbol(SYM_RECORDED, "0");
> > if(!isOpen())
> {
> slog(Slog::levelError) << name<<": >
"<<data.record.name << ": cannot open" << endl;
> setSymbol(SYM_ERROR, "record-failed");
> trunkSignal(TRUNK_SIGNAL_ERROR);
> handler = &AculabTrunk::stepHandler;
> return true;
> }
> if(data.record.append) {
> setPosition();
> }
> > dt = localtime_r(&ino.st_ctime, &tbuf);
> sprintf(buffer, "%04d%02d%02d,%02d%02d%02d",
> dt->tm_year + 1900, dt->tm_mon + 1, dt->tm_mday,
> dt->tm_hour, dt->tm_min, dt->tm_sec);
> setSymbol(SYM_CREATED, buffer);
> if(data.record.info)
> {
> sprintf(buffer, "%ld", getPosition());
> setSymbol(SYM_OFFSET, buffer);
> }
> else
> StartRecordFile();
> Trunk::flags.dsp=DSP_MODE_VOICE;
> return true;
> }
> return false;
> }
> > #ifdef CCXX_NAMESPACES
> };
> #endif
> > > > > > > _______________________________________________
> Bayonne-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/bayonne-devel