Loading media/libaudioprocessing/AudioMixer.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -313,6 +313,14 @@ status_t AudioMixer::Track::prepareForReformat() targetFormat, kCopyBufferFrameCount)); requiresReconfigure = true; } else if (mFormat == AUDIO_FORMAT_PCM_FLOAT) { // Input and output are floats, make sure application did not provide > 3db samples // that would break volume application (b/68099072) // TODO: add a trusted source flag to avoid the overhead mReformatBufferProvider.reset(new ClampFloatBufferProvider( audio_channel_count_from_out_mask(channelMask), kCopyBufferFrameCount)); requiresReconfigure = true; } if (targetFormat != mMixerInFormat) { mPostDownmixReformatBufferProvider.reset(new ReformatBufferProvider( Loading media/libaudioprocessing/BufferProviders.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,23 @@ void ReformatBufferProvider::copyFrames(void *dst, const void *src, size_t frame memcpy_by_audio_format(dst, mOutputFormat, src, mInputFormat, frames * mChannelCount); } ClampFloatBufferProvider::ClampFloatBufferProvider(int32_t channelCount, size_t bufferFrameCount) : CopyBufferProvider( channelCount * audio_bytes_per_sample(AUDIO_FORMAT_PCM_FLOAT), channelCount * audio_bytes_per_sample(AUDIO_FORMAT_PCM_FLOAT), bufferFrameCount), mChannelCount(channelCount) { ALOGV("ClampFloatBufferProvider(%p)(%u)", this, channelCount); } void ClampFloatBufferProvider::copyFrames(void *dst, const void *src, size_t frames) { memcpy_to_float_from_float_with_clamping((float*)dst, (const float*)src, frames * mChannelCount, FLOAT_NOMINAL_RANGE_HEADROOM); } TimestretchBufferProvider::TimestretchBufferProvider(int32_t channelCount, audio_format_t format, uint32_t sampleRate, const AudioPlaybackRate &playbackRate) : mChannelCount(channelCount), Loading media/libmedia/include/media/BufferProviders.h +11 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,17 @@ protected: const audio_format_t mOutputFormat; }; // ClampFloatBufferProvider derives from CopyBufferProvider to clamp floats inside -3db class ClampFloatBufferProvider : public CopyBufferProvider { public: ClampFloatBufferProvider(int32_t channelCount, size_t bufferFrameCount); virtual void copyFrames(void *dst, const void *src, size_t frames); protected: const uint32_t mChannelCount; }; // TimestretchBufferProvider derives from PassthruBufferProvider for time stretching class TimestretchBufferProvider : public PassthruBufferProvider { public: Loading Loading
media/libaudioprocessing/AudioMixer.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -313,6 +313,14 @@ status_t AudioMixer::Track::prepareForReformat() targetFormat, kCopyBufferFrameCount)); requiresReconfigure = true; } else if (mFormat == AUDIO_FORMAT_PCM_FLOAT) { // Input and output are floats, make sure application did not provide > 3db samples // that would break volume application (b/68099072) // TODO: add a trusted source flag to avoid the overhead mReformatBufferProvider.reset(new ClampFloatBufferProvider( audio_channel_count_from_out_mask(channelMask), kCopyBufferFrameCount)); requiresReconfigure = true; } if (targetFormat != mMixerInFormat) { mPostDownmixReformatBufferProvider.reset(new ReformatBufferProvider( Loading
media/libaudioprocessing/BufferProviders.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,23 @@ void ReformatBufferProvider::copyFrames(void *dst, const void *src, size_t frame memcpy_by_audio_format(dst, mOutputFormat, src, mInputFormat, frames * mChannelCount); } ClampFloatBufferProvider::ClampFloatBufferProvider(int32_t channelCount, size_t bufferFrameCount) : CopyBufferProvider( channelCount * audio_bytes_per_sample(AUDIO_FORMAT_PCM_FLOAT), channelCount * audio_bytes_per_sample(AUDIO_FORMAT_PCM_FLOAT), bufferFrameCount), mChannelCount(channelCount) { ALOGV("ClampFloatBufferProvider(%p)(%u)", this, channelCount); } void ClampFloatBufferProvider::copyFrames(void *dst, const void *src, size_t frames) { memcpy_to_float_from_float_with_clamping((float*)dst, (const float*)src, frames * mChannelCount, FLOAT_NOMINAL_RANGE_HEADROOM); } TimestretchBufferProvider::TimestretchBufferProvider(int32_t channelCount, audio_format_t format, uint32_t sampleRate, const AudioPlaybackRate &playbackRate) : mChannelCount(channelCount), Loading
media/libmedia/include/media/BufferProviders.h +11 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,17 @@ protected: const audio_format_t mOutputFormat; }; // ClampFloatBufferProvider derives from CopyBufferProvider to clamp floats inside -3db class ClampFloatBufferProvider : public CopyBufferProvider { public: ClampFloatBufferProvider(int32_t channelCount, size_t bufferFrameCount); virtual void copyFrames(void *dst, const void *src, size_t frames); protected: const uint32_t mChannelCount; }; // TimestretchBufferProvider derives from PassthruBufferProvider for time stretching class TimestretchBufferProvider : public PassthruBufferProvider { public: Loading