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

Commit 291bb6d8 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

AudioRecord and HAL input stream must be 16-bit PCM only

Currently there are 16-bit PCM assumptions in several places for capture:
 - resampler API
 - mRsmpInBuffer and mRsmpOutBuffer
 - RecordThread::threadLoop upmix, downmix, and resampling
 - possibly other places

Until those assumptions are removed, this CL enforces 16-bit PCM in both
client and server at all places where a format is checked.

Change-Id: I08b0570bff626ad0d341804825a72c14e61b4233
parent 39a60318
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -190,6 +190,11 @@ status_t AudioRecord::set(
        ALOGE("Invalid format %d", format);
        ALOGE("Invalid format %d", format);
        return BAD_VALUE;
        return BAD_VALUE;
    }
    }
    // Temporary restriction: AudioFlinger currently supports 16-bit PCM only
    if (format != AUDIO_FORMAT_PCM_16_BIT) {
        ALOGE("Format %d is not supported", format);
        return BAD_VALUE;
    }
    mFormat = format;
    mFormat = format;


    if (!audio_is_input_channel(channelMask)) {
    if (!audio_is_input_channel(channelMask)) {
+6 −0
Original line number Original line Diff line number Diff line
@@ -1228,6 +1228,12 @@ sp<IAudioRecord> AudioFlinger::openRecord(
        goto Exit;
        goto Exit;
    }
    }


    if (format != AUDIO_FORMAT_PCM_16_BIT) {
        ALOGE("openRecord() invalid format %d", format);
        lStatus = BAD_VALUE;
        goto Exit;
    }

    // add client to list
    // add client to list
    { // scope for mLock
    { // scope for mLock
        Mutex::Autolock _l(mLock);
        Mutex::Autolock _l(mLock);
+11 −7
Original line number Original line Diff line number Diff line
@@ -3737,8 +3737,7 @@ bool AudioFlinger::RecordThread::threadLoop()
                                framesIn = framesOut;
                                framesIn = framesOut;
                            mRsmpInIndex += framesIn;
                            mRsmpInIndex += framesIn;
                            framesOut -= framesIn;
                            framesOut -= framesIn;
                            if (mChannelCount == mReqChannelCount ||
                            if (mChannelCount == mReqChannelCount) {
                                mFormat != AUDIO_FORMAT_PCM_16_BIT) {
                                memcpy(dst, src, framesIn * mFrameSize);
                                memcpy(dst, src, framesIn * mFrameSize);
                            } else {
                            } else {
                                if (mChannelCount == 1) {
                                if (mChannelCount == 1) {
@@ -3752,9 +3751,7 @@ bool AudioFlinger::RecordThread::threadLoop()
                        }
                        }
                        if (framesOut && mFrameCount == mRsmpInIndex) {
                        if (framesOut && mFrameCount == mRsmpInIndex) {
                            void *readInto;
                            void *readInto;
                            if (framesOut == mFrameCount &&
                            if (framesOut == mFrameCount && mChannelCount == mReqChannelCount) {
                                (mChannelCount == mReqChannelCount ||
                                        mFormat != AUDIO_FORMAT_PCM_16_BIT)) {
                                readInto = buffer.raw;
                                readInto = buffer.raw;
                                framesOut = 0;
                                framesOut = 0;
                            } else {
                            } else {
@@ -4224,9 +4221,13 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
            reconfig = true;
            reconfig = true;
        }
        }
        if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
        if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
            if ((audio_format_t) value != AUDIO_FORMAT_PCM_16_BIT) {
                status = BAD_VALUE;
            } else {
                reqFormat = (audio_format_t) value;
                reqFormat = (audio_format_t) value;
                reconfig = true;
                reconfig = true;
            }
            }
        }
        if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
        if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
            reqChannelCount = popcount(value);
            reqChannelCount = popcount(value);
            reconfig = true;
            reconfig = true;
@@ -4366,6 +4367,9 @@ void AudioFlinger::RecordThread::readInputParameters()
    mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common);
    mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common);
    mChannelCount = (uint16_t)popcount(mChannelMask);
    mChannelCount = (uint16_t)popcount(mChannelMask);
    mFormat = mInput->stream->common.get_format(&mInput->stream->common);
    mFormat = mInput->stream->common.get_format(&mInput->stream->common);
    if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
        ALOGE("HAL format %d not supported; must be AUDIO_FORMAT_PCM_16_BIT", mFormat);
    }
    mFrameSize = audio_stream_frame_size(&mInput->stream->common);
    mFrameSize = audio_stream_frame_size(&mInput->stream->common);
    mInputBytes = mInput->stream->common.get_buffer_size(&mInput->stream->common);
    mInputBytes = mInput->stream->common.get_buffer_size(&mInput->stream->common);
    mFrameCount = mInputBytes / mFrameSize;
    mFrameCount = mInputBytes / mFrameSize;