Loading libs/audioflinger/AudioFlinger.cpp +42 −29 Original line number Diff line number Diff line Loading @@ -1111,7 +1111,6 @@ void AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track) { track->mState = TrackBase::TERMINATED; if (mActiveTracks.indexOf(track) < 0) { LOGV("remove track (%d) and delete from mixer", track->name()); mTracks.remove(track); deleteTrackName_l(track->name()); } Loading Loading @@ -1511,6 +1510,7 @@ int AudioFlinger::MixerThread::getTrackName_l() // deleteTrackName_l() must be called with ThreadBase::mLock held void AudioFlinger::MixerThread::deleteTrackName_l(int name) { LOGV("remove track (%d) and delete from mixer", name); mAudioMixer->deleteTrackName(name); } Loading Loading @@ -1922,6 +1922,9 @@ AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audio AudioFlinger::DuplicatingThread::~DuplicatingThread() { for (size_t i = 0; i < mOutputTracks.size(); i++) { mOutputTracks[i]->destroy(); } mOutputTracks.clear(); } Loading Loading @@ -2044,17 +2047,6 @@ bool AudioFlinger::DuplicatingThread::threadLoop() outputTracks.clear(); } { // scope for the mLock Mutex::Autolock _l(mLock); if (!mStandby) { LOGV("DuplicatingThread() exiting out of standby"); for (size_t i = 0; i < mOutputTracks.size(); i++) { mOutputTracks[i]->destroy(); } } } return false; } Loading Loading @@ -3086,23 +3078,34 @@ bool AudioFlinger::RecordThread::threadLoop() } if (mActiveTrack != 0) { if (mActiveTrack->mState == TrackBase::PAUSING) { if (!mStandby) { mInput->standby(); mStandby = true; } mActiveTrack.clear(); mStartStopCond.broadcast(); } else if (mActiveTrack->mState == TrackBase::RESUMING) { mRsmpInIndex = mFrameCount; if (mReqChannelCount != mActiveTrack->channelCount()) { mActiveTrack.clear(); } else { mStartStopCond.broadcast(); } else if (mBytesRead != 0) { // record start succeeds only if first read from audio input // succeeds if (mBytesRead > 0) { mActiveTrack->mState = TrackBase::ACTIVE; } else { mActiveTrack.clear(); } mStartStopCond.broadcast(); } mStandby = false; } } } if (mActiveTrack != 0) { if (mActiveTrack->mState != TrackBase::ACTIVE) { if (mActiveTrack->mState != TrackBase::ACTIVE && mActiveTrack->mState != TrackBase::RESUMING) { usleep(5000); continue; } Loading Loading @@ -3140,18 +3143,19 @@ bool AudioFlinger::RecordThread::threadLoop() } } if (framesOut && mFrameCount == mRsmpInIndex) { ssize_t bytesRead; if (framesOut == mFrameCount && (mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) { bytesRead = mInput->read(buffer.raw, mInputBytes); mBytesRead = mInput->read(buffer.raw, mInputBytes); framesOut = 0; } else { bytesRead = mInput->read(mRsmpInBuffer, mInputBytes); mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes); mRsmpInIndex = 0; } if (bytesRead < 0) { if (mBytesRead < 0) { LOGE("Error reading audio input"); if (mActiveTrack->mState == TrackBase::ACTIVE) { sleep(1); } mRsmpInIndex = mFrameCount; framesOut = 0; buffer.frameCount = 0; Loading Loading @@ -3220,7 +3224,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac if (recordTrack != mActiveTrack.get()) { status = -EBUSY; } else if (mActiveTrack->mState == TrackBase::PAUSING) { mActiveTrack->mState = TrackBase::RESUMING; mActiveTrack->mState = TrackBase::ACTIVE; } return status; } Loading @@ -3235,6 +3239,8 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac return status; } mActiveTrack->mState = TrackBase::RESUMING; mRsmpInIndex = mFrameCount; mBytesRead = 0; // signal thread to start LOGV("Signal record thread"); mWaitWorkCV.signal(); Loading Loading @@ -3275,6 +3281,7 @@ void AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) { mLock.unlock(); AudioSystem::stopInput(mId); mLock.lock(); LOGV("Record stopped OK"); } } } Loading Loading @@ -3325,10 +3332,12 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer* int channelCount; if (framesReady == 0) { ssize_t bytesRead = mInput->read(mRsmpInBuffer, mInputBytes); if (bytesRead < 0) { mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes); if (mBytesRead < 0) { LOGE("RecordThread::getNextBuffer() Error reading audio input"); if (mActiveTrack->mState == TrackBase::ACTIVE) { sleep(1); } buffer->raw = 0; buffer->frameCount = 0; return NOT_ENOUGH_DATA; Loading Loading @@ -3546,11 +3555,13 @@ int AudioFlinger::openOutput(uint32_t *pDevices, if (pFormat) *pFormat = format; if (pChannels) *pChannels = channels; if (pLatencyMs) *pLatencyMs = thread->latency(); } return mNextThreadId; } return 0; } int AudioFlinger::openDuplicateOutput(int output1, int output2) { Mutex::Autolock _l(mLock); Loading Loading @@ -3694,11 +3705,13 @@ int AudioFlinger::openInput(uint32_t *pDevices, if (pChannels) *pChannels = reqChannels; input->standby(); } return mNextThreadId; } return 0; } status_t AudioFlinger::closeInput(int input) { // keep strong reference on the record thread so that Loading libs/audioflinger/AudioFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -744,6 +744,7 @@ private: size_t mInputBytes; int mReqChannelCount; uint32_t mReqSampleRate; ssize_t mBytesRead; }; class RecordHandle : public android::BnAudioRecord { Loading Loading
libs/audioflinger/AudioFlinger.cpp +42 −29 Original line number Diff line number Diff line Loading @@ -1111,7 +1111,6 @@ void AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track) { track->mState = TrackBase::TERMINATED; if (mActiveTracks.indexOf(track) < 0) { LOGV("remove track (%d) and delete from mixer", track->name()); mTracks.remove(track); deleteTrackName_l(track->name()); } Loading Loading @@ -1511,6 +1510,7 @@ int AudioFlinger::MixerThread::getTrackName_l() // deleteTrackName_l() must be called with ThreadBase::mLock held void AudioFlinger::MixerThread::deleteTrackName_l(int name) { LOGV("remove track (%d) and delete from mixer", name); mAudioMixer->deleteTrackName(name); } Loading Loading @@ -1922,6 +1922,9 @@ AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audio AudioFlinger::DuplicatingThread::~DuplicatingThread() { for (size_t i = 0; i < mOutputTracks.size(); i++) { mOutputTracks[i]->destroy(); } mOutputTracks.clear(); } Loading Loading @@ -2044,17 +2047,6 @@ bool AudioFlinger::DuplicatingThread::threadLoop() outputTracks.clear(); } { // scope for the mLock Mutex::Autolock _l(mLock); if (!mStandby) { LOGV("DuplicatingThread() exiting out of standby"); for (size_t i = 0; i < mOutputTracks.size(); i++) { mOutputTracks[i]->destroy(); } } } return false; } Loading Loading @@ -3086,23 +3078,34 @@ bool AudioFlinger::RecordThread::threadLoop() } if (mActiveTrack != 0) { if (mActiveTrack->mState == TrackBase::PAUSING) { if (!mStandby) { mInput->standby(); mStandby = true; } mActiveTrack.clear(); mStartStopCond.broadcast(); } else if (mActiveTrack->mState == TrackBase::RESUMING) { mRsmpInIndex = mFrameCount; if (mReqChannelCount != mActiveTrack->channelCount()) { mActiveTrack.clear(); } else { mStartStopCond.broadcast(); } else if (mBytesRead != 0) { // record start succeeds only if first read from audio input // succeeds if (mBytesRead > 0) { mActiveTrack->mState = TrackBase::ACTIVE; } else { mActiveTrack.clear(); } mStartStopCond.broadcast(); } mStandby = false; } } } if (mActiveTrack != 0) { if (mActiveTrack->mState != TrackBase::ACTIVE) { if (mActiveTrack->mState != TrackBase::ACTIVE && mActiveTrack->mState != TrackBase::RESUMING) { usleep(5000); continue; } Loading Loading @@ -3140,18 +3143,19 @@ bool AudioFlinger::RecordThread::threadLoop() } } if (framesOut && mFrameCount == mRsmpInIndex) { ssize_t bytesRead; if (framesOut == mFrameCount && (mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) { bytesRead = mInput->read(buffer.raw, mInputBytes); mBytesRead = mInput->read(buffer.raw, mInputBytes); framesOut = 0; } else { bytesRead = mInput->read(mRsmpInBuffer, mInputBytes); mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes); mRsmpInIndex = 0; } if (bytesRead < 0) { if (mBytesRead < 0) { LOGE("Error reading audio input"); if (mActiveTrack->mState == TrackBase::ACTIVE) { sleep(1); } mRsmpInIndex = mFrameCount; framesOut = 0; buffer.frameCount = 0; Loading Loading @@ -3220,7 +3224,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac if (recordTrack != mActiveTrack.get()) { status = -EBUSY; } else if (mActiveTrack->mState == TrackBase::PAUSING) { mActiveTrack->mState = TrackBase::RESUMING; mActiveTrack->mState = TrackBase::ACTIVE; } return status; } Loading @@ -3235,6 +3239,8 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac return status; } mActiveTrack->mState = TrackBase::RESUMING; mRsmpInIndex = mFrameCount; mBytesRead = 0; // signal thread to start LOGV("Signal record thread"); mWaitWorkCV.signal(); Loading Loading @@ -3275,6 +3281,7 @@ void AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) { mLock.unlock(); AudioSystem::stopInput(mId); mLock.lock(); LOGV("Record stopped OK"); } } } Loading Loading @@ -3325,10 +3332,12 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer* int channelCount; if (framesReady == 0) { ssize_t bytesRead = mInput->read(mRsmpInBuffer, mInputBytes); if (bytesRead < 0) { mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes); if (mBytesRead < 0) { LOGE("RecordThread::getNextBuffer() Error reading audio input"); if (mActiveTrack->mState == TrackBase::ACTIVE) { sleep(1); } buffer->raw = 0; buffer->frameCount = 0; return NOT_ENOUGH_DATA; Loading Loading @@ -3546,11 +3555,13 @@ int AudioFlinger::openOutput(uint32_t *pDevices, if (pFormat) *pFormat = format; if (pChannels) *pChannels = channels; if (pLatencyMs) *pLatencyMs = thread->latency(); } return mNextThreadId; } return 0; } int AudioFlinger::openDuplicateOutput(int output1, int output2) { Mutex::Autolock _l(mLock); Loading Loading @@ -3694,11 +3705,13 @@ int AudioFlinger::openInput(uint32_t *pDevices, if (pChannels) *pChannels = reqChannels; input->standby(); } return mNextThreadId; } return 0; } status_t AudioFlinger::closeInput(int input) { // keep strong reference on the record thread so that Loading
libs/audioflinger/AudioFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -744,6 +744,7 @@ private: size_t mInputBytes; int mReqChannelCount; uint32_t mReqSampleRate; ssize_t mBytesRead; }; class RecordHandle : public android::BnAudioRecord { Loading