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
>