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; } }
// 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; }