Re: problem while reducing the seding rate

Dinil Divakaran <[email protected]>
Newsgroups gmane.comp.gnu.ccrtp.devel
Message-ID <[email protected]>
> I have experimented with something functionally similar to this.  I noticed 
> you do not have a dispatchDataPacket at the end of your loop.  I use 
> something a bit more complex at the moment that looks like this:
>

But dispatchDataPacket is a protected class method !

- Dinil


> void RTPStream::run(void)
> {
>        size_t r, n;
>        size_t size = info.framesize;
>        timeout_t timer;
> 	bool first = true;
> 	Event event;
> 	unsigned count, jitter = Driver::sip.jitter;
> 	unsigned jsend = jitter;
> 	AudioCodec *codec = session->codec;
> 	bool dtmfdigits = false;
> 	char dbuf[65];
> 	int dig;
> 	Linear tbuf;
>
> 	if(Driver::sip.getDTMFInband())
> 		dtmf = new DTMFDetect();
>
>        setTimer(0);
>
>        for(;;)
>        {
> 		if(dtmfdigits)
> 		{
> 			dtmf->getResult(dbuf, 64);
> 			dig = -1;
> 			if(dbuf[0])
> 				dig = Bayonne::getDigit(dbuf[0]);
> 			if(dig > -1)
> 			{
> 				memset(&event, 0, sizeof(event));
> 				event.id = DTMF_KEYUP;
> 				event.dtmf.digit = dig;
> 				event.dtmf.duration = 60;
> 				if(session->postEvent(&event))
> 				{
> 					setSource(NULL);
> 					setSink(NULL);
> 					setTone(NULL);
> 				}
> 			} 
> dtmfdigits = false;
> 		}
>                incTimer(info.framing);
>                setCancel(cancelDeferred);
>                enter();
> 		if(tone)
> 		{
> 			tbuf = tone->getFrame();
> 			if(!tbuf || !codec)
> 			{
> 				fcount = 0;
> 				tone = NULL;
> 				memset(&event, 0, sizeof(event));
> 				event.id = AUDIO_IDLE;
> 				session->queEvent(&event);
> 				goto done;
> 			}
> 			if(codec)
> 			{
> 				codec->encode(tbuf, session->buffer, 
> info.framecount);
> 				putBuffer(session->buffer, size);
> //				r = dispatchDataPacket();
> 			} 
> if(jsend)
> 			{
> 				--jsend;
> 				leave();
> 				continue;
> 			}
> 					}
>                else if(source)
>                {
>                        n = source->getBuffer(session->buffer, size);
> 			if(n == size)
> 			{
> 				if(ending)
> 				{
> 					memset(&event, 0, sizeof(event));
> 					event.id = AUDIO_ACTIVE;
> 					session->queEvent(&event);
> 					ending = false;
> 				}
> 	                        putBuffer(session->buffer, size);
> 			}
> 			else if(!ending)
> 			{
> 				fcount = 0;
> 				memset(&event, 0, sizeof(event));
> 				event.id = AUDIO_IDLE;
> 				session->queEvent(&event);
> 				ending = true;
> 			}
> //                        r = dispatchDataPacket();
> 			if(jsend)
> 			{
> 				--jsend;
> 				leave();
> 				continue;
> 			}
>                }
> 		else
> 			jsend = jitter;
>
> done:
>                leave();
> 		r = dispatchDataPacket();
>                setCancel(cancelImmediate);
>
> 		if(tonecount == 1 && stopid != MSGPORT_WAKEUP)
> 		{
> 			memset(&event, 0, sizeof(event));
> 			event.id = stopid;
> 			stopid = MSGPORT_WAKEUP;
> 			session->postEvent(&event);
> 		} 
> 		if(tonecount)
> 			--tonecount;
>
> 		if(first)
> 		{
> 			while(isPendingData(0))
> 			{
> 	                        setCancel(cancelDeferred);
>        	                r = takeInDataPacket();
>                	        if(r < 0)
>                        	        break;
>
> 				jitter = Driver::sip.jitter;
>
> 				if(first)
> 				{
> 					memset(&event, 0, sizeof(event));
> 					event.id = AUDIO_START;
> 					session->queEvent(&event);
> 					count = 6;
> 					while(dtmf && count--)
> 						dtmf->putSamples(Driver::sip.silent_frame, 
> info.framecount);
> 				}
>
> 				first = false;
>
> 	                        enter();
>        	                n = getBuffer(session->buffer, r);
> 				if(dtmf && codec && n == size)
> 				{
> 					codec->decode(session->lbuffer, 
> session->buffer, info.framecount);
> 					dtmfdigits = 
> dtmf->putSamples(session->lbuffer, info.framecount); 
> }
>                	        if(sink)
>                        	        sink->putBuffer(session->buffer, n);
>                        	leave();
>                        	setCancel(cancelImmediate);
> 	                }
> 		}
> 		else if(!jitter)
> 		{
> 			if(isPendingData(0))
> 			{
> 				setCancel(cancelDeferred);
> 				r = takeInDataPacket();
> 				if(r < 0)
> 					break;
>
> 				enter();
> 				n = getBuffer(session->buffer, r);
> 				if(dtmf && codec && n == size)
> 				{
> 					codec->decode(session->lbuffer, 
> session->buffer, info.framecount);
> 					dtmfdigits = 
> dtmf->putSamples(session->lbuffer, info.framecount);
> 				}
> 				if(sink)
> 					sink->putBuffer(session->buffer, n);
> 				leave();
> 				setCancel(cancelImmediate);
> 			}
> 			else
> 			{
> 				memset(&event, 0, sizeof(event));
> 				event.id = AUDIO_STOP;
> 				session->queEvent(&event);
> 				first = true;
> 			}
> 		}
> 		else if(!first)
> 			--jitter;
>
>                timer = getTimer();
>
>                if(timer)
>                        Thread::sleep(timer);
> 		else
> 			Thread::yield();
>
> 		enter();
> 		if(fcount > 1)
> 			--fcount;
> 		else if(fcount == 1)
> 		{
> 			fcount = 0;
> 			source = NULL;
> 			sink = NULL;
> 			tone = NULL;
> 			memset(&event, 0, sizeof(event));
> 			event.id = AUDIO_IDLE;
> 			session->postEvent(&event);
> 		}
> 		leave();		        }
> }
>
>
> Dinil Divakaran wrote:
>> 
>> Hi all,
>> 
>> I was working on an example for transmitting an audio file using ccrtp 
>> (http://www.gnu.org/software/ccrtp/doc/refman/html/audiotx_8cpp-example.html) 
>> 
>> The following lines are from the above example. In this code, packets are
>> sent and then thread sleeps for a time of 'PERIOD' milliseconds. I changed
>> the value of PERIOD to 100 (milliseconds) and found that even though the
>> program says that the packets are sent; the packets weren't actually sent.
>> 'tcpdump' showed that only the first packet was sent; and thereafter only
>> RTCP packets were sent (with still lesser frequency). When I changed the
>> value of 'PERIOD' to 50, the packets were sent successfully.
>> 
>> Can anyone please tell me where have I gone wrong ?
>> 
>> --------------------------------------------------------------------------
>>                               .
>>                               .
>>                               .
>> 
>>         cout << "Transmitting " << PACKET_SIZE
>>              << " octects long packets "
>>              << "every " << PERIOD << " milliseconds..." << endl;
>> 
>>         unsigned char buffer[PACKET_SIZE];
>>         int count=PACKET_SIZE;
>> 
>>         // This will be useful for periodic execution
>>         TimerPort::setTimer(PERIOD);
>> 
>>         setCancel(cancelImmediate);
>>         // This is the main loop, where packets are transmitted.
>>         for( int i = 0 ; (!sendingfile || count > 0) ; i++ ){
>> 
>>             count = ::read(audioinput,buffer,PACKET_SIZE);
>>             if( count > 0 ){
>>                 // send an RTP packet, providing timestamp,
>>                 // payload type and payload.
>>                 socket->putData(PACKET_SIZE * i, buffer, PACKET_SIZE);
>>             }
>>             cout << "." << flush;
>> 
>>             // Let's wait for the next cycle
>>             Thread::sleep(TimerPort::getTimer());
>>             TimerPort::incTimer(PERIOD);
>>         }
>>         cout << endl << "I have got no more data to send. " <<endl;
>> 
>>                               .
>>                               .
>>                               .
>>                               .
>> --------------------------------------------------------------------------
>> 
>> - Dinil
>> 
>> 
>> 
>> _______________________________________________
>> Ccrtp-devel mailing list
>> [email protected]
>> http://lists.gnu.org/mailman/listinfo/ccrtp-devel
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.