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
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
_______________________________________________ Ccrtp-devel mailing list [email protected] http://lists.gnu.org/mailman/listinfo/ccrtp-devel
