From 973db02ac18fa1de9ce6221f47b01af1bdc4bec2 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 20 Nov 2018 14:54:31 -0800 Subject: [PATCH] audio flinger: return port ID as track ID to client Return the port ID allocated by audio policy manager instead of the internal track ID allocated by audio flinger when an AudioTrack or AudioRecord is created. This information is more useful for logs and allows to associate information coming from audiopolicy manager with a specific client instance. Bug: 111438757 Test: Manual playback and capture tests Change-Id: Ib467d8fcc34d9a8aa7bcaac0770a741982b847c5 --- media/libaudioclient/AudioRecord.cpp | 64 ++++---- media/libaudioclient/AudioTrack.cpp | 141 +++++++++--------- .../include/media/AudioRecord.h | 14 +- .../libaudioclient/include/media/AudioTrack.h | 11 +- .../include/media/IAudioFlinger.h | 12 +- services/audioflinger/AudioFlinger.cpp | 4 +- services/audioflinger/Tracks.cpp | 15 +- 7 files changed, 141 insertions(+), 120 deletions(-) diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp index 038c854be8..3223647f54 100644 --- a/media/libaudioclient/AudioRecord.cpp +++ b/media/libaudioclient/AudioRecord.cpp @@ -211,7 +211,7 @@ AudioRecord::~AudioRecord() mBufferMemory.clear(); IPCThreadState::self()->flushCommands(); ALOGV("%s(%d): releasing session id %d", - __func__, mId, mSessionId); + __func__, mPortId, mSessionId); AudioSystem::releaseAudioSessionId(mSessionId, -1 /*pid*/); } } @@ -239,7 +239,7 @@ status_t AudioRecord::set( pid_t callingPid; pid_t myPid; - // Note mId is not valid until the track is created, so omit mId in ALOG for set. + // Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set. ALOGV("%s(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, " "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s " "uid %d, pid %d", @@ -356,7 +356,7 @@ status_t AudioRecord::set( // create the IAudioRecord status = createRecord_l(0 /*epoch*/, mOpPackageName); - ALOGV("%s(%d): status %d", __func__, mId, status); + ALOGV("%s(%d): status %d", __func__, mPortId, status); if (status != NO_ERROR) { if (mAudioRecordThread != 0) { @@ -393,7 +393,7 @@ exit: status_t AudioRecord::start(AudioSystem::sync_event_t event, audio_session_t triggerSession) { - ALOGV("%s(%d): sync event %d trigger session %d", __func__, mId, event, triggerSession); + ALOGV("%s(%d): sync event %d trigger session %d", __func__, mPortId, event, triggerSession); AutoMutex lock(mLock); if (mActive) { @@ -434,7 +434,7 @@ status_t AudioRecord::start(AudioSystem::sync_event_t event, audio_session_t tri if (status != NO_ERROR) { mActive = false; - ALOGE("%s(%d): status %d", __func__, mId, status); + ALOGE("%s(%d): status %d", __func__, mPortId, status); } else { sp t = mAudioRecordThread; if (t != 0) { @@ -458,7 +458,7 @@ status_t AudioRecord::start(AudioSystem::sync_event_t event, audio_session_t tri void AudioRecord::stop() { AutoMutex lock(mLock); - ALOGV("%s(%d): mActive:%d\n", __func__, mId, mActive); + ALOGV("%s(%d): mActive:%d\n", __func__, mPortId, mActive); if (!mActive) { return; } @@ -638,7 +638,7 @@ status_t AudioRecord::dump(int fd, const Vector& args __unused) const result.append(" AudioRecord::dump\n"); result.appendFormat(" id(%d) status(%d), active(%d), session Id(%d)\n", - mId, mStatus, mActive, mSessionId); + mPortId, mStatus, mActive, mSessionId); result.appendFormat(" flags(%#x), req. flags(%#x), audio source(%d)\n", mFlags, mOrigFlags, mAttributes.source); result.appendFormat(" format(%#x), channel mask(%#x), channel count(%u), sample rate(%u)\n", @@ -680,7 +680,7 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String status_t status; if (audioFlinger == 0) { - ALOGE("%s(%d): Could not get audioflinger", __func__, mId); + ALOGE("%s(%d): Could not get audioflinger", __func__, mPortId); status = NO_INIT; goto exit; } @@ -708,7 +708,7 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String (mTransfer == TRANSFER_OBTAIN); if (!useCaseAllowed) { ALOGW("%s(%d): AUDIO_INPUT_FLAG_FAST denied, incompatible transfer = %s", - __func__, mId, + __func__, mPortId, convertTransferToText(mTransfer)); mFlags = (audio_input_flags_t) (mFlags & ~(AUDIO_INPUT_FLAG_FAST | AUDIO_INPUT_FLAG_RAW)); @@ -744,7 +744,7 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String if (status != NO_ERROR) { ALOGE("%s(%d): AudioFlinger could not create record track, status: %d", - __func__, mId, status); + __func__, mPortId, status); goto exit; } ALOG_ASSERT(record != 0); @@ -755,7 +755,7 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String mAwaitBoost = false; if (output.flags & AUDIO_INPUT_FLAG_FAST) { ALOGI("%s(%d): AUDIO_INPUT_FLAG_FAST successful; frameCount %zu -> %zu", - __func__, mId, + __func__, mPortId, mReqFrameCount, output.frameCount); mAwaitBoost = true; } @@ -765,13 +765,13 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String mSampleRate = output.sampleRate; if (output.cblk == 0) { - ALOGE("%s(%d): Could not get control block", __func__, mId); + ALOGE("%s(%d): Could not get control block", __func__, mPortId); status = NO_INIT; goto exit; } iMemPointer = output.cblk ->pointer(); if (iMemPointer == NULL) { - ALOGE("%s(%d): Could not get control block pointer", __func__, mId); + ALOGE("%s(%d): Could not get control block pointer", __func__, mPortId); status = NO_INIT; goto exit; } @@ -786,7 +786,7 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String } else { buffers = output.buffers->pointer(); if (buffers == NULL) { - ALOGE("%s(%d): Could not get buffer pointer", __func__, mId); + ALOGE("%s(%d): Could not get buffer pointer", __func__, mPortId); status = NO_INIT; goto exit; } @@ -800,14 +800,14 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String mAudioRecord = record; mCblkMemory = output.cblk; mBufferMemory = output.buffers; - mId = output.trackId; + mPortId = output.portId; IPCThreadState::self()->flushCommands(); mCblk = cblk; // note that output.frameCount is the (possibly revised) value of mReqFrameCount if (output.frameCount < mReqFrameCount || (mReqFrameCount == 0 && output.frameCount == 0)) { ALOGW("%s(%d): Requested frameCount %zu but received frameCount %zu", - __func__, mId, + __func__, mPortId, mReqFrameCount, output.frameCount); } @@ -815,7 +815,7 @@ status_t AudioRecord::createRecord_l(const Modulo &epoch, const String // The computation is done on server side. if (mNotificationFramesReq > 0 && output.notificationFrameCount != mNotificationFramesReq) { ALOGW("%s(%d): Server adjusted notificationFrames from %u to %zu for frameCount %zu", - __func__, mId, + __func__, mPortId, mNotificationFramesReq, output.notificationFrameCount, output.frameCount); } mNotificationFramesAct = (uint32_t)output.notificationFrameCount; @@ -883,7 +883,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_ timeout.tv_nsec = (long) (ms % 1000) * 1000000; requested = &timeout; } else { - ALOGE("%s(%d): invalid waitCount %d", __func__, mId, waitCount); + ALOGE("%s(%d): invalid waitCount %d", __func__, mPortId, waitCount); requested = NULL; } return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig); @@ -993,7 +993,7 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize, bool blocking) // sanity-check. user is most-likely passing an error code, and it would // make the return value ambiguous (actualSize vs error). ALOGE("%s(%d) (buffer=%p, size=%zu (%zu)", - __func__, mId, buffer, userSize, userSize); + __func__, mPortId, buffer, userSize, userSize); return BAD_VALUE; } @@ -1050,7 +1050,7 @@ nsecs_t AudioRecord::processAudioBuffer() pollUs <<= 1; } while (tryCounter-- > 0); if (tryCounter < 0) { - ALOGE("%s(%d): did not receive expected priority boost on time", __func__, mId); + ALOGE("%s(%d): did not receive expected priority boost on time", __func__, mPortId); } // Run again immediately return 0; @@ -1174,7 +1174,7 @@ nsecs_t AudioRecord::processAudioBuffer() timeout.tv_sec = ns / 1000000000LL; timeout.tv_nsec = ns % 1000000000LL; ALOGV("%s(%d): timeout %ld.%03d", - __func__, mId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000); + __func__, mPortId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000); requested = &timeout; } @@ -1187,17 +1187,17 @@ nsecs_t AudioRecord::processAudioBuffer() status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig); LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0), "%s(%d): obtainBuffer() err=%d frameCount=%zu", - __func__, mId, err, audioBuffer.frameCount); + __func__, mPortId, err, audioBuffer.frameCount); requested = &ClientProxy::kNonBlocking; size_t avail = audioBuffer.frameCount + nonContig; ALOGV("%s(%d): obtainBuffer(%u) returned %zu = %zu + %zu err %d", - __func__, mId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err); + __func__, mPortId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err); if (err != NO_ERROR) { if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR) { break; } ALOGE("%s(%d): Error %d obtaining an audio buffer, giving up.", - __func__, mId, err); + __func__, mPortId, err); return NS_NEVER; } @@ -1220,7 +1220,7 @@ nsecs_t AudioRecord::processAudioBuffer() // Sanity check on returned size if (ssize_t(readSize) < 0 || readSize > reqSize) { ALOGE("%s(%d): EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes", - __func__, mId, reqSize, ssize_t(readSize)); + __func__, mPortId, reqSize, ssize_t(readSize)); return NS_NEVER; } @@ -1280,7 +1280,7 @@ nsecs_t AudioRecord::processAudioBuffer() status_t AudioRecord::restoreRecord_l(const char *from) { - ALOGW("%s(%d): dead IAudioRecord, creating a new one from %s()", __func__, mId, from); + ALOGW("%s(%d): dead IAudioRecord, creating a new one from %s()", __func__, mPortId, from); ++mSequence; const int INITIAL_RETRIES = 3; @@ -1311,7 +1311,7 @@ retry: } if (result != NO_ERROR) { - ALOGW("%s(%d): failed status %d, retries %d", __func__, mId, result, retries); + ALOGW("%s(%d): failed status %d, retries %d", __func__, mPortId, result, retries); if (--retries > 0) { // leave time for an eventual race condition to clear before retrying usleep(500000); @@ -1330,18 +1330,18 @@ retry: status_t AudioRecord::addAudioDeviceCallback(const sp& callback) { if (callback == 0) { - ALOGW("%s(%d): adding NULL callback!", __func__, mId); + ALOGW("%s(%d): adding NULL callback!", __func__, mPortId); return BAD_VALUE; } AutoMutex lock(mLock); if (mDeviceCallback.unsafe_get() == callback.get()) { - ALOGW("%s(%d): adding same callback!", __func__, mId); + ALOGW("%s(%d): adding same callback!", __func__, mPortId); return INVALID_OPERATION; } status_t status = NO_ERROR; if (mInput != AUDIO_IO_HANDLE_NONE) { if (mDeviceCallback != 0) { - ALOGW("%s(%d): callback already present!", __func__, mId); + ALOGW("%s(%d): callback already present!", __func__, mPortId); AudioSystem::removeAudioDeviceCallback(this, mInput); } status = AudioSystem::addAudioDeviceCallback(this, mInput); @@ -1354,12 +1354,12 @@ status_t AudioRecord::removeAudioDeviceCallback( const sp& callback) { if (callback == 0) { - ALOGW("%s(%d): removing NULL callback!", __func__, mId); + ALOGW("%s(%d): removing NULL callback!", __func__, mPortId); return BAD_VALUE; } AutoMutex lock(mLock); if (mDeviceCallback.unsafe_get() != callback.get()) { - ALOGW("%s(%d): removing different callback!", __func__, mId); + ALOGW("%s(%d): removing different callback!", __func__, mPortId); return INVALID_OPERATION; } mDeviceCallback.clear(); diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp index 8607ee1eca..02324ac6ca 100644 --- a/media/libaudioclient/AudioTrack.cpp +++ b/media/libaudioclient/AudioTrack.cpp @@ -344,7 +344,7 @@ AudioTrack::~AudioTrack() mSharedBuffer.clear(); IPCThreadState::self()->flushCommands(); ALOGV("%s(%d), releasing session id %d from %d on behalf of %d", - __func__, mId, + __func__, mPortId, mSessionId, IPCThreadState::self()->getCallingPid(), mClientPid); AudioSystem::releaseAudioSessionId(mSessionId, mClientPid); } @@ -377,7 +377,7 @@ status_t AudioTrack::set( pid_t callingPid; pid_t myPid; - // Note mId is not valid until the track is created, so omit mId in ALOG for set. + // Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set. ALOGV("%s(): streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, " "flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d", __func__, @@ -658,7 +658,7 @@ exit: status_t AudioTrack::start() { AutoMutex lock(mLock); - ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState)); + ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState)); if (mState == STATE_ACTIVE) { return INVALID_OPERATION; @@ -699,7 +699,7 @@ status_t AudioTrack::start() // It is possible since flush and stop are asynchronous that the server // is still active at this point. ALOGV("%s(%d): server read:%lld cumulative flushed:%lld client written:%lld", - __func__, mId, + __func__, mPortId, (long long)(mFramesWrittenServerOffset + mStartEts.mPosition[ExtendedTimestamp::LOCATION_SERVER]), (long long)mStartEts.mFlushed, @@ -760,7 +760,7 @@ status_t AudioTrack::start() // Start our local VolumeHandler for restoration purposes. mVolumeHandler->setStarted(); } else { - ALOGE("%s(%d): status %d", __func__, mId, status); + ALOGE("%s(%d): status %d", __func__, mPortId, status); mState = previousState; if (t != 0) { if (previousState != STATE_STOPPING) { @@ -778,7 +778,7 @@ status_t AudioTrack::start() void AudioTrack::stop() { AutoMutex lock(mLock); - ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState)); + ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState)); if (mState != STATE_ACTIVE && mState != STATE_PAUSED) { return; @@ -789,7 +789,7 @@ void AudioTrack::stop() } else { mState = STATE_STOPPED; ALOGD_IF(mSharedBuffer == nullptr, - "%s(%d): called with %u frames delivered", __func__, mId, mReleased.value()); + "%s(%d): called with %u frames delivered", __func__, mPortId, mReleased.value()); mReleased = 0; } @@ -830,7 +830,7 @@ bool AudioTrack::stopped() const void AudioTrack::flush() { AutoMutex lock(mLock); - ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState)); + ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState)); if (mSharedBuffer != 0) { return; @@ -863,7 +863,7 @@ void AudioTrack::flush_l() void AudioTrack::pause() { AutoMutex lock(mLock); - ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState)); + ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState)); if (mState == STATE_ACTIVE) { mState = STATE_PAUSED; @@ -891,7 +891,7 @@ void AudioTrack::pause() uint32_t halFrames; AudioSystem::getRenderPosition(mOutput, &halFrames, &mPausedPosition); ALOGV("%s(%d): for offload, cache current position %u", - __func__, mId, mPausedPosition); + __func__, mPortId, mPausedPosition); } } } @@ -945,7 +945,7 @@ void AudioTrack::getAuxEffectSendLevel(float* level) const status_t AudioTrack::setSampleRate(uint32_t rate) { AutoMutex lock(mLock); - ALOGV("%s(%d): prior state:%s rate:%u", __func__, mId, stateToString(mState), rate); + ALOGV("%s(%d): prior state:%s rate:%u", __func__, mPortId, stateToString(mState), rate); if (rate == mSampleRate) { return NO_ERROR; @@ -1013,7 +1013,7 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate) } ALOGV("%s(%d): mSampleRate:%u mSpeed:%f mPitch:%f", - __func__, mId, mSampleRate, playbackRate.mSpeed, playbackRate.mPitch); + __func__, mPortId, mSampleRate, playbackRate.mSpeed, playbackRate.mPitch); // pitch is emulated by adjusting speed and sampleRate const uint32_t effectiveRate = adjustSampleRate(mSampleRate, playbackRate.mPitch); const float effectiveSpeed = adjustSpeed(playbackRate.mSpeed, playbackRate.mPitch); @@ -1023,17 +1023,17 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate) playbackRateTemp.mPitch = effectivePitch; ALOGV("%s(%d) (effective) mSampleRate:%u mSpeed:%f mPitch:%f", - __func__, mId, effectiveRate, effectiveSpeed, effectivePitch); + __func__, mPortId, effectiveRate, effectiveSpeed, effectivePitch); if (!isAudioPlaybackRateValid(playbackRateTemp)) { ALOGW("%s(%d) (%f, %f) failed (effective rate out of bounds)", - __func__, mId, playbackRate.mSpeed, playbackRate.mPitch); + __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch); return BAD_VALUE; } // Check if the buffer size is compatible. if (!isSampleRateSpeedAllowed_l(effectiveRate, effectiveSpeed)) { ALOGW("%s(%d) (%f, %f) failed (buffer size)", - __func__, mId, playbackRate.mSpeed, playbackRate.mPitch); + __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch); return BAD_VALUE; } @@ -1041,13 +1041,13 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate) if ((uint64_t)effectiveRate > (uint64_t)mSampleRate * (uint64_t)AUDIO_RESAMPLER_DOWN_RATIO_MAX) { ALOGW("%s(%d) (%f, %f) failed. Resample rate exceeds max accepted value", - __func__, mId, playbackRate.mSpeed, playbackRate.mPitch); + __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch); return BAD_VALUE; } if ((uint64_t)effectiveRate * (uint64_t)AUDIO_RESAMPLER_UP_RATIO_MAX < (uint64_t)mSampleRate) { ALOGW("%s(%d) (%f, %f) failed. Resample rate below min accepted value", - __func__, mId, playbackRate.mSpeed, playbackRate.mPitch); + __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch); return BAD_VALUE; } mPlaybackRate = playbackRate; @@ -1249,7 +1249,7 @@ status_t AudioTrack::getPosition(uint32_t *position) if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) { ALOGV("%s(%d): called in paused state, return cached position %u", - __func__, mId, mPausedPosition); + __func__, mPortId, mPausedPosition); *position = mPausedPosition; return NO_ERROR; } @@ -1395,7 +1395,7 @@ void AudioTrack::updateLatency_l() { status_t status = AudioSystem::getLatency(mOutput, &mAfLatency); if (status != NO_ERROR) { - ALOGW("%s(%d): getLatency(%d) failed status %d", __func__, mId, mOutput, status); + ALOGW("%s(%d): getLatency(%d) failed status %d", __func__, mPortId, mOutput, status); } else { // FIXME don't believe this lie mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate; @@ -1425,7 +1425,7 @@ status_t AudioTrack::createTrack_l() const sp& audioFlinger = AudioSystem::get_audio_flinger(); if (audioFlinger == 0) { ALOGE("%s(%d): Could not get audioflinger", - __func__, mId); + __func__, mPortId); status = NO_INIT; goto exit; } @@ -1451,7 +1451,7 @@ status_t AudioTrack::createTrack_l() if (!fastAllowed) { ALOGW("%s(%d): AUDIO_OUTPUT_FLAG_FAST denied by client," " not shared buffer and transfer = %s", - __func__, mId, + __func__, mPortId, convertTransferToText(mTransfer)); mFlags = (audio_output_flags_t) (mFlags & ~AUDIO_OUTPUT_FLAG_FAST); } @@ -1501,7 +1501,7 @@ status_t AudioTrack::createTrack_l() if (status != NO_ERROR || output.outputId == AUDIO_IO_HANDLE_NONE) { ALOGE("%s(%d): AudioFlinger could not create track, status: %d output %d", - __func__, mId, status, output.outputId); + __func__, mPortId, status, output.outputId); if (status == NO_ERROR) { status = NO_INIT; } @@ -1522,7 +1522,7 @@ status_t AudioTrack::createTrack_l() mAfFrameCount = output.afFrameCount; mAfSampleRate = output.afSampleRate; mAfLatency = output.afLatencyMs; - mId = output.trackId; + mPortId = output.portId; mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate; @@ -1532,13 +1532,13 @@ status_t AudioTrack::createTrack_l() // FIXME compare to AudioRecord sp iMem = track->getCblk(); if (iMem == 0) { - ALOGE("%s(%d): Could not get control block", __func__, mId); + ALOGE("%s(%d): Could not get control block", __func__, mPortId); status = NO_INIT; goto exit; } void *iMemPointer = iMem->pointer(); if (iMemPointer == NULL) { - ALOGE("%s(%d): Could not get control block pointer", __func__, mId); + ALOGE("%s(%d): Could not get control block pointer", __func__, mPortId); status = NO_INIT; goto exit; } @@ -1558,13 +1558,13 @@ status_t AudioTrack::createTrack_l() if (mFlags & AUDIO_OUTPUT_FLAG_FAST) { if (output.flags & AUDIO_OUTPUT_FLAG_FAST) { ALOGI("%s(%d): AUDIO_OUTPUT_FLAG_FAST successful; frameCount %zu -> %zu", - __func__, mId, mReqFrameCount, mFrameCount); + __func__, mPortId, mReqFrameCount, mFrameCount); if (!mThreadCanCallJava) { mAwaitBoost = true; } } else { ALOGW("%s(%d): AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount %zu -> %zu", - __func__, mId, mReqFrameCount, mFrameCount); + __func__, mPortId, mReqFrameCount, mFrameCount); } } mFlags = output.flags; @@ -1592,7 +1592,7 @@ status_t AudioTrack::createTrack_l() } else { buffers = mSharedBuffer->pointer(); if (buffers == NULL) { - ALOGE("%s(%d): Could not get buffer pointer", __func__, mId); + ALOGE("%s(%d): Could not get buffer pointer", __func__, mPortId); status = NO_INIT; goto exit; } @@ -1681,7 +1681,7 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_t timeout.tv_nsec = (long) (ms % 1000) * 1000000; requested = &timeout; } else { - ALOGE("%s(%d): invalid waitCount %d", __func__, mId, waitCount); + ALOGE("%s(%d): invalid waitCount %d", __func__, mPortId, waitCount); requested = NULL; } return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig); @@ -1792,7 +1792,7 @@ void AudioTrack::restartIfDisabled() int32_t flags = android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags); if ((mState == STATE_ACTIVE) && (flags & CBLK_DISABLED)) { ALOGW("%s(%d): releaseBuffer() track %p disabled due to previous underrun, restarting", - __func__, mId, this); + __func__, mPortId, this); // FIXME ignoring status mAudioTrack->start(); } @@ -1820,7 +1820,7 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize, bool blocking) // Sanity-check: user is most-likely passing an error code, and it would // make the return value ambiguous (actualSize vs error). ALOGE("%s(%d): AudioTrack::write(buffer=%p, size=%zu (%zd)", - __func__, mId, buffer, userSize, userSize); + __func__, mPortId, buffer, userSize, userSize); return BAD_VALUE; } @@ -1893,7 +1893,7 @@ nsecs_t AudioTrack::processAudioBuffer() } while (tryCounter-- > 0); if (tryCounter < 0) { ALOGE("%s(%d): did not receive expected priority boost on time", - __func__, mId); + __func__, mPortId); } // Run again immediately return 0; @@ -2135,7 +2135,7 @@ nsecs_t AudioTrack::processAudioBuffer() timeout.tv_sec = ns / 1000000000LL; timeout.tv_nsec = ns % 1000000000LL; ALOGV("%s(%d): timeout %ld.%03d", - __func__, mId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000); + __func__, mPortId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000); requested = &timeout; } @@ -2148,11 +2148,11 @@ nsecs_t AudioTrack::processAudioBuffer() status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig); LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0), "%s(%d): obtainBuffer() err=%d frameCount=%zu", - __func__, mId, err, audioBuffer.frameCount); + __func__, mPortId, err, audioBuffer.frameCount); requested = &ClientProxy::kNonBlocking; size_t avail = audioBuffer.frameCount + nonContig; ALOGV("%s(%d): obtainBuffer(%u) returned %zu = %zu + %zu err %d", - __func__, mId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err); + __func__, mPortId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err); if (err != NO_ERROR) { if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR || (isOffloaded() && (err == DEAD_OBJECT))) { @@ -2160,7 +2160,7 @@ nsecs_t AudioTrack::processAudioBuffer() return 1000000; } ALOGE("%s(%d): Error %d obtaining an audio buffer, giving up.", - __func__, mId, err); + __func__, mPortId, err); return NS_NEVER; } @@ -2192,7 +2192,7 @@ nsecs_t AudioTrack::processAudioBuffer() // Sanity check on returned size if (ssize_t(writtenSize) < 0 || writtenSize > reqSize) { ALOGE("%s(%d): EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes", - __func__, mId, reqSize, ssize_t(writtenSize)); + __func__, mPortId, reqSize, ssize_t(writtenSize)); return NS_NEVER; } @@ -2296,7 +2296,7 @@ nsecs_t AudioTrack::processAudioBuffer() status_t AudioTrack::restoreTrack_l(const char *from) { ALOGW("%s(%d): dead IAudioTrack, %s, creating a new one from %s()", - __func__, mId, isOffloadedOrDirect_l() ? "Offloaded or Direct" : "PCM", from); + __func__, mPortId, isOffloadedOrDirect_l() ? "Offloaded or Direct" : "PCM", from); ++mSequence; // refresh the audio configuration cache in this process to make sure we get new @@ -2354,7 +2354,7 @@ retry: } else { mStaticProxy->setBufferPosition(bufferPosition); if (bufferPosition == mFrameCount) { - ALOGD("%s(%d): restoring track at end of static buffer", __func__, mId); + ALOGD("%s(%d): restoring track at end of static buffer", __func__, mPortId); } } } @@ -2384,7 +2384,7 @@ retry: mFramesWrittenAtRestore = mFramesWrittenServerOffset; } if (result != NO_ERROR) { - ALOGW("%s(%d): failed status %d, retries %d", __func__, mId, result, retries); + ALOGW("%s(%d): failed status %d, retries %d", __func__, mPortId, result, retries); if (--retries > 0) { // leave time for an eventual race condition to clear before retrying usleep(500000); @@ -2414,7 +2414,7 @@ Modulo AudioTrack::updateAndGetPosition_l() // in which case the use of uint32_t for these counters has bigger issues. ALOGE_IF(delta < 0, "%s(%d): detected illegal retrograde motion by the server: mServer advanced by %d", - __func__, mId, delta); + __func__, mPortId, delta); mServer = newServer; if (delta > 0) { // avoid retrograde mPosition += delta; @@ -2437,7 +2437,7 @@ bool AudioTrack::isSampleRateSpeedAllowed_l(uint32_t sampleRate, float speed) "%s(%d): denied " "mAfLatency:%u mAfFrameCount:%zu mAfSampleRate:%u sampleRate:%u speed:%f " "mFrameCount:%zu < minFrameCount:%zu", - __func__, mId, + __func__, mPortId, mAfLatency, mAfFrameCount, mAfSampleRate, sampleRate, speed, mFrameCount, minFrameCount); return allowed; @@ -2452,8 +2452,13 @@ status_t AudioTrack::setParameters(const String8& keyValuePairs) status_t AudioTrack::selectPresentation(int presentationId, int programId) { AutoMutex lock(mLock); - ALOGV("%s(%d): PresentationId:%d ProgramId:%d", __func__, mId, presentationId, programId); - return mAudioTrack->selectPresentation(presentationId, programId); + AudioParameter param = AudioParameter(); + param.addInt(String8(AudioParameter::keyPresentationId), presentationId); + param.addInt(String8(AudioParameter::keyProgramId), programId); + ALOGV("%s(%d): PresentationId/ProgramId[%s]", + __func__, mPortId, param.toString().string()); + + return mAudioTrack->setParameters(param.toString()); } VolumeShaper::Status AudioTrack::applyVolumeShaper( @@ -2478,7 +2483,7 @@ VolumeShaper::Status AudioTrack::applyVolumeShaper( } else { // warn only if not an expected restore failure. ALOGW_IF(!((isOffloadedOrDirect_l() || mDoNotReconnect) && status == DEAD_OBJECT), - "%s(%d): applyVolumeShaper failed: %d", __func__, mId, status); + "%s(%d): applyVolumeShaper failed: %d", __func__, mPortId, status); } return status; } @@ -2520,7 +2525,7 @@ status_t AudioTrack::getTimestamp_l(ExtendedTimestamp *timestamp) } status_t status = mProxy->getTimestamp(timestamp); LOG_ALWAYS_FATAL_IF(status != OK, "%s(%d): status %d not allowed from proxy getTimestamp", - __func__, mId, status); + __func__, mPortId, status); bool found = false; timestamp->mPosition[ExtendedTimestamp::LOCATION_CLIENT] = mFramesWritten; timestamp->mTimeNs[ExtendedTimestamp::LOCATION_CLIENT] = 0; @@ -2564,7 +2569,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) break; // offloaded tracks handled below default: LOG_ALWAYS_FATAL("%s(%d): Invalid mState in getTimestamp(): %d", - __func__, mId, mState); + __func__, mPortId, mState); break; } @@ -2599,7 +2604,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) if (location == ExtendedTimestamp::LOCATION_SERVER) { ALOGW_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_KERNEL, "%s(%d): location moved from kernel to server", - __func__, mId); + __func__, mPortId); // check that the last kernel OK time info exists and the positions // are valid (if they predate the current track, the positions may // be zero or negative). @@ -2615,7 +2620,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) (ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] - ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK]); ALOGV("%s(%d): frame adjustment:%lld timestamp:%s", - __func__, mId, (long long)frames, ets.toString().c_str()); + __func__, mPortId, (long long)frames, ets.toString().c_str()); if (frames >= ets.mPosition[location]) { timestamp.mPosition = 0; } else { @@ -2624,7 +2629,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) } else if (location == ExtendedTimestamp::LOCATION_KERNEL) { ALOGV_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_SERVER, "%s(%d): location moved from server to kernel", - __func__, mId); + __func__, mPortId); } // We update the timestamp time even when paused. @@ -2648,7 +2653,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) mPreviousLocation = location; } else { // right after AudioTrack is started, one may not find a timestamp - ALOGV("%s(%d): getBestTimestamp did not find timestamp", __func__, mId); + ALOGV("%s(%d): getBestTimestamp did not find timestamp", __func__, mPortId); } } if (status == INVALID_OPERATION) { @@ -2659,7 +2664,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) // "zero" for NuPlayer). We don't convert for track restoration as position // does not reset. ALOGV("%s(%d): timestamp server offset:%lld restore frames:%lld", - __func__, mId, + __func__, mPortId, (long long)mFramesWrittenServerOffset, (long long)mFramesWrittenAtRestore); if (mFramesWrittenServerOffset != mFramesWrittenAtRestore) { status = WOULD_BLOCK; @@ -2667,7 +2672,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) } } if (status != NO_ERROR) { - ALOGV_IF(status != WOULD_BLOCK, "%s(%d): getTimestamp error:%#x", __func__, mId, status); + ALOGV_IF(status != WOULD_BLOCK, "%s(%d): getTimestamp error:%#x", __func__, mPortId, status); return status; } if (isOffloadedOrDirect_l()) { @@ -2708,7 +2713,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) ALOGW_IF(!mTimestampStartupGlitchReported, "%s(%d): startup glitch detected" " deltaTimeUs(%lld) deltaPositionUs(%lld) tsmPosition(%u)", - __func__, mId, + __func__, mPortId, (long long)deltaTimeUs, (long long)deltaPositionByUs, timestamp.mPosition); mTimestampStartupGlitchReported = true; @@ -2778,7 +2783,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) if (currentTimeNanos < limitNs) { ALOGD("%s(%d): correcting timestamp time for pause, " "currentTimeNanos: %lld < limitNs: %lld < mStartNs: %lld", - __func__, mId, + __func__, mPortId, (long long)currentTimeNanos, (long long)limitNs, (long long)mStartNs); timestamp.mTime = convertNsToTimespec(limitNs); currentTimeNanos = limitNs; @@ -2787,7 +2792,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) // retrograde check if (currentTimeNanos < previousTimeNanos) { ALOGW("%s(%d): retrograde timestamp time corrected, %lld < %lld", - __func__, mId, + __func__, mPortId, (long long)currentTimeNanos, (long long)previousTimeNanos); timestamp.mTime = mPreviousTimestamp.mTime; // currentTimeNanos not used below. @@ -2801,7 +2806,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) // Only report once per position instead of spamming the log. if (!mRetrogradeMotionReported) { ALOGW("%s(%d): retrograde timestamp position corrected, %d = %u - %u", - __func__, mId, + __func__, mPortId, deltaPosition, timestamp.mPosition, mPreviousTimestamp.mPosition); @@ -2822,7 +2827,7 @@ status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp) const int64_t computedSampleRate = deltaPosition * (long long)NANOS_PER_SECOND / deltaTime; ALOGD("%s(%d): computedSampleRate:%u sampleRate:%u", - __func__, mId, + __func__, mPortId, (unsigned)computedSampleRate, mSampleRate); } #endif @@ -2869,7 +2874,7 @@ status_t AudioTrack::dump(int fd, const Vector& args __unused) const result.append(" AudioTrack::dump\n"); result.appendFormat(" id(%d) status(%d), state(%d), session Id(%d), flags(%#x)\n", - mId, mStatus, mState, mSessionId, mFlags); + mPortId, mStatus, mState, mSessionId, mFlags); result.appendFormat(" stream type(%d), left - right volume(%f, %f)\n", (mStreamType == AUDIO_STREAM_DEFAULT) ? audio_attributes_to_stream_type(&mAttributes) : mStreamType, @@ -2911,18 +2916,18 @@ uint32_t AudioTrack::getUnderrunFrames() const status_t AudioTrack::addAudioDeviceCallback(const sp& callback) { if (callback == 0) { - ALOGW("%s(%d): adding NULL callback!", __func__, mId); + ALOGW("%s(%d): adding NULL callback!", __func__, mPortId); return BAD_VALUE; } AutoMutex lock(mLock); if (mDeviceCallback.unsafe_get() == callback.get()) { - ALOGW("%s(%d): adding same callback!", __func__, mId); + ALOGW("%s(%d): adding same callback!", __func__, mPortId); return INVALID_OPERATION; } status_t status = NO_ERROR; if (mOutput != AUDIO_IO_HANDLE_NONE) { if (mDeviceCallback != 0) { - ALOGW("%s(%d): callback already present!", __func__, mId); + ALOGW("%s(%d): callback already present!", __func__, mPortId); AudioSystem::removeAudioDeviceCallback(this, mOutput); } status = AudioSystem::addAudioDeviceCallback(this, mOutput); @@ -2935,12 +2940,12 @@ status_t AudioTrack::removeAudioDeviceCallback( const sp& callback) { if (callback == 0) { - ALOGW("%s(%d): removing NULL callback!", __func__, mId); + ALOGW("%s(%d): removing NULL callback!", __func__, mPortId); return BAD_VALUE; } AutoMutex lock(mLock); if (mDeviceCallback.unsafe_get() != callback.get()) { - ALOGW("%s(%d): removing different callback!", __func__, mId); + ALOGW("%s(%d): removing different callback!", __func__, mPortId); return INVALID_OPERATION; } mDeviceCallback.clear(); @@ -3046,7 +3051,7 @@ bool AudioTrack::hasStarted() case STATE_FLUSHED: return false; // we're not active default: - LOG_ALWAYS_FATAL("%s(%d): Invalid mState in hasStarted(): %d", __func__, mId, mState); + LOG_ALWAYS_FATAL("%s(%d): Invalid mState in hasStarted(): %d", __func__, mPortId, mState); break; } @@ -3063,7 +3068,7 @@ bool AudioTrack::hasStarted() wait = (ts.mPosition == 0 || ts.mPosition == mStartTs.mPosition); } ALOGV("%s(%d): hasStarted wait:%d ts:%u start position:%lld", - __func__, mId, + __func__, mPortId, (int)wait, ts.mPosition, (long long)mStartTs.mPosition); @@ -3085,7 +3090,7 @@ bool AudioTrack::hasStarted() } } ALOGV("%s(%d): hasStarted wait:%d ets:%lld start position:%lld", - __func__, mId, + __func__, mPortId, (int)wait, (long long)ets.mPosition[location], (long long)mStartEts.mPosition[location]); @@ -3161,7 +3166,7 @@ bool AudioTrack::AudioTrackThread::threadLoop() FALLTHROUGH_INTENDED; default: LOG_ALWAYS_FATAL_IF(ns < 0, "%s(%d): processAudioBuffer() returned %lld", - __func__, mReceiver.mId, (long long)ns); + __func__, mReceiver.mPortId, (long long)ns); pauseInternal(ns); return true; } diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h index c226557c5f..35a7e0583f 100644 --- a/media/libaudioclient/include/media/AudioRecord.h +++ b/media/libaudioclient/include/media/AudioRecord.h @@ -534,9 +534,15 @@ public: */ status_t getActiveMicrophones(std::vector* activeMicrophones); - /* - * Dumps the state of an audio record. - */ + /* Get the unique port ID assigned to this AudioRecord instance by audio policy manager. + * The ID is unique across all audioserver clients and can change during the life cycle + * of a given AudioRecord instance if the connection to audioserver is restored. + */ + audio_port_handle_t getPortId() const { return mPortId; }; + + /* + * Dumps the state of an audio record. + */ status_t dump(int fd, const Vector& args) const; private: @@ -654,7 +660,7 @@ private: audio_input_flags_t mOrigFlags; // as specified in constructor or set(), const audio_session_t mSessionId; - int mId; // Id from AudioFlinger + audio_port_handle_t mPortId; // Id from Audio Policy Manager transfer_type mTransfer; // Next 5 fields may be changed if IAudioRecord is re-created, but always != 0 diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h index 4b84fd172a..8238ea2671 100644 --- a/media/libaudioclient/include/media/AudioTrack.h +++ b/media/libaudioclient/include/media/AudioTrack.h @@ -912,7 +912,14 @@ public: AutoMutex lock(mLock); return mState == STATE_ACTIVE || mState == STATE_STOPPING; } -protected: + + /* Get the unique port ID assigned to this AudioTrack instance by audio policy manager. + * The ID is unique across all audioserver clients and can change during the life cycle + * of a given AudioTrack instance if the connection to audioserver is restored. + */ + audio_port_handle_t getPortId() const { return mPortId; }; + + protected: /* copying audio tracks is not allowed */ AudioTrack(const AudioTrack& other); AudioTrack& operator = (const AudioTrack& other); @@ -1166,7 +1173,7 @@ protected: audio_session_t mSessionId; int mAuxEffectId; - int mId; // Id from AudioFlinger. + audio_port_handle_t mPortId; // Id from Audio Policy Manager mutable Mutex mLock; diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h index 52cc860bdb..a34b207cc6 100644 --- a/media/libaudioclient/include/media/IAudioFlinger.h +++ b/media/libaudioclient/include/media/IAudioFlinger.h @@ -146,7 +146,7 @@ public: afSampleRate = parcel->readInt64(); afLatencyMs = parcel->readInt32(); (void)parcel->read(&outputId, sizeof(audio_io_handle_t)); - (void)parcel->readInt32(&trackId); + (void)parcel->read(&portId, sizeof(audio_port_handle_t)); return NO_ERROR; } @@ -164,7 +164,7 @@ public: (void)parcel->writeInt64(afSampleRate); (void)parcel->writeInt32(afLatencyMs); (void)parcel->write(&outputId, sizeof(audio_io_handle_t)); - (void)parcel->writeInt32(trackId); + (void)parcel->write(&portId, sizeof(audio_port_handle_t)); return NO_ERROR; } @@ -181,7 +181,7 @@ public: uint32_t afSampleRate; uint32_t afLatencyMs; audio_io_handle_t outputId; - int32_t trackId; + audio_port_handle_t portId; }; /* CreateRecordInput contains all input arguments sent by AudioRecord to AudioFlinger @@ -274,7 +274,7 @@ public: return BAD_VALUE; } } - (void)parcel->readInt32(&trackId); + (void)parcel->read(&portId, sizeof(audio_port_handle_t)); return NO_ERROR; } @@ -301,7 +301,7 @@ public: } else { (void)parcel->writeInt32(0); } - (void)parcel->writeInt32(trackId); + (void)parcel->write(&portId, sizeof(audio_port_handle_t)); return NO_ERROR; } @@ -318,7 +318,7 @@ public: audio_io_handle_t inputId; sp cblk; sp buffers; - int32_t trackId; + audio_port_handle_t portId; }; // invariant on exit for all APIs that return an sp<>: diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 06975acc29..26f76c03a6 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -746,7 +746,7 @@ sp AudioFlinger::createTrack(const CreateTrackInput& input, output.afFrameCount = thread->frameCount(); output.afSampleRate = thread->sampleRate(); output.afLatencyMs = thread->latency(); - output.trackId = track == nullptr ? -1 : track->id(); + output.portId = portId; // move effect chain to this output thread if an effect on same session was waiting // for a track to be created @@ -1766,7 +1766,7 @@ sp AudioFlinger::createRecord(const CreateRecordInput& inpu output.cblk = recordTrack->getCblk(); output.buffers = recordTrack->getBuffers(); - output.trackId = recordTrack->id(); + output.portId = portId; // return handle to client recordHandle = new RecordHandle(recordTrack); diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index dd81c71026..9a7f1f1c94 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -502,7 +502,7 @@ void AudioFlinger::PlaybackThread::Track::destroy() void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result) { - result.appendFormat("Type Id Active Client Session S Flags " + result.appendFormat("Type Id Active Client Session Port Id S Flags " " Format Chn mask SRate " "ST Usg CT " " G db L dB R dB VS dB " @@ -588,7 +588,7 @@ void AudioFlinger::PlaybackThread::Track::appendDump(String8& result, bool activ ? 'r' /* buffer reduced */: bufferSizeInFrames > mFrameCount ? 'e' /* error */ : ' ' /* identical */; - result.appendFormat("%7s %6u %7u %2s 0x%03X " + result.appendFormat("%7s %6u %7u %7u %2s 0x%03X " "%08X %08X %6u " "%2u %3x %2x " "%5.2g %5.2g %5.2g %5.2g%c " @@ -596,6 +596,7 @@ void AudioFlinger::PlaybackThread::Track::appendDump(String8& result, bool activ active ? "yes" : "no", (mClient == 0) ? getpid() : mClient->pid(), mSessionId, + mPortId, getTrackStateString(), mCblk->mFlags, @@ -1886,7 +1887,7 @@ void AudioFlinger::RecordThread::RecordTrack::invalidate() void AudioFlinger::RecordThread::RecordTrack::appendDumpHeader(String8& result) { - result.appendFormat("Active Id Client Session S Flags " + result.appendFormat("Active Id Client Session Port Id S Flags " " Format Chn mask SRate Source " " Server FrmCnt FrmRdy Sil%s\n", isServerLatencySupported() ? " Latency" : ""); @@ -1894,7 +1895,7 @@ void AudioFlinger::RecordThread::RecordTrack::appendDumpHeader(String8& result) void AudioFlinger::RecordThread::RecordTrack::appendDump(String8& result, bool active) { - result.appendFormat("%c%5s %6d %6u %7u %2s 0x%03X " + result.appendFormat("%c%5s %6d %6u %7u %7u %2s 0x%03X " "%08X %08X %6u %6X " "%08X %6zu %6zu %3c", isFastTrack() ? 'F' : ' ', @@ -1902,6 +1903,7 @@ void AudioFlinger::RecordThread::RecordTrack::appendDump(String8& result, bool a mId, (mClient == 0) ? getpid() : mClient->pid(), mSessionId, + mPortId, getTrackStateString(), mCblk->mFlags, @@ -2142,15 +2144,16 @@ void AudioFlinger::MmapThread::MmapTrack::onTimestamp(const ExtendedTimestamp &t void AudioFlinger::MmapThread::MmapTrack::appendDumpHeader(String8& result) { - result.appendFormat("Client Session Format Chn mask SRate Flags %s\n", + result.appendFormat("Client Session Port Id Format Chn mask SRate Flags %s\n", isOut() ? "Usg CT": "Source"); } void AudioFlinger::MmapThread::MmapTrack::appendDump(String8& result, bool active __unused) { - result.appendFormat("%6u %7u %08X %08X %6u 0x%03X ", + result.appendFormat("%6u %7u %7u %08X %08X %6u 0x%03X ", mPid, mSessionId, + mPortId, mFormat, mChannelMask, mSampleRate,