data是16位PCM单声道数据。
int adjustAudioVolume(void* data, int size, float volume)
{
volume = 1.0f;
// 确保音量系数在0到1之间
if (volume < 0.0f) volume = 0.0f;
// if (volume > 1.0f) volume = 1.0f;
// 将音量系数转换为缩放因子(因为PCM数据通常是有符号的,所以范围是-32768到32767)
int16_t* samples = (int16_t*)data;
int sampleCount = size / sizeof(int16_t);
int16_t maxVolume = INT16_MAX; // 32767
int16_t minVolume = INT16_MIN; // -32768
log_e("---size=%d sampleCount=%d [%f]",size,sampleCount,volume);
for (int i = 0; i < sampleCount; i++) {
int16_t sample = samples[i];
// 应用音量调整
int32_t adjustedSample = (int32_t)(sample * volume);
// 确保结果不会溢出
if (adjustedSample > maxVolume) adjustedSample = maxVolume;
if (adjustedSample < minVolume) adjustedSample = minVolume;
samples[i] = (int16_t)adjustedSample;
// log_e("[%d] sampleCount=%ld [%ld]->[%ld] ",i,sampleCount,sample,adjustedSample);
}
log_e("---size=%d sampleCount=%d ok",size,sampleCount);
return size; // 返回处理后的数据大小(在这个例子中,大小没有改变)
}