Loading include/media/IAudioFlinger.h +13 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 }; Loading include/media/IAudioPolicyService.h +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading media/libmedia/IAudioFlinger.cpp +100 −2 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading @@ -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; Loading @@ -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(); Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading @@ -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: { Loading Loading @@ -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); } Loading media/libmedia/IAudioPolicyService.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -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()); Loading @@ -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()); Loading Loading @@ -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; Loading services/audioflinger/AudioFlinger.cpp +116 −4 Original line number Diff line number Diff line Loading @@ -233,6 +233,7 @@ void AudioFlinger::onFirstRef() mHardwareStatus = AUDIO_HW_IDLE; } } } status_t AudioFlinger::initCheck() const Loading Loading @@ -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) Loading Loading @@ -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(); Loading Loading @@ -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) { Loading @@ -4653,6 +4673,9 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger, mReqChannelCount = popcount(channels); mReqSampleRate = sampleRate; #ifdef STE_AUDIO mInputClientId = pInputClientId; #endif readInputParameters(); } Loading Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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, Loading @@ -5620,6 +5715,7 @@ int AudioFlinger::openInput(uint32_t *pDevices, &inStream); } if (inStream != NULL) { AudioStreamIn *input = new AudioStreamIn(inHwDev, inStream); Loading @@ -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 Loading @@ -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); Loading @@ -5675,6 +5787,7 @@ status_t AudioFlinger::closeInput(int input) delete in; return NO_ERROR; } status_t AudioFlinger::setStreamOutput(uint32_t stream, int output) Loading Loading @@ -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 Loading
include/media/IAudioFlinger.h +13 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 }; Loading
include/media/IAudioPolicyService.h +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
media/libmedia/IAudioFlinger.cpp +100 −2 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading @@ -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; Loading @@ -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(); Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading @@ -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: { Loading Loading @@ -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); } Loading
media/libmedia/IAudioPolicyService.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -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()); Loading @@ -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()); Loading Loading @@ -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; Loading
services/audioflinger/AudioFlinger.cpp +116 −4 Original line number Diff line number Diff line Loading @@ -233,6 +233,7 @@ void AudioFlinger::onFirstRef() mHardwareStatus = AUDIO_HW_IDLE; } } } status_t AudioFlinger::initCheck() const Loading Loading @@ -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) Loading Loading @@ -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(); Loading Loading @@ -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) { Loading @@ -4653,6 +4673,9 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger, mReqChannelCount = popcount(channels); mReqSampleRate = sampleRate; #ifdef STE_AUDIO mInputClientId = pInputClientId; #endif readInputParameters(); } Loading Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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, Loading @@ -5620,6 +5715,7 @@ int AudioFlinger::openInput(uint32_t *pDevices, &inStream); } if (inStream != NULL) { AudioStreamIn *input = new AudioStreamIn(inHwDev, inStream); Loading @@ -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 Loading @@ -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); Loading @@ -5675,6 +5787,7 @@ status_t AudioFlinger::closeInput(int input) delete in; return NO_ERROR; } status_t AudioFlinger::setStreamOutput(uint32_t stream, int output) Loading Loading @@ -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