am fb578b6b: Merge "audioflinger: fix clicks on 48kHz audio." into ics-mr1

* commit 'fb578b6b88af51812b71a86ad4dd3a7de56e394b':
  audioflinger: fix clicks on 48kHz audio.
This commit is contained in:
Eric Laurent
2012-01-04 13:00:49 -08:00
committed by Android Git Automerger
4 changed files with 30 additions and 1 deletions

View File

@@ -2111,7 +2111,15 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
if (t->sampleRate() == (int)mSampleRate) {
minFrames = mFrameCount;
} else {
minFrames = (mFrameCount * t->sampleRate()) / mSampleRate + 1;
// +1 for rounding and +1 for additional sample needed for interpolation
minFrames = (mFrameCount * t->sampleRate()) / mSampleRate + 1 + 1;
// add frames already consumed but not yet released by the resampler
// because cblk->framesReady() will include these frames
minFrames += mAudioMixer->getUnreleasedFrames(track->name());
// the minimum track buffer size is normally twice the number of frames necessary
// to fill one buffer and the resampler should not leave more than one buffer worth
// of unreleased frames after each pass, but just in case...
LOG_ASSERT(minFrames <= cblk->frameCount);
}
}
if ((cblk->framesReady() >= minFrames) && track->isReady() &&

View File

@@ -331,6 +331,23 @@ void AudioMixer::track_t::adjustVolumeRamp(bool aux)
}
}
size_t AudioMixer::track_t::getUnreleasedFrames()
{
if (resampler != NULL) {
return resampler->getUnreleasedFrames();
}
return 0;
}
size_t AudioMixer::getUnreleasedFrames(int name)
{
name -= TRACK0;
if (uint32_t(name) < MAX_NUM_TRACKS) {
track_t& track(mState.tracks[name]);
return track.getUnreleasedFrames();
}
return 0;
}
status_t AudioMixer::setBufferProvider(AudioBufferProvider* buffer)
{

View File

@@ -91,6 +91,8 @@ public:
static void ditherAndClamp(int32_t* out, int32_t const *sums, size_t c);
size_t getUnreleasedFrames(int name);
private:
enum {
@@ -167,6 +169,7 @@ private:
bool doesResample() const;
void resetResampler();
void adjustVolumeRamp(bool aux);
size_t getUnreleasedFrames();
};
// pad to 32-bytes to fill cache line

View File

@@ -54,6 +54,7 @@ public:
AudioBufferProvider* provider) = 0;
virtual void reset();
virtual size_t getUnreleasedFrames() { return mInputIndex; }
protected:
// number of bits for phase fraction - 30 bits allows nearly 2x downsampling