MCPcopy Create free account
hub / github.com/LabSound/LabSound / pullBuffer

Method pullBuffer

src/backends/RtAudio/RtAudio.cpp:4299–4360  ·  view source on GitHub ↗

attempt to pull a buffer from the ring buffer from the current "out" index

Source from the content-addressed store, hash-verified

4297
4298 // attempt to pull a buffer from the ring buffer from the current "out" index
4299 bool pullBuffer(char * buffer, unsigned int bufferSize, RtAudioFormat format)
4300 {
4301 if (!buffer || // incoming buffer is NULL
4302 bufferSize == 0 || // incoming buffer has no data
4303 bufferSize > bufferSize_) // incoming buffer too large
4304 {
4305 return false;
4306 }
4307
4308 unsigned int relInIndex = inIndex_;
4309 unsigned int outIndexEnd = outIndex_ + bufferSize;
4310 if (relInIndex < outIndex_ && outIndexEnd >= bufferSize_)
4311 {
4312 relInIndex += bufferSize_;
4313 }
4314
4315 // the "OUT" index CANNOT BEGIN at the "IN" index
4316 // the "OUT" index CAN END at the "IN" index
4317 if (outIndex_ <= relInIndex && outIndexEnd > relInIndex)
4318 {
4319 return false; // not enough space between "out" index and "in" index
4320 }
4321
4322 // copy buffer from internal to external
4323 int fromZeroSize = outIndex_ + bufferSize - bufferSize_;
4324 fromZeroSize = fromZeroSize < 0 ? 0 : fromZeroSize;
4325 int fromOutSize = bufferSize - fromZeroSize;
4326
4327 switch (format)
4328 {
4329 case RTAUDIO_SINT8:
4330 memcpy(buffer, &((char *) buffer_)[outIndex_], fromOutSize * sizeof(char));
4331 memcpy(&((char *) buffer)[fromOutSize], buffer_, fromZeroSize * sizeof(char));
4332 break;
4333 case RTAUDIO_SINT16:
4334 memcpy(buffer, &((short *) buffer_)[outIndex_], fromOutSize * sizeof(short));
4335 memcpy(&((short *) buffer)[fromOutSize], buffer_, fromZeroSize * sizeof(short));
4336 break;
4337 case RTAUDIO_SINT24:
4338 memcpy(buffer, &((S24 *) buffer_)[outIndex_], fromOutSize * sizeof(S24));
4339 memcpy(&((S24 *) buffer)[fromOutSize], buffer_, fromZeroSize * sizeof(S24));
4340 break;
4341 case RTAUDIO_SINT32:
4342 memcpy(buffer, &((int *) buffer_)[outIndex_], fromOutSize * sizeof(int));
4343 memcpy(&((int *) buffer)[fromOutSize], buffer_, fromZeroSize * sizeof(int));
4344 break;
4345 case RTAUDIO_FLOAT32:
4346 memcpy(buffer, &((float *) buffer_)[outIndex_], fromOutSize * sizeof(float));
4347 memcpy(&((float *) buffer)[fromOutSize], buffer_, fromZeroSize * sizeof(float));
4348 break;
4349 case RTAUDIO_FLOAT64:
4350 memcpy(buffer, &((double *) buffer_)[outIndex_], fromOutSize * sizeof(double));
4351 memcpy(&((double *) buffer)[fromOutSize], buffer_, fromZeroSize * sizeof(double));
4352 break;
4353 }
4354
4355 // update "out" index
4356 outIndex_ += bufferSize;

Callers 1

wasapiThreadMethod · 0.80

Calls

no outgoing calls

Tested by

no test coverage detected