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

Commit 9f0c5d24 authored by Mingming Yin's avatar Mingming Yin Committed by Steve Kondik
Browse files

audio: Add support for non-pcm VOIP vocoders

- Add support for non-pcm VOIP vocoders
- non-pcm vocoders use AUDIO_SOURCE_VOICE_COMMUNICATION
  as inputSource. Add check to verify inputSource and
  then configure framecount accordingly
- Changes done to support VOIP for AMR-NB,AMR-WB,EVRCA/B/WB

Change-Id: Ia38da4f6ba0ee40c794d3c97325327cdb7dcb32a
CRs-Fixed: 467850
CRs-Fixed: 516138
parent 01cb926c
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -159,6 +159,11 @@ status_t AudioRecord::set(
        inputSource = AUDIO_SOURCE_MIC;
    }

#ifdef QCOM_HARDWARE
    //update mInputSource before openRecord_l
    mInputSource = inputSource;
#endif

    if (sampleRate == 0) {
        sampleRate = DEFAULT_SAMPLE_RATE;
    }
@@ -279,7 +284,6 @@ status_t AudioRecord::set(
    if (notificationFrames == 0) {
        notificationFrames = frameCount/2;
    }

    // create the IAudioRecord
    status = openRecord_l(sampleRate, format, frameCount, input);
    if (status != NO_ERROR) {
@@ -307,7 +311,9 @@ status_t AudioRecord::set(
    mMarkerReached = false;
    mNewPosition = 0;
    mUpdatePeriod = 0;
#ifdef QCOM_HARDWARE
    mInputSource = inputSource;
#endif
    mInput = input;
    AudioSystem::acquireAudioSessionId(mSessionId);

@@ -552,7 +558,11 @@ status_t AudioRecord::openRecord_l(
                                                       sampleRate, format,
                                                       mChannelMask,
                                                       frameCount,
#ifdef QCOM_HARDWARE
                                                       (int16_t)inputSource(),
#else
                                                       IAudioFlinger::TRACK_DEFAULT,
#endif
                                                       tid,
                                                       &mSessionId,
                                                       &status);
+19 −5
Original line number Diff line number Diff line
@@ -303,6 +303,17 @@ status_t AudioTrack::set(
    uint32_t channelCount = popcount(channelMask);
    mChannelCount = channelCount;

#ifdef QCOM_HARDWARE
    if ((audio_stream_type_t)streamType == AUDIO_STREAM_VOICE_CALL) {
        if (audio_is_linear_pcm(format)) {
            mFrameSize = channelCount * audio_bytes_per_sample(format);
            mFrameSizeAF = channelCount * sizeof(int16_t);
        } else {
            mFrameSize = sizeof(uint16_t);
            mFrameSizeAF = sizeof(uint16_t);
        }
    } else {
#endif
        if (audio_is_linear_pcm(format)) {
            mFrameSize = channelCount * audio_bytes_per_sample(format);
            mFrameSizeAF = channelCount * sizeof(int16_t);
@@ -310,6 +321,9 @@ status_t AudioTrack::set(
            mFrameSize = sizeof(uint8_t);
            mFrameSizeAF = sizeof(uint8_t);
        }
#ifdef QCOM_HARDWARE
    }
#endif

    audio_io_handle_t output = AudioSystem::getOutput(
                                    streamType,
+31 −24
Original line number Diff line number Diff line
@@ -1523,6 +1523,12 @@ sp<IAudioRecord> AudioFlinger::openRecord(
            }
        }
#ifdef QCOM_HARDWARE
        // frameCount must be a multiple of input buffer size
        // Change for Codec type
        uint8_t channelCount = popcount(channelMask);
        if ((audio_source_t)((int16_t)flags) == AUDIO_SOURCE_VOICE_COMMUNICATION) {
             inFrameCount = inputBufferSize/channelCount/sizeof(short);
        } else {
            if ((format == AUDIO_FORMAT_PCM_16_BIT) ||
                (format == AUDIO_FORMAT_PCM_8_BIT))
            {
@@ -1530,23 +1536,24 @@ sp<IAudioRecord> AudioFlinger::openRecord(
            }
            else if (format == AUDIO_FORMAT_AMR_NB)
            {
          inFrameCount = inputBufferSize/channelCount/32;
              inFrameCount = inputBufferSize/channelCount/AMR_FRAMESIZE;
            }
            else if (format == AUDIO_FORMAT_EVRC)
            {
          inFrameCount = inputBufferSize/channelCount/23;
              inFrameCount = inputBufferSize/channelCount/EVRC_FRAMESIZE;
            }
            else if (format == AUDIO_FORMAT_QCELP)
            {
          inFrameCount = inputBufferSize/channelCount/35;
              inFrameCount = inputBufferSize/channelCount/QCELP_FRAMESIZE;
            }
            else if (format == AUDIO_FORMAT_AAC)
            {
          inFrameCount = inputBufferSize/2048;
              inFrameCount = inputBufferSize/AAC_FRAMESIZE;
            }
            else if (format == AUDIO_FORMAT_AMR_WB)
            {
          inFrameCount = inputBufferSize/channelCount/61;
              inFrameCount = inputBufferSize/channelCount/AMR_WB_FRAMESIZE;
            }
        }
        frameCount = ((frameCount - 1)/inFrameCount + 1) * inFrameCount;
#endif
+3 −0
Original line number Diff line number Diff line
@@ -28,6 +28,9 @@ public:
                                audio_format_t format,
                                audio_channel_mask_t channelMask,
                                size_t frameCount,
#ifdef QCOM_HARDWARE
                                uint32_t flags,
#endif
                                int sessionId);
    virtual             ~RecordTrack();

+41 −4
Original line number Diff line number Diff line
@@ -1220,7 +1220,15 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac
    }

    if (mType == DIRECT) {
        if ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM) {
        if (((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM)
#ifdef QCOM_HARDWARE
              ||((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AMR_NB)
              ||((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AMR_WB)
              ||((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_EVRC)
              ||((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_EVRCB)
              ||((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_EVRCWB)
#endif 
              ) {
            if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
                ALOGE("createTrack_l() Bad parameter: sampleRate %u format %d, channelMask 0x%08x "
                        "for output %p with format %d",
@@ -3810,6 +3818,30 @@ bool AudioFlinger::RecordThread::threadLoop()
                        }
                        if (framesOut && mFrameCount == mRsmpInIndex) {
                            void *readInto;
#ifdef QCOM_HARDWARE
                            int InputBytes;
                            if (( framesOut != mFrameCount) &&
                                ((mFormat != AUDIO_FORMAT_PCM_16_BIT)&&
                                  ((audio_source_t)mInputSource != AUDIO_SOURCE_VOICE_COMMUNICATION))) {
                                readInto = buffer.raw;
                                InputBytes = buffer.frameCount * mFrameSize;
                            } else if (framesOut == mFrameCount &&
                                (mChannelCount == mReqChannelCount ||
                                ((mFormat != AUDIO_FORMAT_PCM_16_BIT) &&
                                  ((audio_source_t)mInputSource != AUDIO_SOURCE_VOICE_COMMUNICATION)))) {
                                readInto = buffer.raw;
                                InputBytes = mInputBytes;
                                framesOut = 0;
                            } else {
                                readInto = mRsmpInBuffer;
                                mRsmpInIndex = 0;
                            }
                            mBytesRead = mInput->stream->read(mInput->stream, readInto,
                                    InputBytes);
                            if( mBytesRead >= 0 ){
                                  buffer.frameCount = mBytesRead/mFrameSize;
                            }
#else
                            if (framesOut == mFrameCount &&
                                    (mChannelCount == mReqChannelCount ||
                                     mFormat != AUDIO_FORMAT_PCM_16_BIT)) {
@@ -3821,6 +3853,7 @@ bool AudioFlinger::RecordThread::threadLoop()
                            }
                            mBytesRead = mInput->stream->read(mInput->stream, readInto,
                                    mInputBytes);
#endif
                            if (mBytesRead <= 0) {
                                if ((mBytesRead < 0) && (mActiveTrack->mState == TrackBase::ACTIVE))
                                {
@@ -3960,7 +3993,11 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createR
        Mutex::Autolock _l(mLock);

        track = new RecordTrack(this, client, sampleRate,
                      format, channelMask, frameCount, sessionId);
                      format, channelMask, frameCount,
#ifdef QCOM_HARDWARE
                      flags,
#endif
                      sessionId);

        if (track->getCblk() == 0) {
            lStatus = NO_MEMORY;
Loading