RE: Record with bayonne 1.2.15 And AudioFeed Question

"Julien Chavanton" <[email protected]> Thu, 16 Feb 2006 07:12:43 -0500
Newsgroups gmane.comp.gnu.bayonne.devel
Message-ID <[email protected]>
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:[email protected]] 
	Sent: Thu 2/16/2006 06:50 AM 
	To: Julien Chavanton 
	Cc: [email protected] 
	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:[email protected]]
	>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:[email protected]]
	>>Sent: February 8, 2006 11:22 AM
	>>To: Julien Chavanton
	>>Cc: [email protected]
	>>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:
	>>>     
	>>>
	>bayonne-devel-bounces+j.chavanton=oneworldinteractive.com@gnu.org
	> 
	>
	>>>[mailto:bayonne-devel-bounces+j.chavanton=oneworldinteractive.com@gnu.
	>>>     
	>>>
	>o
	> 
	>
	>>>  
	>>>
	>>>     
	>>>
	>>r
	>>
	>>
	>>   
	>>
	>>>g] On Behalf Of Tristan
	>>>Sent: January 18, 2006 11:41 AM
	>>>To: [email protected]
	>>>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
	>>>[email protected]
	>>>http://lists.gnu.org/mailman/listinfo/bayonne-devel
	>>>
	>>>
	>>>
	>>>  
	>>>
	>>>     
	>>>
	>>
	>>
	>>   
	>>
	>
	> 
	>

_______________________________________________
Bayonne-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bayonne-devel