Exemplo n.º 1
0
void TimerTestFixture::testTimerWithTimebase(){
    
	set_realtime(94);

	shared_ptr<TimeBase> tb(new TimeBase());
	shared_ptr<Timer> t(new Timer());
	
	MWTime time_amount = 1000;
	shared_ptr<Variable> time_to_wait(new ConstantVariable(time_amount));
	StartTimer a(t,tb, time_to_wait);

	shared_ptr <Clock> clock = Clock::instance();
	MWTime then = clock->getCurrentTimeUS();
	tb->setNow();

	for(int i = 1; i < 5000; i++){
		a.execute();
		
		while(!t->hasExpired())  clock->sleepUS(10);
		MWTime now = clock->getCurrentTimeUS();
		//cerr << "Now: " << now << endl;
		
		MWTime error = (now - then) - (MWTime)(*time_to_wait);
		//cerr << "Error: " << (long long) error << endl;
		CPPUNIT_ASSERT( abs(error) < 2000 );
		CPPUNIT_ASSERT( error > 0 );
		
		time_to_wait->setValue(i * time_amount);
		
		
		//cerr << "Waiting: " << (long long)(*time_to_wait) << endl;
	}

}
Exemplo n.º 2
0
// transfers around correct time postions
static snd_pcm_sframes_t a2dp_transfer(snd_pcm_ioplug_t *io,
			const snd_pcm_channel_area_t *areas,
			snd_pcm_uframes_t offset, snd_pcm_uframes_t size)
{
	snd_pcm_a2dp_t *a2dp = io->private_data;
	char *buf;
	int len;
	struct media_packet_header packet_header;
	struct media_payload_header payload_header;
	int codesize,datatoread;
	unsigned long sleeptime;
	struct timeval dt;
	

	codesize=a2dp->sbc.subbands*a2dp->sbc.blocks*a2dp->sbc.channels*2; // size of data encoded by sbc_encode in one call
	datatoread=min(codesize,size*a2dp->frame_bytes); // amount of data to read
	buf = (char *) areas->addr + (areas->first + areas->step * offset) / 8;
    	if(lenbufe<codesize && lenbufe+datatoread<sizeof(bufe)){ // if not enough data in bufe to encode and there is space in bufe
		memcpy(bufe+lenbufe,buf,datatoread);// we read data to bufe
		lenbufe+=datatoread;
	}
	else{datatoread=0;}//nothing has been read

	if(lenbufe>=codesize && a2dp->len + a2dp->sbc.len < 678){ // if enough data in bufe to encode and not enough frame to fill up mtu: encoding
		change_endian(bufe,codesize); // changing the endianness
		len = sbc_encode(&(a2dp->sbc), bufe, codesize); //encode
		memmove(bufe, bufe + len, lenbufe - len); //shift the bufe                                 
		lenbufe-=len;
		nbytes+=len;
		sleeptime += a2dp->sbc.duration;
		if (len <= 0)
			return len;
		frame_count++;
		memcpy(a2dp->buf + a2dp->len, a2dp->sbc.data, a2dp->sbc.len); // copy encoded frames into a2dp->buf
		a2dp->len+=a2dp->sbc.len;
		if (a2dp->state == BT_CONNECTED)
			a2dp->num += len / a2dp->frame_bytes; //update pointer
			a2dp->num %=io->buffer_size;
	}		

	if(a2dp->len + a2dp->sbc.len > 678){ // if packet is formed
		dt.tv_usec=1000000*a2dp->sbc.subbands*a2dp->sbc.blocks*frame_count/io->rate; // time interval between transmitions
		dt.tv_sec=0;
		if(time_to_wait(&tsend, &dt)==0){ // time to send data
			memset(&payload_header, 0, sizeof(payload_header)); // fill up the headers
			memset(&packet_header, 0, sizeof(packet_header)); //---
			payload_header.frame_count=frame_count;
			packet_header.v = 2;
			packet_header.pt = 1;
			packet_header.sequence_number = htons(seq_num);
			packet_header.timestamp = htonl(timestamp);
			packet_header.ssrc = htonl(1);
			timestamp += (a2dp->sbc.blocks + 1)*4 * (a2dp->sbc.subbands + 1)*4;
			memcpy(a2dp->buf, &packet_header, sizeof(packet_header)); //copy the headers to buf
			memcpy(a2dp->buf + sizeof(packet_header), &payload_header, sizeof(payload_header));//---
			write(a2dp->sk,a2dp->buf,a2dp->len); // sending the packet
			a2dp->len = sizeof(packet_header)+sizeof(payload_header); //inital position in buf, just after headers
			frame_count=0;
			sleeptime=0;
			seq_num++;
		}else{usleep(1);}
	}
	return datatoread / a2dp->frame_bytes;
}