int rtdal_itfspscq_recv(r_itf_t obj, void* buffer, int len) { RTDAL_ASSERT_PARAM(buffer); RTDAL_ASSERT_PARAM(len>=0); int n, plen; void *ptr; if ((n = rtdal_itfspscq_pop(obj, &ptr, &plen, rtdal_time_slot())) != 1) { return n; } if (plen > len) { plen = len; } hdebug("obj=0x%x, rcv pkt=0x%x\n",obj,ptr); memcpy(buffer, ptr, (size_t) plen); if ((n = rtdal_itfspscq_release(obj)) == 1) { return n; } hdebug("release pkt 0x%x\n",ptr); return plen; }
int rtdal_itfspscq_pop(r_itf_t obj, void **ptr, int *len, int tstamp) { cast(obj,itf); RTDAL_ASSERT_PARAM(ptr); RTDAL_ASSERT_PARAM(len); *ptr = NULL; *len = 0; if (spscq_is_empty(itf)) { qdebug("[empty] read=%d, tstamp=%d\n",itf->read,itf->packets[itf->read].tstamp); return 0; } if (itf->packets[itf->read].tstamp > tstamp) { qdebug("[delay] read=%d, tstamp=%d\n",itf->read,itf->packets[itf->read].tstamp); return 0; } if (itf->packets[itf->read].tstamp < tstamp && itf->parent.delay) { rtdal_itfspscq_release(obj); } qdebug("[ok] read=%d, tstamp=%d (now=%d)\n",itf->read,itf->packets[itf->read].tstamp,tstamp); *ptr = itf->packets[itf->read].data; *len = itf->packets[itf->read].len; return 1; }
int rtdal_itfspscq_recv(r_itf_t obj, void* buffer, int len, int tstamp) { RTDAL_ASSERT_PARAM(buffer); RTDAL_ASSERT_PARAM(len>=0); int n, plen; void *ptr=NULL; do { if ((n = rtdal_itfspscq_pop(obj, &ptr, &plen, tstamp)) < 1) { return n; } } while (n == 2); if (plen > len) { plen = len; } memcpy(buffer, ptr, (size_t) plen); if ((n = rtdal_itfspscq_release(obj,NULL,0)) != 1) { printf("Caution packet could not be released (%d)\n",n); } return plen; }