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

Commit 03f3bf3b authored by freexperia's avatar freexperia
Browse files

u8500: add ST Ericsson audio configs

to enable add STE_AUDIO

Change-Id: I9c0b6f2fe3e32f1626e95572bcfd27bdbd2fa09f
parent 6b7fa3fa
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -151,13 +151,22 @@ public:
    virtual status_t suspendOutput(int output) = 0;
    virtual status_t restoreOutput(int output) = 0;

#ifdef STE_AUDIO
    virtual uint32_t *addInputClient(uint32_t clientId) = 0;
    virtual status_t removeInputClient(uint32_t *pClientId) = 0;
#endif
    virtual int openInput(uint32_t *pDevices,
                                    uint32_t *pSamplingRate,
                                    uint32_t *pFormat,
                                    uint32_t *pChannels,
#ifdef STE_AUDIO
                                    uint32_t acoustics,
                                    uint32_t *pInputClientId = NULL) = 0;
    virtual status_t closeInput(int input, uint32_t* inputClientId = NULL) = 0;
#else
                                    uint32_t acoustics) = 0;
    virtual status_t closeInput(int input) = 0;

#endif
    virtual status_t setStreamOutput(uint32_t stream, int output) = 0;

    virtual status_t setVoiceVolume(float volume) = 0;
@@ -191,6 +200,9 @@ public:
#ifdef WITH_QCOM_LPA
    virtual status_t deregisterClient(const sp<IAudioFlingerClient>& client) { return false; };
#endif
#ifdef STE_AUDIO
    virtual size_t readInput(uint32_t *input, uint32_t inputClientId, void *buffer, uint32_t bytes, uint32_t *pOverwrittenBytes) = 0;
#endif
};


+5 −0
Original line number Diff line number Diff line
@@ -75,7 +75,12 @@ public:
                                    uint32_t format = AUDIO_FORMAT_DEFAULT,
                                    uint32_t channels = 0,
                                    audio_in_acoustics_t acoustics = (audio_in_acoustics_t)0,
#ifdef STE_AUDIO
                                    int audioSession = 0,
                                    audio_input_clients *inputClientId = NULL) = 0;
#else
                                    int audioSession = 0) = 0;
#endif
    virtual status_t startInput(audio_io_handle_t input) = 0;
    virtual status_t stopInput(audio_io_handle_t input) = 0;
    virtual void releaseInput(audio_io_handle_t input) = 0;
+100 −2
Original line number Diff line number Diff line
@@ -67,6 +67,10 @@ enum {
#endif
    SUSPEND_OUTPUT,
    RESTORE_OUTPUT,
#ifdef STE_AUDIO
    ADD_INPUT_CLIENT,
    REMOVE_INPUT_CLIENT,
#endif
    OPEN_INPUT,
    CLOSE_INPUT,
    SET_STREAM_OUTPUT,
@@ -81,6 +85,9 @@ enum {
    GET_EFFECT_DESCRIPTOR,
    CREATE_EFFECT,
    MOVE_EFFECTS,
#ifdef STE_AUDIO
    READ_INPUT,
#endif
#ifdef WITH_QCOM_LPA
    SET_FM_VOLUME,
    CREATE_SESSION,
@@ -567,11 +574,35 @@ public:
        return reply.readInt32();
    }

#ifdef STE_AUDIO
    virtual uint32_t *addInputClient(uint32_t clientId)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
        data.writeInt32(clientId);
        remote()->transact(ADD_INPUT_CLIENT, data, &reply);
        return (uint32_t*) reply.readIntPtr();
    }

    virtual status_t removeInputClient(uint32_t *pClientId)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
        data.writeIntPtr((intptr_t)pClientId);
        remote()->transact(REMOVE_INPUT_CLIENT, data, &reply);
        return reply.readInt32();
    }
#endif
    virtual int openInput(uint32_t *pDevices,
                            uint32_t *pSamplingRate,
                            uint32_t *pFormat,
                            uint32_t *pChannels,
#ifdef STE_AUDIO
                            uint32_t acoustics,
                            uint32_t *pInputClientId)
#else
                            uint32_t acoustics)
#endif
    {
        Parcel data, reply;
        uint32_t devices = pDevices ? *pDevices : 0;
@@ -585,6 +616,9 @@ public:
        data.writeInt32(format);
        data.writeInt32(channels);
        data.writeInt32(acoustics);
#ifdef STE_AUDIO
        data.writeIntPtr((intptr_t)pInputClientId);
#endif
        remote()->transact(OPEN_INPUT, data, &reply);
        int input = reply.readInt32();
        devices = reply.readInt32();
@@ -598,6 +632,17 @@ public:
        return input;
    }

#ifdef STE_AUDIO
    virtual status_t closeInput(int input, uint32_t *inputClientId)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
        data.writeInt32(input);
        data.writeIntPtr((intptr_t) inputClientId);
        remote()->transact(CLOSE_INPUT, data, &reply);
        return reply.readInt32();
    }
#else
    virtual status_t closeInput(int input)
    {
        Parcel data, reply;
@@ -606,7 +651,7 @@ public:
        remote()->transact(CLOSE_INPUT, data, &reply);
        return reply.readInt32();
    }

#endif
    virtual status_t setStreamOutput(uint32_t stream, int output)
    {
        Parcel data, reply;
@@ -655,6 +700,20 @@ public:
        return reply.readInt32();
    }

#ifdef STE_AUDIO
    virtual size_t readInput(uint32_t *input, uint32_t inputClientId, void *buffer, uint32_t bytes, uint32_t *pOverwrittenBytes)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
        data.writeIntPtr((intptr_t) input);
        data.writeInt32(inputClientId);
        data.writeIntPtr((intptr_t) buffer);
        data.writeInt32(bytes);
        data.writeIntPtr((intptr_t) pOverwrittenBytes);
        remote()->transact(READ_INPUT, data, &reply);
        return reply.readInt32();
    }
#endif
    virtual int newAudioSessionId()
    {
        Parcel data, reply;
@@ -1092,6 +1151,20 @@ status_t BnAudioFlinger::onTransact(
            reply->writeInt32(restoreOutput(data.readInt32()));
            return NO_ERROR;
        } break;
#ifdef STE_AUDIO
        case ADD_INPUT_CLIENT: {
            CHECK_INTERFACE(IAudioFlinger, data, reply);
            uint32_t clientId = data.readInt32();
            reply->writeIntPtr((intptr_t)addInputClient(clientId));
            return NO_ERROR;
        } break;
        case REMOVE_INPUT_CLIENT: {
            CHECK_INTERFACE(IAudioFlinger, data, reply);
            uint32_t *pClientId = (uint32_t*) data.readIntPtr();
            reply->writeInt32(removeInputClient(pClientId));
            return NO_ERROR;
        } break;
#endif
        case OPEN_INPUT: {
            CHECK_INTERFACE(IAudioFlinger, data, reply);
            uint32_t devices = data.readInt32();
@@ -1099,12 +1172,19 @@ status_t BnAudioFlinger::onTransact(
            uint32_t format = data.readInt32();
            uint32_t channels = data.readInt32();
            uint32_t acoutics = data.readInt32();

#ifdef STE_AUDIO
            uint32_t *inputClientId = (uint32_t*) data.readIntPtr();
#endif
            int input = openInput(&devices,
                                     &samplingRate,
                                     &format,
                                     &channels,
#ifdef STE_AUDIO
                                     acoutics,
                                     inputClientId);
#else
                                     acoutics);
#endif
            reply->writeInt32(input);
            reply->writeInt32(devices);
            reply->writeInt32(samplingRate);
@@ -1114,7 +1194,13 @@ status_t BnAudioFlinger::onTransact(
        } break;
        case CLOSE_INPUT: {
            CHECK_INTERFACE(IAudioFlinger, data, reply);
#ifdef STE_AUDIO
            uint32_t input = data.readInt32();
            uint32_t *inputClientId = (uint32_t*) data.readIntPtr();
            reply->writeInt32(closeInput(input, inputClientId));
#else
            reply->writeInt32(closeInput(data.readInt32()));
#endif
            return NO_ERROR;
        } break;
        case SET_STREAM_OUTPUT: {
@@ -1227,6 +1313,18 @@ status_t BnAudioFlinger::onTransact(
            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
            return NO_ERROR;
        } break;
#ifdef STE_AUDIO
        case READ_INPUT: {
            CHECK_INTERFACE(IAudioFlinger, data, reply);
            uint32_t* input = (uint32_t*) data.readIntPtr();
            uint32_t inputClientId = data.readInt32();
            void* buffer = (void*) data.readIntPtr();
            uint32_t bytes = data.readInt32();
            uint32_t *pOverwrittenBytes = (uint32_t*) data.readIntPtr();
            reply->writeInt32(readInput(input, inputClientId, buffer, bytes, pOverwrittenBytes));
            return NO_ERROR;
        } break;
#endif
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+17 −0
Original line number Diff line number Diff line
@@ -238,7 +238,12 @@ public:
                                    uint32_t format,
                                    uint32_t channels,
                                    audio_in_acoustics_t acoustics,
#ifdef STE_AUDIO
                                    int audioSession,
                                    audio_input_clients *inputClientId)
#else
                                    int audioSession)
#endif
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
@@ -247,6 +252,9 @@ public:
        data.writeInt32(static_cast <uint32_t>(format));
        data.writeInt32(channels);
        data.writeInt32(static_cast <uint32_t>(acoustics));
#ifdef STE_AUDIO
        data.writeIntPtr((intptr_t)inputClientId);
#endif
        data.writeInt32(audioSession);
        remote()->transact(GET_INPUT, data, &reply);
        return static_cast <audio_io_handle_t> (reply.readInt32());
@@ -569,13 +577,22 @@ status_t BnAudioPolicyService::onTransact(
            uint32_t channels = data.readInt32();
            audio_in_acoustics_t acoustics =
                    static_cast <audio_in_acoustics_t>(data.readInt32());
#ifdef STE_AUDIO
            audio_input_clients *inputClientId =
                    (audio_input_clients*) data.readIntPtr();
#endif
            int audioSession = data.readInt32();
            audio_io_handle_t input = getInput(inputSource,
                                               samplingRate,
                                               format,
                                               channels,
                                               acoustics,
#ifdef STE_AUDIO
                                               audioSession,
                                               inputClientId);
#else
                                               audioSession);
#endif
            reply->writeInt32(static_cast <int>(input));
            return NO_ERROR;
        } break;
+116 −4
Original line number Diff line number Diff line
@@ -233,6 +233,7 @@ void AudioFlinger::onFirstRef()
            mHardwareStatus = AUDIO_HW_IDLE;
        }
    }

}

status_t AudioFlinger::initCheck() const
@@ -266,6 +267,9 @@ AudioFlinger::~AudioFlinger()
        audio_hw_device_close(dev);
    }
    mAudioHwDevs.clear();
#ifdef STE_AUDIO
    delete mInputFMStream;
#endif
}

audio_hw_device_t* AudioFlinger::findSuitableHwDev_l(uint32_t devices)
@@ -1144,6 +1148,17 @@ unsigned int AudioFlinger::getInputFramesLost(int ioHandle)
    return 0;
}

#ifdef STE_AUDIO
size_t AudioFlinger::readInput(uint32_t *input, uint32_t inputClientId, void *buffer, uint32_t bytes, uint32_t *pOverwrittenBytes)
{
    if (input == NULL || buffer == NULL) {
        return 0;
    }

    AudioStreamIn* stream = (AudioStreamIn*)input;
    return 0; //return stream->read(buffer, bytes);
}
#endif
status_t AudioFlinger::setVoiceVolume(float value)
{
    status_t ret = initCheck();
@@ -4643,7 +4658,12 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
                                         uint32_t sampleRate,
                                         uint32_t channels,
                                         int id,
#ifdef STE_AUDIO
                                         uint32_t device,
                                         audio_input_clients pInputClientId) :
#else
                                         uint32_t device) :
#endif
    ThreadBase(audioFlinger, id, device),
    mInput(input), mTrack(NULL), mResampler(0), mRsmpOutBuffer(0), mRsmpInBuffer(0)
{
@@ -4653,6 +4673,9 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,

    mReqChannelCount = popcount(channels);
    mReqSampleRate = sampleRate;
#ifdef STE_AUDIO
    mInputClientId = pInputClientId;
#endif
    readInputParameters();
}

@@ -4787,10 +4810,27 @@ bool AudioFlinger::RecordThread::threadLoop()
                        if (framesOut && mFrameCount == mRsmpInIndex) {
                            if (framesOut == mFrameCount &&
                                ((int)mChannelCount == mReqChannelCount || mFormat != AUDIO_FORMAT_PCM_16_BIT)) {
#ifdef STE_AUDIO
                                mBytesRead = mAudioFlinger->readInput((uint32_t*) mInput,
                                                                      (uint32_t)mInputClientId,
                                                                      buffer.raw,
                                                                      mInputBytes,
                                                                      NULL);
#else
                                mBytesRead = mInput->stream->read(mInput->stream, buffer.raw, mInputBytes);
#endif
                                framesOut = 0;
                            } else {
#ifdef STE_AUDIO
                                mBytesRead = mAudioFlinger->readInput((uint32_t*) mInput,
                                                                      (uint32_t)mInputClientId,
                                                                      mRsmpInBuffer,
                                                                      mInputBytes,
                                                                      NULL);

#else
                                mBytesRead = mInput->stream->read(mInput->stream, mRsmpInBuffer, mInputBytes);
#endif
                                mRsmpInIndex = 0;
                            }
                            if (mBytesRead < 0) {
@@ -5038,7 +5078,15 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer*
    int channelCount;

    if (framesReady == 0) {
#ifdef STE_AUDIO
        mBytesRead = mAudioFlinger->readInput((uint32_t*) mInput,
                                              (uint32_t)mInputClientId,
                                              mRsmpInBuffer,
                                              mInputBytes,
                                              NULL);
#else
        mBytesRead = mInput->stream->read(mInput->stream, mRsmpInBuffer, mInputBytes);
#endif
        if (mBytesRead < 0) {
            LOGE("RecordThread::getNextBuffer() Error reading audio input");
            if (mActiveTrack->mState == TrackBase::ACTIVE) {
@@ -5567,11 +5615,49 @@ status_t AudioFlinger::restoreOutput(int output)
    return NO_ERROR;
}

#ifdef STE_AUDIO
uint32_t *AudioFlinger::addInputClient(uint32_t clientId)
{
    Mutex::Autolock _l(mLock);

    uint32_t *pNewClient = new uint32_t;
    if (pNewClient) {
        *pNewClient = clientId;
        mInputClients.add(pNewClient);
    }

    return pNewClient;
}

status_t AudioFlinger::removeInputClient(uint32_t *pClientId)
{
    status_t result = NO_ERROR;

    Mutex::Autolock _l(mLock);

    if (pClientId == NULL) {
        result = BAD_VALUE;
    } else if (mInputClients.remove(pClientId) < 0) {
        result = BAD_VALUE;
    } else {
        // the pointer was found in the vector and is non-NULL, so it must point to memory
        // allocated by addInputClient => free it.
        delete pClientId;
    }

    return result;
}
#endif
int AudioFlinger::openInput(uint32_t *pDevices,
                                uint32_t *pSamplingRate,
                                uint32_t *pFormat,
                                uint32_t *pChannels,
#ifdef STE_AUDIO
                                uint32_t acoustics,
                                uint32_t *pInputClientId)
#else
                                uint32_t acoustics)
#endif
{
    status_t status;
    RecordThread *thread = NULL;
@@ -5583,7 +5669,10 @@ int AudioFlinger::openInput(uint32_t *pDevices,
    uint32_t reqChannels = channels;
    audio_stream_in_t *inStream;
    audio_hw_device_t *inHwDev;

#ifdef STE_AUDIO
    bool returnRecordThread = true;
    audio_input_clients inputClientId;
#endif
    if (pDevices == NULL || *pDevices == 0) {
        return 0;
    }
@@ -5594,6 +5683,12 @@ int AudioFlinger::openInput(uint32_t *pDevices,
    if (inHwDev == NULL)
        return 0;

#ifdef STE_AUDIO
    if (pInputClientId != NULL && *pInputClientId == AUDIO_INPUT_CLIENT_PLAYBACK) {
        returnRecordThread = false;
    }
#endif

    status = inHwDev->open_input_stream(inHwDev, *pDevices, (int *)&format,
                                        &channels, &samplingRate,
                                        (audio_in_acoustics_t)acoustics,
@@ -5620,6 +5715,7 @@ int AudioFlinger::openInput(uint32_t *pDevices,
                                            &inStream);
    }


    if (inStream != NULL) {
        AudioStreamIn *input = new AudioStreamIn(inHwDev, inStream);

@@ -5633,13 +5729,22 @@ int AudioFlinger::openInput(uint32_t *pDevices,
                                  reqSamplingRate,
                                  reqChannels,
                                  id,
#ifdef STE_AUDIO
                                  device,
                                  inputClientId);
#else
                                  device);
#endif
        mRecordThreads.add(id, thread);
        LOGV("openInput() created record thread: ID %d thread %p", id, thread);
        if (pSamplingRate) *pSamplingRate = reqSamplingRate;
        if (pFormat) *pFormat = format;
        if (pChannels) *pChannels = reqChannels;

#ifdef STE_AUDIO
        if (pInputClientId != NULL) {
            *pInputClientId = inputClientId;
        }
#endif
        input->stream->common.standby(&input->stream->common);

        // notify client processes of the new input creation
@@ -5650,10 +5755,17 @@ int AudioFlinger::openInput(uint32_t *pDevices,
    return 0;
}

#ifdef STE_AUDIO
status_t AudioFlinger::closeInput(int input, uint32_t *inputClientId)
#else
status_t AudioFlinger::closeInput(int input)
#endif
{
   // keep strong reference on the record thread so that
    // it is not destroyed while exit() is executed
#ifdef STE_AUDIO
    audio_input_clients clientId = (audio_input_clients) *inputClientId;
#endif
    sp <RecordThread> thread;
    {
        Mutex::Autolock _l(mLock);
@@ -5675,6 +5787,7 @@ status_t AudioFlinger::closeInput(int input)
    delete in;

    return NO_ERROR;

}

status_t AudioFlinger::setStreamOutput(uint32_t stream, int output)
@@ -6187,7 +6300,6 @@ status_t AudioFlinger::moveEffectChain_l(int sessionId,
    return NO_ERROR;
}


// PlaybackThread::createEffect_l() must be called with AudioFlinger::mLock held
sp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
        const sp<AudioFlinger::Client>& client,
Loading