/*************************************************************************** ** Return elements written. */ ring_buffer_size_t PaUtil_WriteRingBuffer( PaUtilRingBuffer *rbuf, const void *data, ring_buffer_size_t elementCount, const int hopsize, const int offset ) { ring_buffer_size_t size1, size2, numWritten; void *data1, *data2; numWritten = PaUtil_GetRingBufferWriteRegions( rbuf, elementCount, &data1, &size1, &data2, &size2 ); if(hopsize == 1) { if( size2 > 0 ) { memcpy( data1, data, size1*rbuf->elementSizeBytes ); data = ((char *)data) + size1*rbuf->elementSizeBytes; memcpy( data2, data, size2*rbuf->elementSizeBytes ); } else { memcpy( data1, data, size1*rbuf->elementSizeBytes ); } } else { int i, j, k; data = ((char *)data) + offset*rbuf->elementSizeBytes; if( size2 > 0) { for(i = 0; i < size1; i++) { for(k = 0; k < rbuf->elementSizeBytes; k++) { ((char *)data1)[i*rbuf->elementSizeBytes+k] = ((char *)data)[i*rbuf->elementSizeBytes*hopsize+k]; } } data = ((char *)data) + size1*rbuf->elementSizeBytes; for(j = 0; j < size2; j++) { for(k = 0; k < rbuf->elementSizeBytes; k++) { ((char *)data2)[j*rbuf->elementSizeBytes+k] = ((char *)data)[j*rbuf->elementSizeBytes*hopsize+k]; } } } else { for(i = 0; i < size1; i++) { for(k = 0; k < rbuf->elementSizeBytes; k++) { ((char *)data1)[i*rbuf->elementSizeBytes+k] = ((char *)data)[i*rbuf->elementSizeBytes*hopsize+k]; } } } } PaUtil_AdvanceRingBufferWriteIndex( rbuf, numWritten ); return numWritten; }
/*************************************************************************** ** Return elements written. */ ring_buffer_size_t PaUtil_WriteRingBuffer( PaUtilRingBuffer *rbuf, const void *data, ring_buffer_size_t elementCount ) { ring_buffer_size_t size1, size2, numWritten; void *data1, *data2; numWritten = PaUtil_GetRingBufferWriteRegions( rbuf, elementCount, &data1, &size1, &data2, &size2 ); if( size2 > 0 ) { memcpy( data1, data, size1*rbuf->elementSizeBytes ); data = ((char *)data) + size1*rbuf->elementSizeBytes; memcpy( data2, data, size2*rbuf->elementSizeBytes ); } else { memcpy( data1, data, size1*rbuf->elementSizeBytes ); } PaUtil_AdvanceRingBufferWriteIndex( rbuf, numWritten ); return numWritten; }
/*************************************************************************** ** Return bytes written. */ long PaUtil_WriteRingBuffer( PaUtilRingBuffer *rbuf, const void *data, long numBytes ) { long size1, size2, numWritten; void *data1, *data2; numWritten = PaUtil_GetRingBufferWriteRegions( rbuf, numBytes, &data1, &size1, &data2, &size2 ); if( size2 > 0 ) { memcpy( data1, data, size1 ); data = ((char *)data) + size1; memcpy( data2, data, size2 ); } else { memcpy( data1, data, size1 ); } PaUtil_AdvanceRingBufferWriteIndex( rbuf, numWritten ); return numWritten; }