Loading libs/audioflinger/A2dpAudioInterface.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,8 @@ AudioStreamOut* A2dpAudioInterface::openOutputStream( } AudioStreamIn* A2dpAudioInterface::openInputStream( int format, int channelCount, uint32_t sampleRate, status_t *status) int format, int channelCount, uint32_t sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics) { if (status) *status = -1; Loading libs/audioflinger/A2dpAudioInterface.h +2 −1 Original line number Diff line number Diff line Loading @@ -58,7 +58,8 @@ public: int format, int channelCount, uint32_t sampleRate, status_t *status); status_t *status, AudioSystem::audio_in_acoustics acoustics); protected: virtual status_t doRouting(); Loading libs/audioflinger/AudioDumpInterface.h +3 −2 Original line number Diff line number Diff line Loading @@ -78,8 +78,9 @@ public: virtual status_t setParameter(const char* key, const char* value) {return mFinalInterface->setParameter(key, value);} virtual AudioStreamIn* openInputStream( int format, int channelCount, uint32_t sampleRate, status_t *status) {return mFinalInterface->openInputStream( format, channelCount, sampleRate, status);} virtual AudioStreamIn* openInputStream( int format, int channelCount, uint32_t sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics) {return mFinalInterface->openInputStream( format, channelCount, sampleRate, status, acoustics);} virtual status_t dump(int fd, const Vector<String16>& args) { return mFinalInterface->dumpState(fd, args); } Loading libs/audioflinger/AudioFlinger.cpp +48 −14 Original line number Diff line number Diff line Loading @@ -278,6 +278,9 @@ status_t AudioFlinger::dump(int fd, const Vector<String16>& args) mA2dpMixerThread->dump(fd, args); #endif // dump record client if (mAudioRecordThread != 0) mAudioRecordThread->dump(fd, args); if (mAudioHardware) { mAudioHardware->dumpState(fd, args); } Loading Loading @@ -1223,6 +1226,11 @@ sp<AudioFlinger::MixerThread::Track> AudioFlinger::MixerThread::createTrack( track = new Track(this, client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer); if (track->getCblk() == NULL) { track.clear(); lStatus = NO_MEMORY; goto Exit; } mTracks.add(track); lStatus = NO_ERROR; } Loading Loading @@ -1506,6 +1514,7 @@ AudioFlinger::MixerThread::TrackBase::TrackBase( int format, int channelCount, int frameCount, uint32_t flags, const sp<IMemory>& sharedBuffer) : RefBase(), mMixerThread(mixerThread), Loading @@ -1515,7 +1524,7 @@ AudioFlinger::MixerThread::TrackBase::TrackBase( mState(IDLE), mClientTid(-1), mFormat(format), mFlags(0) mFlags(flags & ~SYSTEM_FLAGS_MASK) { mName = mixerThread->getTrackName(); LOGV("TrackBase contructor name %d, calling thread %d", mName, IPCThreadState::self()->getCallingPid()); Loading @@ -1526,7 +1535,6 @@ AudioFlinger::MixerThread::TrackBase::TrackBase( LOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %d", sharedBuffer->pointer(), sharedBuffer->size()); // LOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize); size_t size = sizeof(audio_track_cblk_t); size_t bufferSize = frameCount*channelCount*sizeof(int16_t); Loading Loading @@ -1614,7 +1622,7 @@ void AudioFlinger::MixerThread::TrackBase::reset() { cblk->server = 0; cblk->userBase = 0; cblk->serverBase = 0; mFlags = 0; mFlags &= (uint32_t)(~SYSTEM_FLAGS_MASK); LOGV("TrackBase::reset"); } Loading Loading @@ -1659,7 +1667,7 @@ AudioFlinger::MixerThread::Track::Track( int channelCount, int frameCount, const sp<IMemory>& sharedBuffer) : TrackBase(mixerThread, client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer) : TrackBase(mixerThread, client, streamType, sampleRate, format, channelCount, frameCount, 0, sharedBuffer) { mVolume[0] = 1.0f; mVolume[1] = 1.0f; Loading Loading @@ -1836,9 +1844,10 @@ AudioFlinger::MixerThread::RecordTrack::RecordTrack( uint32_t sampleRate, int format, int channelCount, int frameCount) int frameCount, uint32_t flags) : TrackBase(mixerThread, client, streamType, sampleRate, format, channelCount, frameCount, 0), channelCount, frameCount, flags, 0), mOverflow(false) { } Loading Loading @@ -2232,7 +2241,12 @@ sp<IAudioRecord> AudioFlinger::openRecord( // create new record track and pass to record thread recordTrack = new MixerThread::RecordTrack(mHardwareMixerThread, client, streamType, sampleRate, format, channelCount, frameCount); format, channelCount, frameCount, flags); if (recordTrack->getCblk() == NULL) { recordTrack.clear(); lStatus = NO_MEMORY; goto Exit; } // return to handle to client recordHandle = new RecordHandle(recordTrack); Loading Loading @@ -2323,6 +2337,7 @@ bool AudioFlinger::AudioRecordThread::threadLoop() input = 0; } mRecordTrack.clear(); mStopped.signal(); mWaitWorkCV.wait(mLock); Loading @@ -2331,7 +2346,8 @@ bool AudioFlinger::AudioRecordThread::threadLoop() input = mAudioHardware->openInputStream(mRecordTrack->format(), mRecordTrack->channelCount(), mRecordTrack->sampleRate(), &mStartStatus); &mStartStatus, (AudioSystem::audio_in_acoustics)(mRecordTrack->mFlags >> 16)); if (input != 0) { inBufferSize = input->bufferSize(); inFrameCount = inBufferSize/input->frameSize(); Loading @@ -2352,7 +2368,8 @@ bool AudioFlinger::AudioRecordThread::threadLoop() buffer.frameCount = inFrameCount; if (LIKELY(mRecordTrack->getNextBuffer(&buffer) == NO_ERROR)) { LOGV("AudioRecordThread read: %d frames", buffer.frameCount); if (input->read(buffer.raw, inBufferSize) < 0) { ssize_t bytesRead = input->read(buffer.raw, inBufferSize); if (bytesRead < 0) { LOGE("Error reading audio input"); sleep(1); } Loading Loading @@ -2407,6 +2424,7 @@ void AudioFlinger::AudioRecordThread::stop(MixerThread::RecordTrack* recordTrack AutoMutex lock(&mLock); if (mActive && (recordTrack == mRecordTrack.get())) { mActive = false; mStopped.wait(mLock); } } Loading @@ -2421,6 +2439,22 @@ void AudioFlinger::AudioRecordThread::exit() requestExitAndWait(); } status_t AudioFlinger::AudioRecordThread::dump(int fd, const Vector<String16>& args) { const size_t SIZE = 256; char buffer[SIZE]; String8 result; pid_t pid = 0; if (mRecordTrack != 0 && mRecordTrack->mClient != 0) { snprintf(buffer, SIZE, "Record client pid: %d\n", mRecordTrack->mClient->pid()); result.append(buffer); } else { result.append("No record client\n"); } write(fd, result.string(), result.size()); return NO_ERROR; } status_t AudioFlinger::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) Loading libs/audioflinger/AudioFlinger.h +14 −5 Original line number Diff line number Diff line Loading @@ -221,7 +221,12 @@ private: }; enum track_flags { STEPSERVER_FAILED = 0x01 // StepServer could not acquire cblk->lock mutex STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex SYSTEM_FLAGS_MASK = 0x0000ffffUL, AUDIO_IN_AGC_ENABLE = AudioSystem::AGC_ENABLE << 16, AUDIO_IN_NS_ENABLE = AudioSystem::NS_ENABLE << 16, AUDIO_IN_IIR_ENABLE = AudioSystem::TX_IIR_ENABLE << 16 }; TrackBase(const sp<MixerThread>& mixerThread, Loading @@ -231,6 +236,7 @@ private: int format, int channelCount, int frameCount, uint32_t flags, const sp<IMemory>& sharedBuffer); ~TrackBase(); Loading Loading @@ -295,7 +301,7 @@ private: int mState; int mClientTid; uint8_t mFormat; uint8_t mFlags; uint32_t mFlags; }; // playback track Loading Loading @@ -368,7 +374,8 @@ private: uint32_t sampleRate, int format, int channelCount, int frameCount); int frameCount, uint32_t flags); ~RecordTrack(); virtual status_t start(); Loading Loading @@ -585,6 +592,7 @@ private: status_t start(MixerThread::RecordTrack* recordTrack); void stop(MixerThread::RecordTrack* recordTrack); void exit(); status_t dump(int fd, const Vector<String16>& args); private: AudioRecordThread(); Loading @@ -592,6 +600,7 @@ private: sp<MixerThread::RecordTrack> mRecordTrack; Mutex mLock; Condition mWaitWorkCV; Condition mStopped; volatile bool mActive; status_t mStartStatus; }; Loading Loading
libs/audioflinger/A2dpAudioInterface.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,8 @@ AudioStreamOut* A2dpAudioInterface::openOutputStream( } AudioStreamIn* A2dpAudioInterface::openInputStream( int format, int channelCount, uint32_t sampleRate, status_t *status) int format, int channelCount, uint32_t sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics) { if (status) *status = -1; Loading
libs/audioflinger/A2dpAudioInterface.h +2 −1 Original line number Diff line number Diff line Loading @@ -58,7 +58,8 @@ public: int format, int channelCount, uint32_t sampleRate, status_t *status); status_t *status, AudioSystem::audio_in_acoustics acoustics); protected: virtual status_t doRouting(); Loading
libs/audioflinger/AudioDumpInterface.h +3 −2 Original line number Diff line number Diff line Loading @@ -78,8 +78,9 @@ public: virtual status_t setParameter(const char* key, const char* value) {return mFinalInterface->setParameter(key, value);} virtual AudioStreamIn* openInputStream( int format, int channelCount, uint32_t sampleRate, status_t *status) {return mFinalInterface->openInputStream( format, channelCount, sampleRate, status);} virtual AudioStreamIn* openInputStream( int format, int channelCount, uint32_t sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics) {return mFinalInterface->openInputStream( format, channelCount, sampleRate, status, acoustics);} virtual status_t dump(int fd, const Vector<String16>& args) { return mFinalInterface->dumpState(fd, args); } Loading
libs/audioflinger/AudioFlinger.cpp +48 −14 Original line number Diff line number Diff line Loading @@ -278,6 +278,9 @@ status_t AudioFlinger::dump(int fd, const Vector<String16>& args) mA2dpMixerThread->dump(fd, args); #endif // dump record client if (mAudioRecordThread != 0) mAudioRecordThread->dump(fd, args); if (mAudioHardware) { mAudioHardware->dumpState(fd, args); } Loading Loading @@ -1223,6 +1226,11 @@ sp<AudioFlinger::MixerThread::Track> AudioFlinger::MixerThread::createTrack( track = new Track(this, client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer); if (track->getCblk() == NULL) { track.clear(); lStatus = NO_MEMORY; goto Exit; } mTracks.add(track); lStatus = NO_ERROR; } Loading Loading @@ -1506,6 +1514,7 @@ AudioFlinger::MixerThread::TrackBase::TrackBase( int format, int channelCount, int frameCount, uint32_t flags, const sp<IMemory>& sharedBuffer) : RefBase(), mMixerThread(mixerThread), Loading @@ -1515,7 +1524,7 @@ AudioFlinger::MixerThread::TrackBase::TrackBase( mState(IDLE), mClientTid(-1), mFormat(format), mFlags(0) mFlags(flags & ~SYSTEM_FLAGS_MASK) { mName = mixerThread->getTrackName(); LOGV("TrackBase contructor name %d, calling thread %d", mName, IPCThreadState::self()->getCallingPid()); Loading @@ -1526,7 +1535,6 @@ AudioFlinger::MixerThread::TrackBase::TrackBase( LOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %d", sharedBuffer->pointer(), sharedBuffer->size()); // LOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize); size_t size = sizeof(audio_track_cblk_t); size_t bufferSize = frameCount*channelCount*sizeof(int16_t); Loading Loading @@ -1614,7 +1622,7 @@ void AudioFlinger::MixerThread::TrackBase::reset() { cblk->server = 0; cblk->userBase = 0; cblk->serverBase = 0; mFlags = 0; mFlags &= (uint32_t)(~SYSTEM_FLAGS_MASK); LOGV("TrackBase::reset"); } Loading Loading @@ -1659,7 +1667,7 @@ AudioFlinger::MixerThread::Track::Track( int channelCount, int frameCount, const sp<IMemory>& sharedBuffer) : TrackBase(mixerThread, client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer) : TrackBase(mixerThread, client, streamType, sampleRate, format, channelCount, frameCount, 0, sharedBuffer) { mVolume[0] = 1.0f; mVolume[1] = 1.0f; Loading Loading @@ -1836,9 +1844,10 @@ AudioFlinger::MixerThread::RecordTrack::RecordTrack( uint32_t sampleRate, int format, int channelCount, int frameCount) int frameCount, uint32_t flags) : TrackBase(mixerThread, client, streamType, sampleRate, format, channelCount, frameCount, 0), channelCount, frameCount, flags, 0), mOverflow(false) { } Loading Loading @@ -2232,7 +2241,12 @@ sp<IAudioRecord> AudioFlinger::openRecord( // create new record track and pass to record thread recordTrack = new MixerThread::RecordTrack(mHardwareMixerThread, client, streamType, sampleRate, format, channelCount, frameCount); format, channelCount, frameCount, flags); if (recordTrack->getCblk() == NULL) { recordTrack.clear(); lStatus = NO_MEMORY; goto Exit; } // return to handle to client recordHandle = new RecordHandle(recordTrack); Loading Loading @@ -2323,6 +2337,7 @@ bool AudioFlinger::AudioRecordThread::threadLoop() input = 0; } mRecordTrack.clear(); mStopped.signal(); mWaitWorkCV.wait(mLock); Loading @@ -2331,7 +2346,8 @@ bool AudioFlinger::AudioRecordThread::threadLoop() input = mAudioHardware->openInputStream(mRecordTrack->format(), mRecordTrack->channelCount(), mRecordTrack->sampleRate(), &mStartStatus); &mStartStatus, (AudioSystem::audio_in_acoustics)(mRecordTrack->mFlags >> 16)); if (input != 0) { inBufferSize = input->bufferSize(); inFrameCount = inBufferSize/input->frameSize(); Loading @@ -2352,7 +2368,8 @@ bool AudioFlinger::AudioRecordThread::threadLoop() buffer.frameCount = inFrameCount; if (LIKELY(mRecordTrack->getNextBuffer(&buffer) == NO_ERROR)) { LOGV("AudioRecordThread read: %d frames", buffer.frameCount); if (input->read(buffer.raw, inBufferSize) < 0) { ssize_t bytesRead = input->read(buffer.raw, inBufferSize); if (bytesRead < 0) { LOGE("Error reading audio input"); sleep(1); } Loading Loading @@ -2407,6 +2424,7 @@ void AudioFlinger::AudioRecordThread::stop(MixerThread::RecordTrack* recordTrack AutoMutex lock(&mLock); if (mActive && (recordTrack == mRecordTrack.get())) { mActive = false; mStopped.wait(mLock); } } Loading @@ -2421,6 +2439,22 @@ void AudioFlinger::AudioRecordThread::exit() requestExitAndWait(); } status_t AudioFlinger::AudioRecordThread::dump(int fd, const Vector<String16>& args) { const size_t SIZE = 256; char buffer[SIZE]; String8 result; pid_t pid = 0; if (mRecordTrack != 0 && mRecordTrack->mClient != 0) { snprintf(buffer, SIZE, "Record client pid: %d\n", mRecordTrack->mClient->pid()); result.append(buffer); } else { result.append("No record client\n"); } write(fd, result.string(), result.size()); return NO_ERROR; } status_t AudioFlinger::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) Loading
libs/audioflinger/AudioFlinger.h +14 −5 Original line number Diff line number Diff line Loading @@ -221,7 +221,12 @@ private: }; enum track_flags { STEPSERVER_FAILED = 0x01 // StepServer could not acquire cblk->lock mutex STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex SYSTEM_FLAGS_MASK = 0x0000ffffUL, AUDIO_IN_AGC_ENABLE = AudioSystem::AGC_ENABLE << 16, AUDIO_IN_NS_ENABLE = AudioSystem::NS_ENABLE << 16, AUDIO_IN_IIR_ENABLE = AudioSystem::TX_IIR_ENABLE << 16 }; TrackBase(const sp<MixerThread>& mixerThread, Loading @@ -231,6 +236,7 @@ private: int format, int channelCount, int frameCount, uint32_t flags, const sp<IMemory>& sharedBuffer); ~TrackBase(); Loading Loading @@ -295,7 +301,7 @@ private: int mState; int mClientTid; uint8_t mFormat; uint8_t mFlags; uint32_t mFlags; }; // playback track Loading Loading @@ -368,7 +374,8 @@ private: uint32_t sampleRate, int format, int channelCount, int frameCount); int frameCount, uint32_t flags); ~RecordTrack(); virtual status_t start(); Loading Loading @@ -585,6 +592,7 @@ private: status_t start(MixerThread::RecordTrack* recordTrack); void stop(MixerThread::RecordTrack* recordTrack); void exit(); status_t dump(int fd, const Vector<String16>& args); private: AudioRecordThread(); Loading @@ -592,6 +600,7 @@ private: sp<MixerThread::RecordTrack> mRecordTrack; Mutex mLock; Condition mWaitWorkCV; Condition mStopped; volatile bool mActive; status_t mStartStatus; }; Loading