Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit acb86ccc authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

Configure the resampler with the correct channel count when downmixing

When a track needs to be downmixed and resampled, it gets downmixed
 first before being resampled. Therefore the resampler needs to
 be configured with the channel count of the output of the downmixer
 instead of that of the track.
Removed frame size checks that don't apply anymore now that we support
 frame sizes that are not powers of 2 (e.g. 12 for 5.1 16bits), and
 changed test performed for every buffer during playback into an
 assert.

Change-Id: Ia220f00ee382f4f7848b661c58555bdca664e194
parent 97b5d0d5
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -3507,14 +3507,12 @@ void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t f
    int8_t *bufferEnd = bufferStart + frames * frameSize;

    // Check validity of returned pointer in case the track control block would have been corrupted.
    if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd ||
        ((unsigned long)bufferStart & (unsigned long)(frameSize - 1))) {
        ALOGE("TrackBase::getBuffer buffer out of range:\n    start: %p, end %p , mBuffer %p mBufferEnd %p\n    \
                server %u, serverBase %u, user %u, userBase %u",
    ALOG_ASSERT(!(bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd),
            "TrackBase::getBuffer buffer out of range:\n"
                "    start: %p, end %p , mBuffer %p mBufferEnd %p\n"
                "    server %u, serverBase %u, user %u, userBase %u, frameSize %d",
                bufferStart, bufferEnd, mBuffer, mBufferEnd,
                cblk->server, cblk->serverBase, cblk->user, cblk->userBase);
        return NULL;
    }
                cblk->server, cblk->serverBase, cblk->user, cblk->userBase, frameSize);

    return bufferStart;
}
+5 −2
Original line number Diff line number Diff line
@@ -504,7 +504,10 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate)
            sampleRate = value;
            if (resampler == NULL) {
                resampler = AudioResampler::create(
                        format, channelCount, devSampleRate);
                        format,
                        // the resampler sees the number of channels after the downmixer, if any
                        downmixerBufferProvider != NULL ? MAX_NUM_CHANNELS : channelCount,
                        devSampleRate);
                resampler->setLocalTimeFreq(localTimeFreq);
            }
            return true;