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
gugelfrei
Eric Laurent 6 years ago
parent f4a342abd2
commit 973db02ac1

@ -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<AudioRecordThread> 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<String16>& 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<uint32_t> &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<uint32_t> &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<uint32_t> &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<uint32_t> &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<uint32_t> &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<uint32_t> &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<uint32_t> &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<uint32_t> &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<AudioSystem::AudioDeviceCallback>& 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<AudioSystem::AudioDeviceCallback>& 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();

@ -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<IAudioFlinger>& 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<IMemory> 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<uint32_t> 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<String16>& 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<AudioSystem::AudioDeviceCallback>& 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<AudioSystem::AudioDeviceCallback>& 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;
}

@ -534,9 +534,15 @@ public:
*/
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* 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<String16>& 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

@ -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;

@ -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<IMemory> cblk;
sp<IMemory> buffers;
int32_t trackId;
audio_port_handle_t portId;
};
// invariant on exit for all APIs that return an sp<>:

@ -746,7 +746,7 @@ sp<IAudioTrack> 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<media::IAudioRecord> 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);

@ -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,

Loading…
Cancel
Save