| 31 | }; |
| 32 | |
| 33 | inline float getAudioChunkLoudness(int16_t* data, size_t samples, float volume) { |
| 34 | if (!samples) |
| 35 | return 0.f; |
| 36 | |
| 37 | double rms = 0.; |
| 38 | for (size_t i = 0; i != samples; ++i) { |
| 39 | float sample = ((float)data[i] / 32767.f) * volume; |
| 40 | rms += (double)(sample * sample); |
| 41 | } |
| 42 | |
| 43 | float fRms = sqrtf((float)(rms / samples)); |
| 44 | |
| 45 | if (fRms > 0) |
| 46 | return std::clamp<float>(20.f * log10f(fRms), -127.f, 0.f); |
| 47 | else |
| 48 | return -127.f; |
| 49 | } |
| 50 | |
| 51 | float getAudioLoudness(int16_t* data, size_t samples, float volume = 1.0f) { |
| 52 | constexpr size_t CHUNK_SIZE = 50; |