bayonne-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bayonne-devel] Record with bayonne 1.2.15 And AudioFeed Question


From: Tristan
Subject: Re: [Bayonne-devel] Record with bayonne 1.2.15 And AudioFeed Question
Date: Mon, 20 Feb 2006 12:24:09 +0100
User-agent: Mozilla Thunderbird 1.0.7-1.1.fc4 (X11/20050929)

Ok here is the patch to make the transactionnal record work with the analog interface,

the only trouble I have is that the record is too high in volume despite the fact that is use set %audio.volume 80 in the script :

I'm working on it...
////////////////////////////////////////////
// Modification to DialogicTrunk::Join()  //
////////////////////////////////////////////
bool DialogicTrunk::Join(DialogicTrunk *trunk)
{
   int d1, d2, m1, m2;
   unsigned flags = MD_PCM | PM_SR8;
   SC_TSINFO tsinfo1, tsinfo2, rtsinfo;
   long scts1, scts2, arrayp[32];

   if(interface == NT_ANALOG)
   {
       if(!routing)
           return false;

       d1 = chdev;
       m1 = SC_LSI;
   }
   else
   {
       d1 = tsdev;
       m1 = SC_DTI;
   }
   if(trunk->interface == NT_ANALOG)
   {
       if(!trunk->routing)
           return false;
       d2 = trunk->chdev;
       m2 = SC_LSI;
   }
   else
   {
       d2 = trunk->tsdev;
       m2 = SC_DTI;
   }
   if(trunk->join)
       return false;

   trunk->enterMutex();
   nr_scroute(d1, m1, d2, m2, SC_FULLDUP);
   join = trunk;
   join->join = this;
   trunk->leaveMutex();
   if(trunk->data.join.recfn)
   {
       switch(getEncoding())
       {
           case mulawAudio:
               flags = MD_PCM | RM_SR8 | MD_NOGAIN;
               break;
           case alawAudio:
               flags = MD_PCM | PM_ALAW | PM_SR8;
               break;
           case voxADPCM:
               flags = MD_ADPCM | PM_SR6;
           default:
               flags = MD_ADPCM | PM_SR6;
               break;
       }
       tsinfo1.sc_numts = 1;
       tsinfo1.sc_tsarrayp = &scts1;
       switch(m1)
       {
           case SC_LSI:
               slog(Slog::levelCritical) <<" SC_LSI :D1 "<< d1 <<endl;
               ag_getxmitslot(d1, &tsinfo1);
               break;
           case SC_DTI:
               dt_getxmitslot(d1, &tsinfo1);
               break;
       }
       tsinfo2.sc_numts = 1;
       tsinfo2.sc_tsarrayp = &scts2;
       switch(m2)
       {
           case SC_LSI:
               slog(Slog::levelCritical) <<" SC_LSI :D2 "<< d2 <<endl;
ag_getxmitslot(d2, &tsinfo2); // Should use ag_getxmitslot to get the timeslot for an analog interface.
               break;
           case SC_DTI:
               dt_getxmitslot(d2, &tsinfo2);
               break;
       }
       arrayp[0] = scts1;
       arrayp[1] = scts2;
       rtsinfo.sc_numts = 2;
       rtsinfo.sc_tsarrayp = &arrayp[0];

       trunk->iofile.io_length = -1;

       DV_TPT tpt;
       DX_IOTT iott[2];
       char basebufp[MAXLEN];
       dx_clrtpt(&tpt,1);

       tpt.tp_type   = IO_EOT;
       tpt.tp_termno = DX_LCOFF;
       tpt.tp_length = 1;

       // Only for SYNC mode
//         iott[0].io_type = IO_MEM | IO_CONT ;
//         iott[0].io_bufp = basebufp;
//         iott[0].io_offset = 0;
//         iott[0].io_length = -1;

       iott[1].io_type = IO_DEV | IO_EOT ;
       iott[1].io_bufp = 0;
       iott[1].io_offset = 0;
       iott[1].io_length = -1;
       // | O_TRUNC -> Le fichier est ramené à 0 -> tente d'append
if ( (iott[1].io_fhandle = ::open(trunk->data.join.recfn, O_RDWR | O_CREAT | O_APPEND, 0666) ) == -1 ) { slog(Slog::levelCritical) <<" OPENING FAILED : "<< trunk->data.join.recfn<<endl;
       }

slog(Slog::levelCritical) <<" RECORDING JOINED TIME SLOT : "<< trunk->data.join.recfn <<" Ts1: "<< scts1 <<" Ts2: "<< scts2 << endl;

       dx_clrdigbuf(chdev);

//        slog(Slog::levelCritical) <<"dx_recm("<<chdev<<")"<<endl;
// if(dx_recm(chdev, &iott[1], &tpt, EV_ASYNC | flags , &rtsinfo) == -1) { if(dx_recm(chdev, &iott[1], &tpt, EV_ASYNC | flags , &rtsinfo) == -1) {
           slog(Slog::levelCritical) << "dxrecm() error" << endl;
       }
       slog(Slog::levelCritical) <<"dx_recm("<<chdev<<")=SUCCESS"<<endl;


/*
       if(dx_recm(chdev, &trunk->iofile, dialogicivr.getPlayTPT(),
       EV_ASYNC | flags, &rtsinfo) < 0)
       slog(Slog::levelError) << "dxrecm() error" << endl;
*/

   //  postError(chdev, "vox");

   }
   return true;
}


Julien Chavanton wrote:

I do not know since I am using only digital trunk,
I would look at tsinfo structure to verify that the analog handle is used and 
verify to be sure dx_ function is called.

Look at this part be sure it is selecting SC_LSI on the analog side.

    if(interface == NT_ANALOG)
    {
        if(!routing)
            return false;

        d1 = chdev;
        m1 = SC_LSI;
    }
    else
    {
        d1 = tsdev;
        m1 = SC_DTI;
    }

    case SC_LSI:
                dx_getxmitslot(d1, &tsinfo1);


*Globalcall drivers where migrated from Dialogic drivers and some part of 
analog support may still be broken.
However the Digital ISDN support is really good.

Julien


-----Original Message----- From: Tristan [mailto:address@hidden Sent: Thu 2/16/2006 06:50 AM To: Julien Chavanton Cc: address@hidden Subject: Re: [Bayonne-devel] Record with bayonne 1.2.15 And AudioFeed Question
        
        

        Seems like this patch is working good BUT the only voice recorded comes
        from the digital interface ( ie incoming call ), I can't get the analog
        outgoing call to be recorded...
        
        Do you have an idea why ?
        
        
        
        Tristan
        
        
        ----------------------------------------------
        
        Sorry I forgot to add the modified patch:
        
        One more question, looking at
        
http://resource.intel.com/telecom/support/releases/unix51/linux51fp1/onldoc/htmlfiles/voxapi/1453-02-92.html#P12867_337275
        I see that the flags to set for recording are not the same as in the
        source code for dx_recm()
        Is it ok or was it a mistake ? ( RM_SR8 instead of PM_SR8 )
        
        
        
        ---------Patch------------------
        
        #include <sys/ioctl.h>
        #include <linux/cdrom.h>
        #define MAXLEN 10000
        
        
        ////////////////////////////////////////////
        // Modification to DialogicTrunk::Join()  //
        ////////////////////////////////////////////
        bool DialogicTrunk::Join(DialogicTrunk *trunk)
        {
             int d1, d2, m1, m2;
             unsigned flags = MD_PCM | PM_SR8;
             SC_TSINFO tsinfo1, tsinfo2, rtsinfo;
             long scts1, scts2, arrayp[32];
        
             if(interface == NT_ANALOG)
             {
                 if(!routing)
                     return false;
        
                 d1 = chdev;
                 m1 = SC_LSI;
             }
             else
             {
                 d1 = tsdev;
                 m1 = SC_DTI;
             }
             if(trunk->interface == NT_ANALOG)
             {
                 if(!trunk->routing)
                     return false;
                 d2 = trunk->chdev;
                 m2 = SC_LSI;
             }
             else
             {
                 d2 = trunk->tsdev;
                 m2 = SC_DTI;
             }
             if(trunk->join)
                 return false;
        
             trunk->enterMutex();
             nr_scroute(d1, m1, d2, m2, SC_FULLDUP);
             join = trunk;
             join->join = this;
             trunk->leaveMutex();
             if(trunk->data.join.recfn)
             {
                 switch(getEncoding())
                 {
                     case mulawAudio:
                         flags = MD_PCM | RM_SR8 | MD_GAIN;
                         break;
                     case alawAudio:
                         flags = MD_PCM | PM_ALAW | PM_SR8;
                         break;
                     case voxADPCM:
                         flags = MD_ADPCM | PM_SR6;
                     default:
                         flags = MD_ADPCM | PM_SR6;
                         break;
                 }
                 tsinfo1.sc_numts = 1;
                 tsinfo1.sc_tsarrayp = &scts1;
                 switch(m1)
                 {
                     case SC_LSI:
                         dx_getxmitslot(d1, &tsinfo1);
                         break;
                     case SC_DTI:
                         dt_getxmitslot(d1, &tsinfo1);
                         break;
                 }
                 tsinfo2.sc_numts = 1;
                 tsinfo2.sc_tsarrayp = &scts2;
                 switch(m2)
                 {
                     case SC_LSI:
                         dx_getxmitslot(d2, &tsinfo2);
                         break;
                     case SC_DTI:
                         dt_getxmitslot(d2, &tsinfo2);
                         break;
                 }
                 arrayp[0] = scts1;
                 arrayp[1] = scts2;
                 rtsinfo.sc_numts = 2;
                 rtsinfo.sc_tsarrayp = &arrayp[0];
        
                 trunk->iofile.io_length = -1;
        
                 DV_TPT tpt;
                 DX_IOTT iott[2];
                 char basebufp[MAXLEN];
                 dx_clrtpt(&tpt,1);
                 tpt.tp_type   = IO_EOT;
                 tpt.tp_termno = DX_LCOFF;
                 tpt.tp_length = 1;
        
        
                 iott[1].io_type = IO_DEV | IO_EOT ;
                 iott[1].io_bufp = 0;
                 iott[1].io_offset = 0;
                 iott[1].io_length = -1 ;
                 iott[1].io_fhandle = ::open(trunk->data.join.recfn, O_RDWR |
        O_CREAT  | O_TRUNC, 0666) ;
        
                 slog(Slog::levelCritical) <<" RECORDING JOINED TIME SLOT : "<<
        trunk->data.join.recfn<<endl;
        
                 dx_clrdigbuf(chdev);
        
        //        slog(Slog::levelCritical) <<"dx_recm("<<chdev<<")"<<endl;
                 if(dx_recm(chdev, &iott[1], &tpt, EV_ASYNC | flags , &rtsinfo)
        == -1) {
                     slog(Slog::levelCritical) << "dxrecm() error" << endl;
                 }
                 slog(Slog::levelCritical) 
<<"dx_recm("<<chdev<<")=SUCCESS"<<endl;
        
        
        /*
                 if(dx_recm(chdev, &trunk->iofile, dialogicivr.getPlayTPT(),
                 EV_ASYNC | flags, &rtsinfo) < 0)
                 slog(Slog::levelError) << "dxrecm() error" << endl;
        */
        
             //  postError(chdev, "vox");
        
             }
             return true;
        }
        
        ---------------------------------------------------------------
        
        
        
        Instead of std::open, we have to use ::open ;)
        
        But that creates a file that is not usable in vox format...
        The thing is that the file is created and it is recording but there's no
        header for .au files.
        
        When I don't set the extention ( join %trunkid record=myfile ) I see two
        files created in /var/lib/bayonne
        ( myfile containing the raw audio and myfile.au which is header only... 
)
        
        Do you have an idea on what to do ?
        
        Julien Chavanton wrote:
        
        >True, this is not accepted with new compiler!
        >
        >I will check this if you give me some time.
        >
        >Julien
        >
        >-----Original Message-----
        >From: Tristan [mailto:address@hidden
        >Sent: February 14, 2006 11:34 AM
        >To: Julien Chavanton
        >Subject: Re: [Bayonne-devel] Record with bayonne 1.2.15 And AudioFeed
        >Question
        >
        >Hi,
        >Just a question since it's been a long time I didn't code in C++ ,
        >
        >I already changed your patch :
        >Added: #define MAXLEN 100000 // MAXLEN was undefined ...
        >
        >Changed:
        >
        >  if(interface == ANALOG) => if(interface == NT_ANALOG) // The exact
        >name is NT_ANALOG
        >
        >    if(trunk->interface == ANALOG) => if(trunk->interface == NT_ANALOG)
> >But I don't remember where to find the standard c++ function open
        >because I get this error:
        >
        >trunk.cpp: Dans member function < bool
        >   ost::DialogicTrunk::Join(ost::DialogicTrunk*) >:
        >trunk.cpp:387: error: `open' undeclared in namespace `std'
        >
        >
        >Do you have an idea ?
        >
        >Julien Chavanton wrote:
        >
> >
        >>join %session.parent record=recording.vox
        >>
        >>I suggest you try with dialogic vox file format
        >>
        >>
        >>////////////////////////////////////////////
        >>// Modification to DialogicTrunk::Join()  //
        >>////////////////////////////////////////////
        >>bool DialogicTrunk::Join(DialogicTrunk *trunk)
        >>{
        >> int d1, d2, m1, m2;
        >> unsigned flags = MD_PCM | PM_SR8;
        >> SC_TSINFO tsinfo1, tsinfo2, rtsinfo;
        >> long scts1, scts2, arrayp[32];
        >>
        >> if(interface == ANALOG)
        >> {
        >>   if(!routing)
        >>     return false;
        >>
        >>   d1 = chdev;
        >>   m1 = SC_LSI;
        >> }
        >> else
        >> {
        >>   d1 = tsdev;
        >>   m1 = SC_DTI;
        >> }
        >> if(trunk->interface == ANALOG)
        >> {
        >>   if(!trunk->routing)
        >>     return false;
        >>   d2 = trunk->chdev;
        >>   m2 = SC_LSI;
        >> }
        >> else
        >> {
        >>   d2 = trunk->tsdev;
        >>   m2 = SC_DTI;
        >> }
        >> if(trunk->join)
        >>   return false;
        >>
        >> trunk->enterMutex();
        >>       nr_scroute(d1, m1, d2, m2, SC_FULLDUP);
        >>       join = trunk;
        >>       join->join = this;
        >> trunk->leaveMutex();
        >> if(trunk->data.join.recfn)
        >> {
        >>   switch(getEncoding())
        >>   {
        >>   case mulawAudio:
        >>     flags = MD_PCM | PM_SR8;
        >>     break;
        >>   case alawAudio:
        >>     flags = MD_PCM | PM_ALAW | PM_SR8;
        >>     break;
        >>   case voxADPCM:
        >>     flags = MD_ADPCM | PM_SR6;
        >>   default:
        >>     flags = MD_ADPCM | PM_SR6;
        >>     break;
        >>   }
        >>   tsinfo1.sc_numts = 1;
        >>   tsinfo1.sc_tsarrayp = &scts1;
        >>   switch(m1)
        >>   {
        >>   case SC_LSI:
        >>     dx_getxmitslot(d1, &tsinfo1);
        >>     break;
        >>   case SC_DTI:
        >>     dt_getxmitslot(d1, &tsinfo1);
        >>     break;
        >>   }
        >>   tsinfo2.sc_numts = 1;
        >>   tsinfo2.sc_tsarrayp = &scts2;
        >>   switch(m2)
        >>   {
        >>   case SC_LSI:
        >>     dx_getxmitslot(d2, &tsinfo2);
        >>     break;
        >>   case SC_DTI:
        >>     dt_getxmitslot(d2, &tsinfo2);
        >>     break;
        >>   }
        >>   arrayp[0] = scts1;
        >>   arrayp[1] = scts2;
        >>   rtsinfo.sc_numts = 2;
        >>   rtsinfo.sc_tsarrayp = &arrayp[0];
        >>
        >>   trunk->iofile.io_length = -1;
        >>
        >>DV_TPT tpt;
        >>DX_IOTT iott[2];
        >>char basebufp[MAXLEN];
        >>dx_clrtpt(&tpt,1);
        >>tpt.tp_type   = IO_EOT;
        >>tpt.tp_termno = DX_LCOFF;
        >>tpt.tp_length = 1;
        >>
        >>
        >>iott[1].io_type = IO_DEV | IO_EOT ;
        >>iott[1].io_bufp = 0;
        >>iott[1].io_offset = 0;
        >>iott[1].io_length = -1 ;
        >>iott[1].io_fhandle = std::open(trunk->data.join.recfn, O_RDWR |
>> >>
        >O_CREAT
> >
        >>| O_TRUNC, 0666) ;
        >>
        >>slog(Slog::levelCritical) <<" RECORDING JOINNED TIME SLOT : "<<
        >>trunk->data.join.recfn<<endl;
        >>
        >>dx_clrdigbuf(chdev);
        >>
        >>slog(Slog::levelDebug) <<"dx_recm("<<chdev<<")"<<endl;
        >>if(dx_recm(chdev, &iott[1], &tpt, EV_ASYNC | flags , &rtsinfo) == -1)
>> >>
        >{
> >
        >> slog(Slog::levelError) << "dxrecm() error" << endl;
        >>}
        >>slog(Slog::levelDebug) <<"dx_recm("<<chdev<<")=SUCCESS"<<endl;
        >>
        >>
        >>/*
        >>if(dx_recm(chdev, &trunk->iofile, dialogicivr.getPlayTPT(),
        >>   EV_ASYNC | flags, &rtsinfo) < 0)
        >>   slog(Slog::levelError) << "dxrecm() error" << endl;
        >>*/
        >>
        >>   //  postError(chdev, "vox");
        >>
        >>}
        >>return true;
        >>}
        >>
        >>
        >>
        >>-----Original Message-----
        >>From: Tristan [mailto:address@hidden
        >>Sent: February 8, 2006 11:22 AM
        >>To: Julien Chavanton
        >>Cc: address@hidden
        >>Subject: Re: [Bayonne-devel] Record with bayonne 1.2.15 And AudioFeed
        >>Question
        >>
        >>Hi,
        >>
        >>Seems like i have trouble using join %thesessionidtojoin 
record=%myfile
        >>( maybe I have to use %session.parent instead of an other var ? )
        >>
        >>
        >>Looking at /var/lib/bayonne, I see the files i'm trying to record but
        >>their size is very often 65kB  or not a lot more
        >>and the record is 10-15s instead of the 10min+ it is supposed to be...
        >>
        >>Am I missing something to get it work ?
        >>
        >>The sound is also very noisy and I'm not sure to hear the two person 
on
>> >>
        >
> >
        >>the phone ...
        >>
        >>Is it limited to 1 record for all lines I have or does it have some
        >>limitation I can't see ?
        >>
        >>Do you think I can record the two ends of a join and share it with
        >>multiple listener ?
        >>
        >>Thanks in advance!
        >>
        >>Tristan
        >>
        >>Julien Chavanton wrote:
        >>
        >>
        >>
>> >>
        >>>You will not be able to do a duplex recording with record command; it
        >>>will only record the audio you are receiving on the channel binded to
        >>>the script.
        >>>
        >>>Fortunatly you can achieve this by doing a join record.
        >>>join %session.parent record=%recfile
        >>>
        >>>
        >>>This is probably not a limitation for what you are doing, but you can
        >>>not use the voice resource to play audio while you are recording but
        >>>there is another alternative for doing this.
        >>>
        >>>Julien
        >>>
        >>>
        >>>-----Original Message-----
        >>>From:
>>> >>>
        >address@hidden
> >
        >>>[mailto:address@hidden
>>> >>>
        >o
> > >>> >>> >>> >>>
        >>r
        >>
        >>
>> >>
        >>>g] On Behalf Of Tristan
        >>>Sent: January 18, 2006 11:41 AM
        >>>To: address@hidden
        >>>Subject: [Bayonne-devel] Record with bayonne 1.2.15
        >>>
        >>>Hi,
        >>>
        >>>I write because I have some troubles with the record command in
        >>>ccscript.
        >>>
        >>>I need to record conversation that customers have with our technical
        >>>support.
        >>>
        >>>I use dialogic cards ( D120JCT and D41E to do outgoing calls to the
        >>>technical support and incoming calls are taken on a D300 PCI ).
        >>>The join works like a charm but with the command wait timeout=10s
        >>>record="/path/to/myfile" I only record the technical support answer
>>> >>>
        >but
> > >>> >>> >>> >>>
        >>
        >>
>> >>
        >>>can't record the customer voice.
        >>>
        >>>I tried with join record="afile" but nothing happens.
        >>>
        >>>Searched the manual but don't found anything relevant.
        >>>
        >>>Has someone an idea please on how to do it or is it impossible ?
        >>>
        >>>The point is that it was working flawless with the same hardware with
>>> >>> >>> >>>
        >>an
        >>
        >>
>> >>
        >>>other IVR soft ( GAP for those who heard about it ), but GAP is not 
as
>>> >>>
        >
> >
        >>>good as bayonne for my production needs.
        >>>
        >>>Thanks in advance for help !
        >>>
        >>>Cheers
        >>>
        >>>
        >>>_______________________________________________
        >>>Bayonne-devel mailing list
        >>>address@hidden
        >>>http://lists.gnu.org/mailman/listinfo/bayonne-devel
        >>>
        >>>
        >>>
>>> >>> >>> >>>
        >>
        >>
>> >>
        >
> >
        
        
        





reply via email to

[Prev in Thread] Current Thread [Next in Thread]