attempt to pull a buffer from the ring buffer from the current "out" index
| 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; |