Re: problem while reducing the seding rate
David Sugar <[email protected]>
| Newsgroups | gmane.comp.gnu.ccrtp.devel |
|---|---|
| Organization | GNU Telephony |
| Message-ID | <[email protected]> |
I have always used a RTP stream class that is derived from
SymmetricRTPSession, and with a custom run method, so I had not noticed
this. You may well be correct that dispatchDataPacket() should be public.
Dinil Divakaran wrote:
>
>> 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
>>
>>
_______________________________________________
Ccrtp-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/ccrtp-devel
dyfet.vcf
(text/x-vcard, 187 B)
begin:vcard fn:David Sugar n:Sugar;David org:GNU Telephony adr:;;;;;;USA email;internet:[email protected] x-mozilla-html:FALSE url:http://www.gnutelephony.org version:2.1 end:vcard