| 300 | // LabSound end |
| 301 | |
| 302 | void RealtimeAnalyser::getByteTimeDomainData(std::vector<uint8_t> & destinationArray) |
| 303 | { |
| 304 | if (!destinationArray.size()) |
| 305 | return; |
| 306 | |
| 307 | size_t fftSize = this->fftSize(); |
| 308 | size_t len = min(fftSize, destinationArray.size()); |
| 309 | if (len > 0) |
| 310 | { |
| 311 | bool isInputBufferGood = m_inputBuffer.size() == InputBufferSize && m_inputBuffer.size() > fftSize; |
| 312 | ASSERT(isInputBufferGood); |
| 313 | if (!isInputBufferGood) |
| 314 | return; |
| 315 | |
| 316 | float * inputBuffer = m_inputBuffer.data(); |
| 317 | size_t writeIndex = m_writeIndex; |
| 318 | |
| 319 | for (size_t i = 0; i < len; ++i) |
| 320 | { |
| 321 | // Buffer access is protected due to modulo operation. |
| 322 | float value = inputBuffer[(i + writeIndex - fftSize + InputBufferSize) % InputBufferSize]; |
| 323 | |
| 324 | // Scale from nominal -1 -> +1 to unsigned byte. |
| 325 | double scaledValue = AudioNode::ProcessingSizeInFrames * (value + 1); |
| 326 | |
| 327 | // Clip to valid range. |
| 328 | if (scaledValue < 0) |
| 329 | scaledValue = 0; |
| 330 | if (scaledValue > UCHAR_MAX) |
| 331 | scaledValue = UCHAR_MAX; |
| 332 | |
| 333 | destinationArray[i] = static_cast<unsigned char>(scaledValue); |
| 334 | } |
| 335 | } |
| 336 | } |
| 337 | |
| 338 | } // namespace lab |