录制中rampVolume参数溢出的问题

  在录音的过程中发现在最前面的1s中总是会有“噗”的一声的噪音。一直在跟踪查找,发现是Android源码中有一处溢出造成的。stagefright中的AudioSource的void rampVolume(int32_t startFrame, int32_t rampDurationFrames, uint8_t *data, size_t bytes);函数(raise the volume from mute to the actual level linearly)。在AudioSource的read()函数将从AudioRecord读入的数据经过计算

int32_t autoRampDurationFrames =
(kAutoRampDurationUs * mSampleRate + 500000LL) / 1000000LL;

int32_t autoRampStartFrames =
(kAutoRampStartUs * mSampleRate + 500000LL) / 1000000LL;

int32_t nFrames = mNumFramesReceived - autoRampStartFrames;

rampVolume(nFrames, autoRampDurationFrames,
(uint8_t *) buffer->data(), buffer->range_length());

其中nFrames和autoRampDurationFrames的计算存在溢出,kAutoRampDurationUs和kAutoRampDurationUs都是int64_t类型的值,计算结果直接强制转换为int32_t类型。于是修改后的代码为

int64_t autoRamp = kAutoRampDurationUs;
autoRamp *= mSampleRate;
int32_t autoRampDurationFrames = (autoRamp +500000LL) / 1000000LL;

autoRamp = kAutoRampStartUs;
autoRamp *= mSampleRate;
int32_t autoRampStartFrames =
(autoRamp + 500000LL) / 1000000LL;

int32_t nFrames = mNumFramesReceived - autoRampStartFrames;

rampVolume(nFrames, autoRampDurationFrames,
(uint8_t *) buffer->data(), buffer->range_length());

这样就解决了rampVolume函数处理的nFrames帧的数据出现爆音的问题。

  举一反三,播放器的文件大小限制的问题也是由于溢出的问题引起的,文件大小使用int32_t类型的地方限制了大小只能支持到2G,因此需要将这些地方修改int64_t使得文件大小能够支持到fat32的存储文件的最大值4G。

posted @ 2013-03-03 10:22  cerberspace  阅读(491)  评论(0编辑  收藏  举报