Merge "AML: Use KeyEvent.isMediaSessionKey() which is public"
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index 038c854..3223647 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -211,7 +211,7 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 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 @@
(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 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
// 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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
}
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 @@
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 @@
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();
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index df9aea6..02324ac 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -344,7 +344,7 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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 @@
} 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 @@
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::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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
{
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 @@
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 @@
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 @@
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 @@
mAfFrameCount = output.afFrameCount;
mAfSampleRate = output.afSampleRate;
mAfLatency = output.afLatencyMs;
- mId = output.trackId;
+ mPortId = output.portId;
mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate;
@@ -1532,13 +1532,13 @@
// 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 @@
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 @@
} 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 @@
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 @@
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 @@
// 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 @@
} 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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
} 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 @@
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 @@
// 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 @@
"%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;
@@ -2456,7 +2456,7 @@
param.addInt(String8(AudioParameter::keyPresentationId), presentationId);
param.addInt(String8(AudioParameter::keyProgramId), programId);
ALOGV("%s(%d): PresentationId/ProgramId[%s]",
- __func__, mId, param.toString().string());
+ __func__, mPortId, param.toString().string());
return mAudioTrack->setParameters(param.toString());
}
@@ -2483,7 +2483,7 @@
} 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;
}
@@ -2525,7 +2525,7 @@
}
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;
@@ -2569,7 +2569,7 @@
break; // offloaded tracks handled below
default:
LOG_ALWAYS_FATAL("%s(%d): Invalid mState in getTimestamp(): %d",
- __func__, mId, mState);
+ __func__, mPortId, mState);
break;
}
@@ -2604,7 +2604,7 @@
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).
@@ -2620,7 +2620,7 @@
(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 {
@@ -2629,7 +2629,7 @@
} 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.
@@ -2653,7 +2653,7 @@
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) {
@@ -2664,7 +2664,7 @@
// "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;
@@ -2672,7 +2672,7 @@
}
}
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()) {
@@ -2713,7 +2713,7 @@
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;
@@ -2783,7 +2783,7 @@
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;
@@ -2792,7 +2792,7 @@
// 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.
@@ -2806,7 +2806,7 @@
// 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);
@@ -2827,7 +2827,7 @@
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
@@ -2874,7 +2874,7 @@
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,
@@ -2916,18 +2916,18 @@
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);
@@ -2940,12 +2940,12 @@
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();
@@ -3051,7 +3051,7 @@
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;
}
@@ -3068,7 +3068,7 @@
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);
@@ -3090,7 +3090,7 @@
}
}
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]);
@@ -3166,7 +3166,7 @@
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/IAudioTrack.cpp b/media/libaudioclient/IAudioTrack.cpp
index adff057..83a568a 100644
--- a/media/libaudioclient/IAudioTrack.cpp
+++ b/media/libaudioclient/IAudioTrack.cpp
@@ -39,6 +39,7 @@
PAUSE,
ATTACH_AUX_EFFECT,
SET_PARAMETERS,
+ SELECT_PRESENTATION,
GET_TIMESTAMP,
SIGNAL,
APPLY_VOLUME_SHAPER,
@@ -127,6 +128,19 @@
return status;
}
+ /* Selects the presentation (if available) */
+ virtual status_t selectPresentation(int presentationId, int programId) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
+ data.writeInt32(presentationId);
+ data.writeInt32(programId);
+ status_t status = remote()->transact(SELECT_PRESENTATION, data, &reply);
+ if (status == NO_ERROR) {
+ status = reply.readInt32();
+ }
+ return status;
+ }
+
virtual status_t getTimestamp(AudioTimestamp& timestamp) {
Parcel data, reply;
data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
@@ -239,6 +253,11 @@
reply->writeInt32(setParameters(keyValuePairs));
return NO_ERROR;
} break;
+ case SELECT_PRESENTATION: {
+ CHECK_INTERFACE(IAudioTrack, data, reply);
+ reply->writeInt32(selectPresentation(data.readInt32(), data.readInt32()));
+ return NO_ERROR;
+ } break;
case GET_TIMESTAMP: {
CHECK_INTERFACE(IAudioTrack, data, reply);
AudioTimestamp timestamp;
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index c226557..35a7e05 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -534,9 +534,15 @@
*/
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 @@
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 4b84fd1..8238ea2 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -912,7 +912,14 @@
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 @@
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 52cc860..a34b207 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -146,7 +146,7 @@
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 @@
(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 @@
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 @@
return BAD_VALUE;
}
}
- (void)parcel->readInt32(&trackId);
+ (void)parcel->read(&portId, sizeof(audio_port_handle_t));
return NO_ERROR;
}
@@ -301,7 +301,7 @@
} 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 @@
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<>:
diff --git a/media/libaudioclient/include/media/IAudioTrack.h b/media/libaudioclient/include/media/IAudioTrack.h
index 94afe3c..06e786d 100644
--- a/media/libaudioclient/include/media/IAudioTrack.h
+++ b/media/libaudioclient/include/media/IAudioTrack.h
@@ -70,6 +70,9 @@
/* Send parameters to the audio hardware */
virtual status_t setParameters(const String8& keyValuePairs) = 0;
+ /* Selects the presentation (if available) */
+ virtual status_t selectPresentation(int presentationId, int programId) = 0;
+
/* Return NO_ERROR if timestamp is valid. timestamp is undefined otherwise. */
virtual status_t getTimestamp(AudioTimestamp& timestamp) = 0;
diff --git a/media/libaudiohal/Android.bp b/media/libaudiohal/Android.bp
index 0ff0d4a..584c2c0 100644
--- a/media/libaudiohal/Android.bp
+++ b/media/libaudiohal/Android.bp
@@ -15,10 +15,13 @@
shared_libs: [
"android.hardware.audio.effect@2.0",
"android.hardware.audio.effect@4.0",
+ "android.hardware.audio.effect@5.0",
"android.hardware.audio@2.0",
"android.hardware.audio@4.0",
+ "android.hardware.audio@5.0",
"libaudiohal@2.0",
"libaudiohal@4.0",
+ "libaudiohal@5.0",
"libutils",
],
diff --git a/media/libaudiohal/DevicesFactoryHalInterface.cpp b/media/libaudiohal/DevicesFactoryHalInterface.cpp
index e631ace..f86009c 100644
--- a/media/libaudiohal/DevicesFactoryHalInterface.cpp
+++ b/media/libaudiohal/DevicesFactoryHalInterface.cpp
@@ -16,6 +16,7 @@
#include <android/hardware/audio/2.0/IDevicesFactory.h>
#include <android/hardware/audio/4.0/IDevicesFactory.h>
+#include <android/hardware/audio/5.0/IDevicesFactory.h>
#include <libaudiohal/FactoryHalHidl.h>
@@ -23,6 +24,9 @@
// static
sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() {
+ if (hardware::audio::V5_0::IDevicesFactory::getService() != nullptr) {
+ return V5_0::createDevicesFactoryHal();
+ }
if (hardware::audio::V4_0::IDevicesFactory::getService() != nullptr) {
return V4_0::createDevicesFactoryHal();
}
diff --git a/media/libaudiohal/EffectsFactoryHalInterface.cpp b/media/libaudiohal/EffectsFactoryHalInterface.cpp
index f7734a8..e21c235 100644
--- a/media/libaudiohal/EffectsFactoryHalInterface.cpp
+++ b/media/libaudiohal/EffectsFactoryHalInterface.cpp
@@ -16,6 +16,7 @@
#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
#include <android/hardware/audio/effect/4.0/IEffectsFactory.h>
+#include <android/hardware/audio/effect/5.0/IEffectsFactory.h>
#include <libaudiohal/FactoryHalHidl.h>
@@ -23,6 +24,9 @@
// static
sp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() {
+ if (hardware::audio::effect::V5_0::IEffectsFactory::getService() != nullptr) {
+ return V5_0::createEffectsFactoryHal();
+ }
if (hardware::audio::effect::V4_0::IEffectsFactory::getService() != nullptr) {
return V4_0::createEffectsFactoryHal();
}
diff --git a/media/libaudiohal/impl/Android.bp b/media/libaudiohal/impl/Android.bp
index 3827336..88533da 100644
--- a/media/libaudiohal/impl/Android.bp
+++ b/media/libaudiohal/impl/Android.bp
@@ -25,12 +25,6 @@
],
shared_libs: [
"android.hardware.audio.common-util",
- "android.hardware.audio.common@2.0",
- "android.hardware.audio.common@4.0",
- "android.hardware.audio.effect@2.0",
- "android.hardware.audio.effect@4.0",
- "android.hardware.audio@2.0",
- "android.hardware.audio@4.0",
"android.hidl.allocator@1.0",
"android.hidl.memory@1.0",
"libaudiohal_deathhandler",
@@ -63,12 +57,15 @@
name: "libaudiohal@2.0",
defaults: ["libaudiohal_default"],
shared_libs: [
+ "android.hardware.audio.common@2.0",
"android.hardware.audio.common@2.0-util",
+ "android.hardware.audio.effect@2.0",
+ "android.hardware.audio@2.0",
],
cflags: [
"-DMAJOR_VERSION=2",
"-DMINOR_VERSION=0",
- "-include VersionMacro.h",
+ "-include common/all-versions/VersionMacro.h",
]
}
@@ -76,11 +73,30 @@
name: "libaudiohal@4.0",
defaults: ["libaudiohal_default"],
shared_libs: [
+ "android.hardware.audio.common@4.0",
"android.hardware.audio.common@4.0-util",
+ "android.hardware.audio.effect@4.0",
+ "android.hardware.audio@4.0",
],
cflags: [
"-DMAJOR_VERSION=4",
"-DMINOR_VERSION=0",
- "-include VersionMacro.h",
+ "-include common/all-versions/VersionMacro.h",
+ ]
+}
+
+cc_library_shared {
+ name: "libaudiohal@5.0",
+ defaults: ["libaudiohal_default"],
+ shared_libs: [
+ "android.hardware.audio.common@5.0",
+ "android.hardware.audio.common@5.0-util",
+ "android.hardware.audio.effect@5.0",
+ "android.hardware.audio@5.0",
+ ],
+ cflags: [
+ "-DMAJOR_VERSION=5",
+ "-DMINOR_VERSION=0",
+ "-include common/all-versions/VersionMacro.h",
]
}
diff --git a/media/libaudiohal/impl/ConversionHelperHidl.cpp b/media/libaudiohal/impl/ConversionHelperHidl.cpp
index 5d12fad..9747859 100644
--- a/media/libaudiohal/impl/ConversionHelperHidl.cpp
+++ b/media/libaudiohal/impl/ConversionHelperHidl.cpp
@@ -24,7 +24,7 @@
using ::android::hardware::audio::CPP_VERSION::Result;
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
using ::android::hardware::audio::CPP_VERSION::AudioMicrophoneChannelMapping;
using ::android::hardware::audio::CPP_VERSION::AudioMicrophoneDirectionality;
using ::android::hardware::audio::CPP_VERSION::AudioMicrophoneLocation;
@@ -109,7 +109,7 @@
ALOGE("%s %p %s: %s (from rpc)", mClassName, this, funcName, description);
}
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
// TODO: Use the same implementation in the hal when it moves to a util library.
static std::string deviceAddressToHal(const DeviceAddress& address) {
// HAL assumes that the address is NUL-terminated.
diff --git a/media/libaudiohal/impl/ConversionHelperHidl.h b/media/libaudiohal/impl/ConversionHelperHidl.h
index 1a9319f..fb3bb9d 100644
--- a/media/libaudiohal/impl/ConversionHelperHidl.h
+++ b/media/libaudiohal/impl/ConversionHelperHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H
#define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H
-#include <android/hardware/audio/2.0/types.h>
-#include <android/hardware/audio/4.0/types.h>
+#include PATH(android/hardware/audio/FILE_VERSION/types.h)
#include <hidl/HidlSupport.h>
#include <system/audio.h>
#include <utils/String8.h>
@@ -83,7 +82,7 @@
void emitError(const char* funcName, const char* description);
};
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
using ::android::hardware::audio::CPP_VERSION::MicrophoneInfo;
void microphoneInfoToHal(const MicrophoneInfo& src,
audio_microphone_characteristic_t *pDst);
diff --git a/media/libaudiohal/impl/DeviceHalHidl.cpp b/media/libaudiohal/impl/DeviceHalHidl.cpp
index 723e2eb..b3ff757 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalHidl.cpp
@@ -19,8 +19,7 @@
#define LOG_TAG "DeviceHalHidl"
//#define LOG_NDEBUG 0
-#include <android/hardware/audio/2.0/IPrimaryDevice.h>
-#include <android/hardware/audio/4.0/IPrimaryDevice.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IPrimaryDevice.h)
#include <cutils/native_handle.h>
#include <hwbinder/IPCThreadState.h>
#include <utils/Log.h>
@@ -42,7 +41,7 @@
using ::android::hardware::audio::common::CPP_VERSION::AudioMode;
using ::android::hardware::audio::common::CPP_VERSION::AudioSource;
using ::android::hardware::audio::common::CPP_VERSION::HidlUtils;
-using ::android::hardware::audio::common::utils::mkEnumConverter;
+using ::android::hardware::audio::common::utils::EnumBitfield;
using ::android::hardware::audio::CPP_VERSION::DeviceAddress;
using ::android::hardware::audio::CPP_VERSION::IPrimaryDevice;
using ::android::hardware::audio::CPP_VERSION::ParameterValue;
@@ -52,6 +51,8 @@
#if MAJOR_VERSION == 4
using ::android::hardware::audio::CPP_VERSION::SinkMetadata;
+#elif MAJOR_VERSION == 5
+using ::android::hardware::audio::common::CPP_VERSION::SinkMetadata;
#endif
namespace android {
@@ -262,8 +263,8 @@
handle,
hidlDevice,
hidlConfig,
- mkEnumConverter<AudioOutputFlag>(flags),
-#if MAJOR_VERSION == 4
+ EnumBitfield<AudioOutputFlag>(flags),
+#if MAJOR_VERSION >= 4
{} /* metadata */,
#endif
[&](Result r, const sp<IStreamOut>& result, const AudioConfig& suggestedConfig) {
@@ -293,7 +294,7 @@
Result retval = Result::NOT_INITIALIZED;
#if MAJOR_VERSION == 2
auto sourceMetadata = AudioSource(source);
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
// TODO: correctly propagate the tracks sources and volume
// for now, only send the main source at 1dbfs
SinkMetadata sourceMetadata = {{{AudioSource(source), 1}}};
@@ -302,7 +303,7 @@
handle,
hidlDevice,
hidlConfig,
- mkEnumConverter<AudioInputFlag>(flags),
+ EnumBitfield<AudioInputFlag>(flags),
sourceMetadata,
[&](Result r, const sp<IStreamIn>& result, const AudioConfig& suggestedConfig) {
retval = r;
@@ -375,7 +376,7 @@
if (mDevice == 0) return NO_INIT;
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t DeviceHalHidl::getMicrophones(std::vector<media::MicrophoneInfo> *microphonesInfo) {
if (mDevice == 0) return NO_INIT;
Result retval;
diff --git a/media/libaudiohal/impl/DeviceHalHidl.h b/media/libaudiohal/impl/DeviceHalHidl.h
index fb5e7e7..291c88f 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.h
+++ b/media/libaudiohal/impl/DeviceHalHidl.h
@@ -17,10 +17,8 @@
#ifndef ANDROID_HARDWARE_DEVICE_HAL_HIDL_H
#define ANDROID_HARDWARE_DEVICE_HAL_HIDL_H
-#include <android/hardware/audio/2.0/IDevice.h>
-#include <android/hardware/audio/4.0/IDevice.h>
-#include <android/hardware/audio/2.0/IPrimaryDevice.h>
-#include <android/hardware/audio/4.0/IPrimaryDevice.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IDevice.h)
+#include PATH(android/hardware/audio/FILE_VERSION/IPrimaryDevice.h)
#include <media/audiohal/DeviceHalInterface.h>
#include "ConversionHelperHidl.h"
diff --git a/media/libaudiohal/impl/DeviceHalLocal.cpp b/media/libaudiohal/impl/DeviceHalLocal.cpp
index 14e26f5..dffe9da 100644
--- a/media/libaudiohal/impl/DeviceHalLocal.cpp
+++ b/media/libaudiohal/impl/DeviceHalLocal.cpp
@@ -190,7 +190,7 @@
std::vector<media::MicrophoneInfo> *microphones __unused) {
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t DeviceHalLocal::getMicrophones(std::vector<media::MicrophoneInfo> *microphones) {
if (mDev->get_microphones == NULL) return INVALID_OPERATION;
size_t actual_mics = AUDIO_MICROPHONE_MAX_COUNT;
diff --git a/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp b/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
index 28001da..5e01e42 100644
--- a/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
+++ b/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
@@ -20,8 +20,7 @@
#define LOG_TAG "DevicesFactoryHalHidl"
//#define LOG_NDEBUG 0
-#include <android/hardware/audio/2.0/IDevice.h>
-#include <android/hardware/audio/4.0/IDevice.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IDevice.h)
#include <media/audiohal/hidl/HalDeathHandler.h>
#include <utils/Log.h>
@@ -76,7 +75,7 @@
*status = BAD_VALUE;
return {};
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
static const char* idFromHal(const char *name, status_t* status) {
*status = OK;
return name;
diff --git a/media/libaudiohal/impl/DevicesFactoryHalHidl.h b/media/libaudiohal/impl/DevicesFactoryHalHidl.h
index a4282b0..27e0649 100644
--- a/media/libaudiohal/impl/DevicesFactoryHalHidl.h
+++ b/media/libaudiohal/impl/DevicesFactoryHalHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_DEVICES_FACTORY_HAL_HIDL_H
#define ANDROID_HARDWARE_DEVICES_FACTORY_HAL_HIDL_H
-#include <android/hardware/audio/2.0/IDevicesFactory.h>
-#include <android/hardware/audio/4.0/IDevicesFactory.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
#include <media/audiohal/DevicesFactoryHalInterface.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
diff --git a/media/libaudiohal/impl/EffectBufferHalHidl.h b/media/libaudiohal/impl/EffectBufferHalHidl.h
index 029d71a..0c99a02 100644
--- a/media/libaudiohal/impl/EffectBufferHalHidl.h
+++ b/media/libaudiohal/impl/EffectBufferHalHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_EFFECT_BUFFER_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECT_BUFFER_HAL_HIDL_H
-#include <android/hardware/audio/effect/2.0/types.h>
-#include <android/hardware/audio/effect/4.0/types.h>
+#include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
#include <android/hidl/memory/1.0/IMemory.h>
#include <hidl/HidlSupport.h>
#include <media/audiohal/EffectBufferHalInterface.h>
diff --git a/media/libaudiohal/impl/EffectHalHidl.cpp b/media/libaudiohal/impl/EffectHalHidl.cpp
index 12649a1..7b867b4 100644
--- a/media/libaudiohal/impl/EffectHalHidl.cpp
+++ b/media/libaudiohal/impl/EffectHalHidl.cpp
@@ -34,7 +34,7 @@
using ::android::hardware::audio::common::CPP_VERSION::HidlUtils;
using ::android::hardware::audio::common::CPP_VERSION::AudioChannelMask;
using ::android::hardware::audio::common::CPP_VERSION::AudioFormat;
-using ::android::hardware::audio::common::utils::mkEnumConverter;
+using ::android::hardware::audio::common::utils::EnumBitfield;
using ::android::hardware::hidl_vec;
using ::android::hardware::MQDescriptorSync;
using ::android::hardware::Return;
@@ -77,10 +77,10 @@
void EffectHalHidl::effectBufferConfigFromHal(
const buffer_config_t& halConfig, EffectBufferConfig* config) {
config->samplingRateHz = halConfig.samplingRate;
- config->channels = mkEnumConverter<AudioChannelMask>(halConfig.channels);
+ config->channels = EnumBitfield<AudioChannelMask>(halConfig.channels);
config->format = AudioFormat(halConfig.format);
config->accessMode = EffectBufferAccess(halConfig.accessMode);
- config->mask = mkEnumConverter<EffectConfigParameters>(halConfig.mask);
+ config->mask = EnumBitfield<EffectConfigParameters>(halConfig.mask);
}
// static
diff --git a/media/libaudiohal/impl/EffectHalHidl.h b/media/libaudiohal/impl/EffectHalHidl.h
index 04f40d3..cd447ff 100644
--- a/media/libaudiohal/impl/EffectHalHidl.h
+++ b/media/libaudiohal/impl/EffectHalHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_EFFECT_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECT_HAL_HIDL_H
-#include <android/hardware/audio/effect/2.0/IEffect.h>
-#include <android/hardware/audio/effect/4.0/IEffect.h>
+#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
#include <media/audiohal/EffectHalInterface.h>
#include <fmq/EventFlag.h>
#include <fmq/MessageQueue.h>
diff --git a/media/libaudiohal/impl/EffectsFactoryHalHidl.h b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
index c6fced7..7027153 100644
--- a/media/libaudiohal/impl/EffectsFactoryHalHidl.h
+++ b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
@@ -17,10 +17,8 @@
#ifndef ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
-#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
-#include <android/hardware/audio/effect/4.0/IEffectsFactory.h>
-#include <android/hardware/audio/effect/2.0/types.h>
-#include <android/hardware/audio/effect/4.0/types.h>
+#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
+#include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
#include <media/audiohal/EffectsFactoryHalInterface.h>
#include "ConversionHelperHidl.h"
diff --git a/media/libaudiohal/impl/StreamHalHidl.cpp b/media/libaudiohal/impl/StreamHalHidl.cpp
index bfa80e8..6b59f5c 100644
--- a/media/libaudiohal/impl/StreamHalHidl.cpp
+++ b/media/libaudiohal/impl/StreamHalHidl.cpp
@@ -17,9 +17,9 @@
#define LOG_TAG "StreamHalHidl"
//#define LOG_NDEBUG 0
-#include <android/hardware/audio/2.0/IStreamOutCallback.h>
-#include <android/hardware/audio/4.0/IStreamOutCallback.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IStreamOutCallback.h)
#include <hwbinder/IPCThreadState.h>
+#include <media/AudioParameter.h>
#include <mediautils/SchedulingPolicyService.h>
#include <utils/Log.h>
@@ -44,13 +44,23 @@
using ::android::hardware::Void;
using ReadCommand = ::android::hardware::audio::CPP_VERSION::IStreamIn::ReadCommand;
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
using ::android::hardware::audio::common::CPP_VERSION::AudioContentType;
using ::android::hardware::audio::common::CPP_VERSION::AudioSource;
using ::android::hardware::audio::common::CPP_VERSION::AudioUsage;
using ::android::hardware::audio::CPP_VERSION::MicrophoneInfo;
+#endif
+
+#if MAJOR_VERSION == 4
using ::android::hardware::audio::CPP_VERSION::PlaybackTrackMetadata;
using ::android::hardware::audio::CPP_VERSION::RecordTrackMetadata;
+using HalSinkMetadata = ::android::hardware::audio::CPP_VERSION::SinkMetadata;
+using HalSourceMetadata = ::android::hardware::audio::CPP_VERSION::SourceMetadata;
+#elif MAJOR_VERSION == 5
+using ::android::hardware::audio::common::CPP_VERSION::PlaybackTrackMetadata;
+using ::android::hardware::audio::common::CPP_VERSION::RecordTrackMetadata;
+using HalSinkMetadata = ::android::hardware::audio::common::CPP_VERSION::SinkMetadata;
+using HalSourceMetadata = ::android::hardware::audio::common::CPP_VERSION::SourceMetadata;
#endif
namespace android {
@@ -192,7 +202,7 @@
const native_handle *handle = hidlInfo.sharedMemory.handle();
if (handle->numFds > 0) {
info->shared_memory_fd = handle->data[0];
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
info->flags = audio_mmap_buffer_flag(hidlInfo.flags);
#endif
info->buffer_size_frames = hidlInfo.bufferSizeFrames;
@@ -347,6 +357,24 @@
return processReturn("setVolume", mStream->setVolume(left, right));
}
+#if MAJOR_VERSION == 2
+status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
+ if (mStream == 0) return NO_INIT;
+ std::vector<ParameterValue> parameters;
+ String8 halParameters;
+ parameters.push_back({AudioParameter::keyPresentationId, std::to_string(presentationId)});
+ parameters.push_back({AudioParameter::keyProgramId, std::to_string(programId)});
+ parametersToHal(hidl_vec<ParameterValue>(parameters), &halParameters);
+ return setParameters(halParameters);
+}
+#elif MAJOR_VERSION >= 4
+status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
+ if (mStream == 0) return NO_INIT;
+ return processReturn("selectPresentation",
+ mStream->selectPresentation(presentationId, programId));
+}
+#endif
+
status_t StreamOutHalHidl::write(const void *buffer, size_t bytes, size_t *written) {
if (mStream == 0) return NO_INIT;
*written = 0;
@@ -585,7 +613,7 @@
// Audio HAL V2.0 does not support propagating source metadata
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
/** Transform a standard collection to an HIDL vector. */
template <class Values, class ElementConverter>
static auto transformToHidlVec(const Values& values, ElementConverter converter) {
@@ -596,7 +624,7 @@
}
status_t StreamOutHalHidl::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
- hardware::audio::CPP_VERSION::SourceMetadata halMetadata = {
+ HalSourceMetadata halMetadata = {
.tracks = transformToHidlVec(sourceMetadata.tracks,
[](const playback_track_metadata& metadata) -> PlaybackTrackMetadata {
return {
@@ -815,7 +843,7 @@
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t StreamInHalHidl::getActiveMicrophones(
std::vector<media::MicrophoneInfo> *microphonesInfo) {
if (!mStream) return NO_INIT;
@@ -835,7 +863,7 @@
}
status_t StreamInHalHidl::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
- hardware::audio::CPP_VERSION::SinkMetadata halMetadata = {
+ HalSinkMetadata halMetadata = {
.tracks = transformToHidlVec(sinkMetadata.tracks,
[](const record_track_metadata& metadata) -> RecordTrackMetadata {
return {
diff --git a/media/libaudiohal/impl/StreamHalHidl.h b/media/libaudiohal/impl/StreamHalHidl.h
index 95ec7f1..f7b507e 100644
--- a/media/libaudiohal/impl/StreamHalHidl.h
+++ b/media/libaudiohal/impl/StreamHalHidl.h
@@ -19,12 +19,9 @@
#include <atomic>
-#include <android/hardware/audio/2.0/IStream.h>
-#include <android/hardware/audio/4.0/IStream.h>
-#include <android/hardware/audio/2.0/IStreamIn.h>
-#include <android/hardware/audio/4.0/IStreamIn.h>
-#include <android/hardware/audio/2.0/IStreamOut.h>
-#include <android/hardware/audio/4.0/IStreamOut.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IStream.h)
+#include PATH(android/hardware/audio/FILE_VERSION/IStreamIn.h)
+#include PATH(android/hardware/audio/FILE_VERSION/IStreamOut.h)
#include <fmq/EventFlag.h>
#include <fmq/MessageQueue.h>
#include <media/audiohal/StreamHalInterface.h>
@@ -131,6 +128,9 @@
// Use this method in situations where audio mixing is done in the hardware.
virtual status_t setVolume(float left, float right);
+ // Selects the audio presentation (if available).
+ virtual status_t selectPresentation(int presentationId, int programId);
+
// Write audio buffer to driver.
virtual status_t write(const void *buffer, size_t bytes, size_t *written);
diff --git a/media/libaudiohal/impl/StreamHalLocal.cpp b/media/libaudiohal/impl/StreamHalLocal.cpp
index b134f57..26d30d4 100644
--- a/media/libaudiohal/impl/StreamHalLocal.cpp
+++ b/media/libaudiohal/impl/StreamHalLocal.cpp
@@ -18,6 +18,7 @@
//#define LOG_NDEBUG 0
#include <hardware/audio.h>
+#include <media/AudioParameter.h>
#include <utils/Log.h>
#include "DeviceHalLocal.h"
@@ -138,6 +139,13 @@
return mStream->set_volume(mStream, left, right);
}
+status_t StreamOutHalLocal::selectPresentation(int presentationId, int programId) {
+ AudioParameter param;
+ param.addInt(String8(AudioParameter::keyPresentationId), presentationId);
+ param.addInt(String8(AudioParameter::keyProgramId), programId);
+ return setParameters(param.toString());
+}
+
status_t StreamOutHalLocal::write(const void *buffer, size_t bytes, size_t *written) {
ssize_t writeResult = mStream->write(mStream, buffer, bytes);
if (writeResult > 0) {
@@ -346,7 +354,7 @@
std::vector<media::MicrophoneInfo> *microphones __unused) {
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t StreamInHalLocal::getActiveMicrophones(std::vector<media::MicrophoneInfo> *microphones) {
if (mStream->get_active_microphones == NULL) return INVALID_OPERATION;
size_t actual_mics = AUDIO_MICROPHONE_MAX_COUNT;
diff --git a/media/libaudiohal/impl/StreamHalLocal.h b/media/libaudiohal/impl/StreamHalLocal.h
index cea4229..4fd1960 100644
--- a/media/libaudiohal/impl/StreamHalLocal.h
+++ b/media/libaudiohal/impl/StreamHalLocal.h
@@ -103,6 +103,9 @@
// Use this method in situations where audio mixing is done in the hardware.
virtual status_t setVolume(float left, float right);
+ // Selects the audio presentation (if available).
+ virtual status_t selectPresentation(int presentationId, int programId);
+
// Write audio buffer to driver.
virtual status_t write(const void *buffer, size_t bytes, size_t *written);
diff --git a/media/libaudiohal/impl/VersionMacro.h b/media/libaudiohal/impl/VersionMacro.h
deleted file mode 100644
index 98e9c07..0000000
--- a/media/libaudiohal/impl/VersionMacro.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_HARDWARE_VERSION_MACRO_H
-#define ANDROID_HARDWARE_VERSION_MACRO_H
-
-#if !defined(MAJOR_VERSION) || !defined(MINOR_VERSION)
-#error "MAJOR_VERSION and MINOR_VERSION must be defined"
-#endif
-
-#define CONCAT_3(a,b,c) a##b##c
-#define EXPAND_CONCAT_3(a,b,c) CONCAT_3(a,b,c)
-/** The directory name of the version: <major>.<minor> */
-#define FILE_VERSION EXPAND_CONCAT_3(MAJOR_VERSION,.,MINOR_VERSION)
-
-#define CONCAT_4(a,b,c,d) a##b##c##d
-#define EXPAND_CONCAT_4(a,b,c,d) CONCAT_4(a,b,c,d)
-/** The c++ namespace of the version: V<major>_<minor> */
-#define CPP_VERSION EXPAND_CONCAT_4(V,MAJOR_VERSION,_,MINOR_VERSION)
-
-#endif // ANDROID_HARDWARE_VERSION_MACRO_H
diff --git a/media/libaudiohal/impl/VersionUtils.h b/media/libaudiohal/impl/VersionUtils.h
index 5004895..eb0a42a 100644
--- a/media/libaudiohal/impl/VersionUtils.h
+++ b/media/libaudiohal/impl/VersionUtils.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_VERSION_UTILS_H
#define ANDROID_HARDWARE_VERSION_UTILS_H
-#include <android/hardware/audio/2.0/types.h>
-#include <android/hardware/audio/4.0/types.h>
+#include PATH(android/hardware/audio/FILE_VERSION/types.h)
#include <hidl/HidlSupport.h>
using ::android::hardware::audio::CPP_VERSION::ParameterValue;
@@ -43,7 +42,7 @@
hidl_vec<ParameterValue> keys) {
return object->setParameters(keys);
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
template <class T, class Callback>
Return<void> getParameters(T& object, hidl_vec<ParameterValue> context,
hidl_vec<hidl_string> keys, Callback callback) {
diff --git a/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h b/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h
index fa0effc..1d912a0 100644
--- a/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h
+++ b/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h
@@ -35,6 +35,11 @@
sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
} // namespace V4_0
+namespace V5_0 {
+sp<EffectsFactoryHalInterface> createEffectsFactoryHal();
+sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
+} // namespace V5_0
+
} // namespace android
#endif // ANDROID_HARDWARE_FACTORY_HAL_HIDL_H
diff --git a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
index c969e28..bd71dc0 100644
--- a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
+++ b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
@@ -109,6 +109,9 @@
// Use this method in situations where audio mixing is done in the hardware.
virtual status_t setVolume(float left, float right) = 0;
+ // Selects the audio presentation (if available).
+ virtual status_t selectPresentation(int presentationId, int programId) = 0;
+
// Write audio buffer to driver.
virtual status_t write(const void *buffer, size_t bytes, size_t *written) = 0;
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 53c32b2..ec043f2 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -588,6 +588,12 @@
}
};
+static std::vector<std::pair<const char *, uint32_t>> floatMappings {
+ {
+ { "capture-rate", kKeyCaptureFramerate },
+ }
+};
+
static std::vector<std::pair<const char *, uint32_t>> int64Mappings {
{
{ "exif-offset", kKeyExifOffset },
@@ -632,6 +638,13 @@
}
}
+ for (auto elem : floatMappings) {
+ float value;
+ if (msg->findFloat(elem.first, &value)) {
+ meta->setFloat(elem.second, value);
+ }
+ }
+
for (auto elem : int64Mappings) {
int64_t value;
if (msg->findInt64(elem.first, &value)) {
@@ -663,6 +676,13 @@
}
}
+ for (auto elem : floatMappings) {
+ float value;
+ if (meta->findFloat(elem.second, &value)) {
+ format->setFloat(elem.first, value);
+ }
+ }
+
for (auto elem : int64Mappings) {
int64_t value;
if (meta->findInt64(elem.second, &value)) {
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 06975ac..26f76c0 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -746,7 +746,7 @@
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 @@
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/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index b6b3815..1b20693 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -553,6 +553,7 @@
virtual void pause();
virtual status_t attachAuxEffect(int effectId);
virtual status_t setParameters(const String8& keyValuePairs);
+ virtual status_t selectPresentation(int presentationId, int programId);
virtual media::VolumeShaper::Status applyVolumeShaper(
const sp<media::VolumeShaper::Configuration>& configuration,
const sp<media::VolumeShaper::Operation>& operation) override;
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index 53ea9a4..971f6a5 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -67,6 +67,7 @@
bool isStatic() const { return mSharedBuffer.get() != nullptr; }
status_t setParameters(const String8& keyValuePairs);
+ status_t selectPresentation(int presentationId, int programId);
status_t attachAuxEffect(int EffectId);
void setAuxBuffer(int EffectId, int32_t *buffer);
int32_t *auxBuffer() const { return mAuxBuffer; }
diff --git a/services/audioflinger/RecordTracks.h b/services/audioflinger/RecordTracks.h
index b0c9fda..85f5456 100644
--- a/services/audioflinger/RecordTracks.h
+++ b/services/audioflinger/RecordTracks.h
@@ -71,6 +71,12 @@
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
+ static bool checkServerLatencySupported(
+ audio_format_t format, audio_input_flags_t flags) {
+ return audio_is_linear_pcm(format)
+ && (flags & AUDIO_INPUT_FLAG_HW_AV_SYNC) == 0;
+ }
+
private:
friend class AudioFlinger; // for mState
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index f833cf7..45d3a06 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -2413,6 +2413,14 @@
return String8();
}
+status_t AudioFlinger::DirectOutputThread::selectPresentation(int presentationId, int programId) {
+ Mutex::Autolock _l(mLock);
+ if (mOutput == nullptr || mOutput->stream == nullptr) {
+ return NO_INIT;
+ }
+ return mOutput->stream->selectPresentation(presentationId, programId);
+}
+
void AudioFlinger::PlaybackThread::ioConfigChanged(audio_io_config_event event, pid_t pid) {
sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
ALOGV("PlaybackThread::ioConfigChanged, thread %p, event %d", this, event);
@@ -7554,7 +7562,7 @@
(void)input->stream->dump(fd);
}
- const double latencyMs = audio_is_linear_pcm(mFormat)
+ const double latencyMs = RecordTrack::checkServerLatencySupported(mFormat, flags)
? - mTimestamp.getOutputServerLatencyMs(mSampleRate) : 0.;
if (latencyMs != 0.) {
dprintf(fd, " NormalRecord latency ms: %.2lf\n", latencyMs);
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 49fc234..7f3ea0f 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -1199,6 +1199,8 @@
audio_io_handle_t id, audio_devices_t device, bool systemReady);
virtual ~DirectOutputThread();
+ status_t selectPresentation(int presentationId, int programId);
+
// Thread virtuals
virtual bool checkForNewParameter_l(const String8& keyValuePair,
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index f2617ae..9a7f1f1 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -326,6 +326,10 @@
return mTrack->setParameters(keyValuePairs);
}
+status_t AudioFlinger::TrackHandle::selectPresentation(int presentationId, int programId) {
+ return mTrack->selectPresentation(presentationId, programId);
+}
+
VolumeShaper::Status AudioFlinger::TrackHandle::applyVolumeShaper(
const sp<VolumeShaper::Configuration>& configuration,
const sp<VolumeShaper::Operation>& operation) {
@@ -498,7 +502,7 @@
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 "
@@ -584,7 +588,7 @@
? '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 "
@@ -592,6 +596,7 @@
active ? "yes" : "no",
(mClient == 0) ? getpid() : mClient->pid(),
mSessionId,
+ mPortId,
getTrackStateString(),
mCblk->mFlags,
@@ -976,6 +981,19 @@
}
}
+status_t AudioFlinger::PlaybackThread::Track::selectPresentation(int presentationId,
+ int programId) {
+ sp<ThreadBase> thread = mThread.promote();
+ if (thread == 0) {
+ ALOGE("thread is dead");
+ return FAILED_TRANSACTION;
+ } else if ((thread->type() == ThreadBase::DIRECT) || (thread->type() == ThreadBase::OFFLOAD)) {
+ DirectOutputThread *directOutputThread = static_cast<DirectOutputThread*>(thread.get());
+ return directOutputThread->selectPresentation(presentationId, programId);
+ }
+ return INVALID_OPERATION;
+}
+
VolumeShaper::Status AudioFlinger::PlaybackThread::Track::applyVolumeShaper(
const sp<VolumeShaper::Configuration>& configuration,
const sp<VolumeShaper::Operation>& operation)
@@ -1755,7 +1773,7 @@
thread->mFastTrackAvail = false;
} else {
// TODO: only Normal Record has timestamps (Fast Record does not).
- mServerLatencySupported = audio_is_linear_pcm(mFormat);
+ mServerLatencySupported = checkServerLatencySupported(mFormat, flags);
}
#ifdef TEE_SINK
mTee.setId(std::string("_") + std::to_string(mThreadIoHandle)
@@ -1869,7 +1887,7 @@
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" : "");
@@ -1877,7 +1895,7 @@
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' : ' ',
@@ -1885,6 +1903,7 @@
mId,
(mClient == 0) ? getpid() : mClient->pid(),
mSessionId,
+ mPortId,
getTrackStateString(),
mCblk->mFlags,
@@ -2125,15 +2144,16 @@
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,
diff --git a/services/audiopolicy/Android.mk b/services/audiopolicy/Android.mk
index f23e426..02ab8ad 100644
--- a/services/audiopolicy/Android.mk
+++ b/services/audiopolicy/Android.mk
@@ -81,9 +81,9 @@
LOCAL_SHARED_LIBRARIES += libmedia_helper
LOCAL_SHARED_LIBRARIES += libmediametrics
-ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
LOCAL_SHARED_LIBRARIES += libhidlbase libicuuc libxml2
+ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
LOCAL_CFLAGS += -DUSE_XML_AUDIO_POLICY_CONF
endif #ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
diff --git a/services/audiopolicy/common/Android.bp b/services/audiopolicy/common/Android.bp
new file mode 100644
index 0000000..a925b9a
--- /dev/null
+++ b/services/audiopolicy/common/Android.bp
@@ -0,0 +1,4 @@
+cc_library_headers {
+ name: "libaudiopolicycommon",
+ export_include_dirs: ["include"],
+}
diff --git a/services/audiopolicy/common/Android.mk b/services/audiopolicy/common/Android.mk
deleted file mode 100644
index dcce8e3..0000000
--- a/services/audiopolicy/common/Android.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-#######################################################################
-# Recursive call sub-folder Android.mk
-#
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/services/audiopolicy/common/managerdefinitions/Android.bp b/services/audiopolicy/common/managerdefinitions/Android.bp
new file mode 100644
index 0000000..d0b4973
--- /dev/null
+++ b/services/audiopolicy/common/managerdefinitions/Android.bp
@@ -0,0 +1,53 @@
+cc_library_static {
+ name: "libaudiopolicycomponents",
+
+ srcs: [
+ "src/AudioCollections.cpp",
+ "src/AudioGain.cpp",
+ "src/AudioInputDescriptor.cpp",
+ "src/AudioOutputDescriptor.cpp",
+ "src/AudioPatch.cpp",
+ "src/AudioPolicyMix.cpp",
+ "src/AudioPort.cpp",
+ "src/AudioProfile.cpp",
+ "src/AudioRoute.cpp",
+ "src/ClientDescriptor.cpp",
+ "src/DeviceDescriptor.cpp",
+ "src/EffectDescriptor.cpp",
+ "src/HwModule.cpp",
+ "src/IOProfile.cpp",
+ "src/Serializer.cpp",
+ "src/SoundTriggerSession.cpp",
+ "src/TypeConverter.cpp",
+ "src/VolumeCurve.cpp",
+ ],
+ shared_libs: [
+ "libcutils",
+ "libhidlbase",
+ "libicuuc",
+ "liblog",
+ "libmedia",
+ "libutils",
+ "libxml2",
+ ],
+ export_shared_lib_headers: ["libmedia"],
+ static_libs: [
+ "libaudioutils",
+ ],
+ header_libs: [
+ "libaudiopolicycommon",
+ ],
+ export_header_lib_headers: ["libaudiopolicycommon"],
+
+ include_dirs: [
+ "frameworks/av/services/audiopolicy",
+ ],
+
+ export_include_dirs: ["include"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+}
diff --git a/services/audiopolicy/common/managerdefinitions/Android.mk b/services/audiopolicy/common/managerdefinitions/Android.mk
deleted file mode 100644
index 3336b79..0000000
--- a/services/audiopolicy/common/managerdefinitions/Android.mk
+++ /dev/null
@@ -1,66 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- src/DeviceDescriptor.cpp \
- src/AudioGain.cpp \
- src/HwModule.cpp \
- src/IOProfile.cpp \
- src/AudioPort.cpp \
- src/AudioProfile.cpp \
- src/AudioRoute.cpp \
- src/AudioPolicyMix.cpp \
- src/AudioPatch.cpp \
- src/AudioInputDescriptor.cpp \
- src/AudioOutputDescriptor.cpp \
- src/AudioCollections.cpp \
- src/EffectDescriptor.cpp \
- src/SoundTriggerSession.cpp \
- src/VolumeCurve.cpp \
- src/TypeConverter.cpp \
- src/ClientDescriptor.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libmedia \
- libutils \
- liblog \
-
-LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libmedia
-
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/include \
- frameworks/av/services/audiopolicy/common/include \
- frameworks/av/services/audiopolicy \
- $(call include-path-for, audio-utils) \
-
-ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
-
-LOCAL_SRC_FILES += src/Serializer.cpp
-
-LOCAL_SHARED_LIBRARIES += libhidlbase libicuuc libxml2
-
-LOCAL_C_INCLUDES += \
- external/libxml2/include \
- external/icu/icu4c/source/common
-
-else
-
-LOCAL_SRC_FILES += \
- src/ConfigParsingUtils.cpp \
- src/StreamDescriptor.cpp \
- src/Gains.cpp
-
-endif #ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
-
-LOCAL_EXPORT_C_INCLUDE_DIRS := \
- $(LOCAL_PATH)/include
-
-LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB)
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_MODULE := libaudiopolicycomponents
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/services/audiopolicy/common/managerdefinitions/include/ConfigParsingUtils.h b/services/audiopolicy/common/managerdefinitions/include/ConfigParsingUtils.h
deleted file mode 100644
index a007854..0000000
--- a/services/audiopolicy/common/managerdefinitions/include/ConfigParsingUtils.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "AudioPolicyConfig.h"
-#include "DeviceDescriptor.h"
-#include "HwModule.h"
-#include "audio_policy_conf.h"
-#include <system/audio.h>
-#include <utils/Log.h>
-#include <utils/Vector.h>
-#include <utils/SortedVector.h>
-#include <cutils/config_utils.h>
-#include <utils/RefBase.h>
-#include <system/audio_policy.h>
-
-namespace android {
-
-// ----------------------------------------------------------------------------
-// Definitions for audio_policy.conf file parsing
-// ----------------------------------------------------------------------------
-
-class ConfigParsingUtils
-{
-public:
- static status_t loadConfig(const char *path, AudioPolicyConfig &config);
-
-private:
- static void loadAudioPortGain(cnode *root, AudioPort &audioPort, int index);
- static void loadAudioPortGains(cnode *root, AudioPort &audioPort);
- static void loadDeviceDescriptorGains(cnode *root, sp<DeviceDescriptor> &deviceDesc);
- static status_t loadHwModuleDevice(cnode *root, DeviceVector &devices);
- static status_t loadHwModuleProfile(cnode *root, sp<HwModule> &module, audio_port_role_t role);
- static void loadDevicesFromTag(const char *tag, DeviceVector &devices,
- const DeviceVector &declaredDevices);
- static void loadHwModules(cnode *root, HwModuleCollection &hwModules,
- AudioPolicyConfig &config);
- static void loadGlobalConfig(cnode *root, AudioPolicyConfig &config,
- const sp<HwModule> &primaryModule);
- static void loadModuleGlobalConfig(cnode *root, const sp<HwModule> &module,
- AudioPolicyConfig &config);
- static status_t loadHwModule(cnode *root, sp<HwModule> &module, AudioPolicyConfig &config);
-};
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/include/Gains.h b/services/audiopolicy/common/managerdefinitions/include/Gains.h
deleted file mode 100644
index cb229a4..0000000
--- a/services/audiopolicy/common/managerdefinitions/include/Gains.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <StreamDescriptor.h>
-#include <utils/KeyedVector.h>
-#include <system/audio.h>
-#include <utils/Errors.h>
-#include <utils/RefBase.h>
-
-namespace android {
-
-class StreamDescriptor;
-
-class Gains
-{
-public :
- static float volIndexToDb(const VolumeCurvePoint *point, int indexMin, int indexMax,
- int indexInUi);
-
- // default volume curve
- static const VolumeCurvePoint sDefaultVolumeCurve[Volume::VOLCNT];
- // default volume curve for media strategy
- static const VolumeCurvePoint sDefaultMediaVolumeCurve[Volume::VOLCNT];
- // volume curve for non-media audio on ext media outputs (HDMI, Line, etc)
- static const VolumeCurvePoint sExtMediaSystemVolumeCurve[Volume::VOLCNT];
- // volume curve for media strategy on speakers
- static const VolumeCurvePoint sSpeakerMediaVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSpeakerMediaVolumeCurveDrc[Volume::VOLCNT];
- // volume curve for sonification strategy on speakers
- static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSpeakerSonificationVolumeCurveDrc[Volume::VOLCNT];
- static const VolumeCurvePoint sDefaultSystemVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sDefaultSystemVolumeCurveDrc[Volume::VOLCNT];
- static const VolumeCurvePoint sHeadsetSystemVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sDefaultVoiceVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sLinearVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSilentVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sFullScaleVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sHearingAidVolumeCurve[Volume::VOLCNT];
- // default volume curves per stream and device category. See initializeVolumeCurves()
- static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][DEVICE_CATEGORY_CNT];
-};
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/include/StreamDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/StreamDescriptor.h
deleted file mode 100644
index 6266313..0000000
--- a/services/audiopolicy/common/managerdefinitions/include/StreamDescriptor.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "IVolumeCurvesCollection.h"
-#include <utils/KeyedVector.h>
-#include <utils/StrongPointer.h>
-#include <utils/SortedVector.h>
-#include <system/audio.h>
-
-namespace android {
-
-// stream descriptor used for volume control
-class StreamDescriptor
-{
-public:
- StreamDescriptor();
-
- int getVolumeIndex(audio_devices_t device) const;
- bool canBeMuted() const { return mCanBeMuted; }
- void clearCurrentVolumeIndex();
- void addCurrentVolumeIndex(audio_devices_t device, int index);
- int getVolumeIndexMin() const { return mIndexMin; }
- int getVolumeIndexMax() const { return mIndexMax; }
- void setVolumeIndexMin(int volIndexMin);
- void setVolumeIndexMax(int volIndexMax);
- bool hasVolumeIndexForDevice(audio_devices_t device) const
- {
- device = Volume::getDeviceForVolume(device);
- return mIndexCur.indexOfKey(device) >= 0;
- }
-
- void dump(String8 *dst) const;
-
- void setVolumeCurvePoint(device_category deviceCategory, const VolumeCurvePoint *point);
- const VolumeCurvePoint *getVolumeCurvePoint(device_category deviceCategory) const
- {
- return mVolumeCurve[deviceCategory];
- }
-
-private:
- const VolumeCurvePoint *mVolumeCurve[DEVICE_CATEGORY_CNT];
- KeyedVector<audio_devices_t, int> mIndexCur; /**< current volume index per device. */
- int mIndexMin; /**< min volume index. */
- int mIndexMax; /**< max volume index. */
- bool mCanBeMuted; /**< true is the stream can be muted. */
-};
-
-/**
- * stream descriptors collection for volume control
- */
-class StreamDescriptorCollection : public DefaultKeyedVector<audio_stream_type_t, StreamDescriptor>,
- public IVolumeCurvesCollection
-{
-public:
- StreamDescriptorCollection();
-
- virtual void clearCurrentVolumeIndex(audio_stream_type_t stream);
- virtual void addCurrentVolumeIndex(audio_stream_type_t stream, audio_devices_t device,
- int index);
- virtual bool canBeMuted(audio_stream_type_t stream);
- virtual int getVolumeIndexMin(audio_stream_type_t stream) const
- {
- return valueFor(stream).getVolumeIndexMin();
- }
- virtual int getVolumeIndex(audio_stream_type_t stream, audio_devices_t device)
- {
- return valueFor(stream).getVolumeIndex(device);
- }
- virtual int getVolumeIndexMax(audio_stream_type_t stream) const
- {
- return valueFor(stream).getVolumeIndexMax();
- }
- virtual float volIndexToDb(audio_stream_type_t stream, device_category device,
- int indexInUi) const;
- virtual status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax);
- virtual void initializeVolumeCurves(bool isSpeakerDrcEnabled);
- virtual void switchVolumeCurve(audio_stream_type_t streamSrc, audio_stream_type_t streamDst);
- virtual bool hasVolumeIndexForDevice(audio_stream_type_t stream,
- audio_devices_t device) const
- {
- return valueFor(stream).hasVolumeIndexForDevice(device);
- }
-
- void dump(String8 *dst) const override;
-
-private:
- void setVolumeCurvePoint(audio_stream_type_t stream, device_category deviceCategory,
- const VolumeCurvePoint *point);
- const VolumeCurvePoint *getVolumeCurvePoint(audio_stream_type_t stream,
- device_category deviceCategory) const;
- void setVolumeIndexMin(audio_stream_type_t stream,int volIndexMin);
- void setVolumeIndexMax(audio_stream_type_t stream,int volIndexMax);
-};
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp b/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
deleted file mode 100644
index 59db81c..0000000
--- a/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "APM::ConfigParsingUtils"
-//#define LOG_NDEBUG 0
-
-#include "ConfigParsingUtils.h"
-#include "AudioGain.h"
-#include "IOProfile.h"
-#include <system/audio.h>
-#include <media/AudioParameter.h>
-#include <media/TypeConverter.h>
-#include <utils/Log.h>
-#include <cutils/misc.h>
-
-namespace android {
-
-// --- audio_policy.conf file parsing
-
-//static
-void ConfigParsingUtils::loadAudioPortGain(cnode *root, AudioPort &audioPort, int index)
-{
- cnode *node = root->first_child;
-
- sp<AudioGain> gain = new AudioGain(index, audioPort.useInputChannelMask());
-
- while (node) {
- if (strcmp(node->name, GAIN_MODE) == 0) {
- gain->setMode(GainModeConverter::maskFromString(node->value));
- } else if (strcmp(node->name, GAIN_CHANNELS) == 0) {
- audio_channel_mask_t mask;
- if (audioPort.useInputChannelMask()) {
- if (InputChannelConverter::fromString(node->value, mask)) {
- gain->setChannelMask(mask);
- }
- } else {
- if (OutputChannelConverter::fromString(node->value, mask)) {
- gain->setChannelMask(mask);
- }
- }
- } else if (strcmp(node->name, GAIN_MIN_VALUE) == 0) {
- gain->setMinValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_MAX_VALUE) == 0) {
- gain->setMaxValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_DEFAULT_VALUE) == 0) {
- gain->setDefaultValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_STEP_VALUE) == 0) {
- gain->setStepValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_MIN_RAMP_MS) == 0) {
- gain->setMinRampInMs(atoi(node->value));
- } else if (strcmp(node->name, GAIN_MAX_RAMP_MS) == 0) {
- gain->setMaxRampInMs(atoi(node->value));
- }
- node = node->next;
- }
-
- ALOGV("loadGain() adding new gain mode %08x channel mask %08x min mB %d max mB %d",
- gain->getMode(), gain->getChannelMask(), gain->getMinValueInMb(),
- gain->getMaxValueInMb());
-
- if (gain->getMode() == 0) {
- return;
- }
- audioPort.mGains.add(gain);
-}
-
-void ConfigParsingUtils::loadAudioPortGains(cnode *root, AudioPort &audioPort)
-{
- cnode *node = root->first_child;
- int index = 0;
- while (node) {
- ALOGV("loadGains() loading gain %s", node->name);
- loadAudioPortGain(node, audioPort, index++);
- node = node->next;
- }
-}
-
-//static
-void ConfigParsingUtils::loadDeviceDescriptorGains(cnode *root, sp<DeviceDescriptor> &deviceDesc)
-{
- loadAudioPortGains(root, *deviceDesc);
- if (deviceDesc->mGains.size() > 0) {
- deviceDesc->mGains[0]->getDefaultConfig(&deviceDesc->mGain);
- }
-}
-
-//static
-status_t ConfigParsingUtils::loadHwModuleDevice(cnode *root, DeviceVector &devices)
-{
- cnode *node = root->first_child;
-
- audio_devices_t type = AUDIO_DEVICE_NONE;
- while (node) {
- if (strcmp(node->name, APM_DEVICE_TYPE) == 0) {
- deviceFromString(node->value, type);
- break;
- }
- node = node->next;
- }
- if (type == AUDIO_DEVICE_NONE ||
- (!audio_is_input_device(type) && !audio_is_output_device(type))) {
- ALOGW("loadDevice() bad type %08x", type);
- return BAD_VALUE;
- }
- sp<DeviceDescriptor> deviceDesc = new DeviceDescriptor(type, String8(root->name));
-
- node = root->first_child;
- while (node) {
- if (strcmp(node->name, APM_DEVICE_ADDRESS) == 0) {
- deviceDesc->mAddress = String8((char *)node->value);
- } else if (strcmp(node->name, CHANNELS_TAG) == 0) {
- if (audio_is_input_device(type)) {
- deviceDesc->addAudioProfile(
- new AudioProfile(gDynamicFormat,
- inputChannelMasksFromString(node->value),
- SampleRateVector()));
- } else {
- deviceDesc->addAudioProfile(
- new AudioProfile(gDynamicFormat,
- outputChannelMasksFromString(node->value),
- SampleRateVector()));
- }
- } else if (strcmp(node->name, GAINS_TAG) == 0) {
- loadDeviceDescriptorGains(node, deviceDesc);
- }
- node = node->next;
- }
-
- ALOGV("loadDevice() adding device tag (literal type) %s type %08x address %s",
- deviceDesc->getTagName().string(), type, deviceDesc->mAddress.string());
-
- devices.add(deviceDesc);
- return NO_ERROR;
-}
-
-//static
-status_t ConfigParsingUtils::loadHwModuleProfile(cnode *root, sp<HwModule> &module,
- audio_port_role_t role)
-{
- cnode *node = root->first_child;
-
- sp<IOProfile> profile = new IOProfile(String8(root->name), role);
-
- AudioProfileVector audioProfiles;
- SampleRateVector sampleRates;
- ChannelsVector channels;
- FormatVector formats;
-
- while (node) {
- if (strcmp(node->name, FORMATS_TAG) == 0 &&
- strcmp(node->value, DYNAMIC_VALUE_TAG) != 0) {
- formats = formatsFromString(node->value);
- } else if (strcmp(node->name, SAMPLING_RATES_TAG) == 0 &&
- strcmp(node->value, DYNAMIC_VALUE_TAG) != 0) {
- collectionFromString<SampleRateTraits>(node->value, sampleRates);
- } else if (strcmp(node->name, CHANNELS_TAG) == 0 &&
- strcmp(node->value, DYNAMIC_VALUE_TAG) != 0) {
- if (role == AUDIO_PORT_ROLE_SINK) {
- channels = inputChannelMasksFromString(node->value);
- } else {
- channels = outputChannelMasksFromString(node->value);
- }
- } else if (strcmp(node->name, DEVICES_TAG) == 0) {
- DeviceVector devices;
- loadDevicesFromTag(node->value, devices, module->getDeclaredDevices());
- profile->setSupportedDevices(devices);
- } else if (strcmp(node->name, FLAGS_TAG) == 0) {
- if (role == AUDIO_PORT_ROLE_SINK) {
- profile->setFlags(InputFlagConverter::maskFromString(node->value));
- } else {
- profile->setFlags(OutputFlagConverter::maskFromString(node->value));
- }
- } else if (strcmp(node->name, GAINS_TAG) == 0) {
- loadAudioPortGains(node, *profile);
- }
- node = node->next;
- }
- if (formats.isEmpty()) {
- sp<AudioProfile> profileToAdd = new AudioProfile(gDynamicFormat, channels, sampleRates);
- profileToAdd->setDynamicFormat(true);
- profileToAdd->setDynamicChannels(channels.isEmpty());
- profileToAdd->setDynamicRate(sampleRates.isEmpty());
- audioProfiles.add(profileToAdd);
- } else {
- for (size_t i = 0; i < formats.size(); i++) {
- // For compatibility reason, for each format, creates a profile with the same
- // collection of rate and channels.
- sp<AudioProfile> profileToAdd = new AudioProfile(formats[i], channels, sampleRates);
- profileToAdd->setDynamicFormat(formats[i] == gDynamicFormat);
- profileToAdd->setDynamicChannels(channels.isEmpty());
- profileToAdd->setDynamicRate(sampleRates.isEmpty());
- audioProfiles.add(profileToAdd);
- }
- }
- profile->setAudioProfiles(audioProfiles);
- ALOGW_IF(!profile->hasSupportedDevices(), "load%s() invalid supported devices",
- role == AUDIO_PORT_ROLE_SINK ? "Input" : "Output");
- if (profile->hasSupportedDevices()) {
- ALOGV("load%s() adding Supported Devices %04x, mFlags %04x",
- role == AUDIO_PORT_ROLE_SINK ? "Input" : "Output",
- profile->getSupportedDevicesType(), profile->getFlags());
- return module->addProfile(profile);
- }
- return BAD_VALUE;
-}
-
-//static
-status_t ConfigParsingUtils::loadHwModule(cnode *root, sp<HwModule> &module,
- AudioPolicyConfig &config)
-{
- status_t status = NAME_NOT_FOUND;
- cnode *node = config_find(root, DEVICES_TAG);
- if (node != NULL) {
- node = node->first_child;
- DeviceVector devices;
- while (node) {
- ALOGV("loadHwModule() loading device %s", node->name);
- status_t tmpStatus = loadHwModuleDevice(node, devices);
- if (status == NAME_NOT_FOUND || status == NO_ERROR) {
- status = tmpStatus;
- }
- node = node->next;
- }
- module->setDeclaredDevices(devices);
- }
- node = config_find(root, OUTPUTS_TAG);
- if (node != NULL) {
- node = node->first_child;
- while (node) {
- ALOGV("loadHwModule() loading output %s", node->name);
- status_t tmpStatus = loadHwModuleProfile(node, module, AUDIO_PORT_ROLE_SOURCE);
- if (status == NAME_NOT_FOUND || status == NO_ERROR) {
- status = tmpStatus;
- }
- node = node->next;
- }
- }
- node = config_find(root, INPUTS_TAG);
- if (node != NULL) {
- node = node->first_child;
- while (node) {
- ALOGV("loadHwModule() loading input %s", node->name);
- status_t tmpStatus = loadHwModuleProfile(node, module, AUDIO_PORT_ROLE_SINK);
- if (status == NAME_NOT_FOUND || status == NO_ERROR) {
- status = tmpStatus;
- }
- node = node->next;
- }
- }
- loadModuleGlobalConfig(root, module, config);
- return status;
-}
-
-//static
-void ConfigParsingUtils::loadHwModules(cnode *root, HwModuleCollection &hwModules,
- AudioPolicyConfig &config)
-{
- cnode *node = config_find(root, AUDIO_HW_MODULE_TAG);
- if (node == NULL) {
- return;
- }
-
- node = node->first_child;
- while (node) {
- ALOGV("loadHwModules() loading module %s", node->name);
- sp<HwModule> module = new HwModule(node->name);
- if (loadHwModule(node, module, config) == NO_ERROR) {
- hwModules.add(module);
- }
- node = node->next;
- }
-}
-
-//static
-void ConfigParsingUtils::loadDevicesFromTag(const char *tag, DeviceVector &devices,
- const DeviceVector &declaredDevices)
-{
- char *tagLiteral = strndup(tag, strlen(tag));
- char *devTag = strtok(tagLiteral, AudioParameter::valueListSeparator);
- while (devTag != NULL) {
- if (strlen(devTag) != 0) {
- audio_devices_t type;
- if (deviceFromString(devTag, type)) {
- uint32_t inBit = type & AUDIO_DEVICE_BIT_IN;
- type &= ~AUDIO_DEVICE_BIT_IN;
- while (type) {
- audio_devices_t singleType =
- inBit | (1 << (31 - __builtin_clz(type)));
- type &= ~singleType;
- sp<DeviceDescriptor> dev = new DeviceDescriptor(singleType);
- devices.add(dev);
- }
- } else {
- sp<DeviceDescriptor> deviceDesc =
- declaredDevices.getDeviceFromTagName(String8(devTag));
- if (deviceDesc != 0) {
- devices.add(deviceDesc);
- }
- }
- }
- devTag = strtok(NULL, AudioParameter::valueListSeparator);
- }
- free(tagLiteral);
-}
-
-//static
-void ConfigParsingUtils::loadModuleGlobalConfig(cnode *root, const sp<HwModule> &module,
- AudioPolicyConfig &config)
-{
- cnode *node = config_find(root, GLOBAL_CONFIG_TAG);
-
- if (node == NULL) {
- return;
- }
- DeviceVector declaredDevices;
- if (module != NULL) {
- declaredDevices = module->getDeclaredDevices();
- }
-
- node = node->first_child;
- while (node) {
- if (strcmp(ATTACHED_OUTPUT_DEVICES_TAG, node->name) == 0) {
- DeviceVector availableOutputDevices;
- loadDevicesFromTag(node->value, availableOutputDevices, declaredDevices);
- ALOGV("loadGlobalConfig() Attached Output Devices %08x",
- availableOutputDevices.types());
- config.addAvailableOutputDevices(availableOutputDevices);
- } else if (strcmp(DEFAULT_OUTPUT_DEVICE_TAG, node->name) == 0) {
- audio_devices_t device = AUDIO_DEVICE_NONE;
- deviceFromString(node->value, device);
- if (device != AUDIO_DEVICE_NONE) {
- sp<DeviceDescriptor> defaultOutputDevice = new DeviceDescriptor(device);
- config.setDefaultOutputDevice(defaultOutputDevice);
- ALOGV("loadGlobalConfig() mDefaultOutputDevice %08x", defaultOutputDevice->type());
- } else {
- ALOGW("loadGlobalConfig() default device not specified");
- }
- } else if (strcmp(ATTACHED_INPUT_DEVICES_TAG, node->name) == 0) {
- DeviceVector availableInputDevices;
- loadDevicesFromTag(node->value, availableInputDevices, declaredDevices);
- ALOGV("loadGlobalConfig() Available InputDevices %08x", availableInputDevices.types());
- config.addAvailableInputDevices(availableInputDevices);
- } else if (strcmp(AUDIO_HAL_VERSION_TAG, node->name) == 0) {
- uint32_t major, minor;
- sscanf((char *)node->value, "%u.%u", &major, &minor);
- module->setHalVersion(major, minor);
- ALOGV("loadGlobalConfig() mHalVersion = major %u minor %u", major, minor);
- }
- node = node->next;
- }
-}
-
-//static
-void ConfigParsingUtils::loadGlobalConfig(cnode *root, AudioPolicyConfig &config,
- const sp<HwModule>& primaryModule)
-{
- cnode *node = config_find(root, GLOBAL_CONFIG_TAG);
-
- if (node == NULL) {
- return;
- }
- node = node->first_child;
- while (node) {
- if (strcmp(SPEAKER_DRC_ENABLED_TAG, node->name) == 0) {
- bool speakerDrcEnabled;
- if (utilities::convertTo<std::string, bool>(node->value, speakerDrcEnabled)) {
- ALOGV("loadGlobalConfig() mSpeakerDrcEnabled = %d", speakerDrcEnabled);
- config.setSpeakerDrcEnabled(speakerDrcEnabled);
- }
- }
- node = node->next;
- }
- loadModuleGlobalConfig(root, primaryModule, config);
-}
-
-//static
-status_t ConfigParsingUtils::loadConfig(const char *path, AudioPolicyConfig &config)
-{
- cnode *root;
- char *data;
-
- data = (char *)load_file(path, NULL);
- if (data == NULL) {
- return -ENODEV;
- }
- root = config_node("", "");
- config_load(root, data);
-
- HwModuleCollection hwModules;
- loadHwModules(root, hwModules, config);
-
- // legacy audio_policy.conf files have one global_configuration section, attached to primary.
- loadGlobalConfig(root, config, hwModules.getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY));
-
- config.setHwModules(hwModules);
-
- config.setDefaultSurroundFormats();
-
- config_free(root);
- free(root);
- free(data);
-
- ALOGI("loadAudioPolicyConfig() loaded %s\n", path);
- config.setSource(path);
-
- return NO_ERROR;
-}
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/Gains.cpp b/services/audiopolicy/common/managerdefinitions/src/Gains.cpp
deleted file mode 100644
index 6407a17..0000000
--- a/services/audiopolicy/common/managerdefinitions/src/Gains.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "APM::Gains"
-//#define LOG_NDEBUG 0
-
-//#define VERY_VERBOSE_LOGGING
-#ifdef VERY_VERBOSE_LOGGING
-#define ALOGVV ALOGV
-#else
-#define ALOGVV(a...) do { } while(0)
-#endif
-
-#include "Gains.h"
-#include <Volume.h>
-#include <math.h>
-#include <utils/String8.h>
-
-namespace android {
-
-// Enginedefault
-const VolumeCurvePoint
-Gains::sDefaultVolumeCurve[Volume::VOLCNT] = {
- {1, -49.5f}, {33, -33.5f}, {66, -17.0f}, {100, 0.0f}
-};
-
-
-const VolumeCurvePoint
-Gains::sDefaultMediaVolumeCurve[Volume::VOLCNT] = {
- {1, -58.0f}, {20, -40.0f}, {60, -17.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sExtMediaSystemVolumeCurve[Volume::VOLCNT] = {
- {1, -58.0f}, {20, -40.0f}, {60, -21.0f}, {100, -10.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerMediaVolumeCurve[Volume::VOLCNT] = {
- {1, -56.0f}, {20, -34.0f}, {60, -11.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerMediaVolumeCurveDrc[Volume::VOLCNT] = {
- {1, -55.0f}, {20, -43.0f}, {86, -12.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerSonificationVolumeCurve[Volume::VOLCNT] = {
- {1, -29.7f}, {33, -20.1f}, {66, -10.2f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerSonificationVolumeCurveDrc[Volume::VOLCNT] = {
- {1, -35.7f}, {33, -26.1f}, {66, -13.2f}, {100, 0.0f}
-};
-
-// AUDIO_STREAM_SYSTEM, AUDIO_STREAM_ENFORCED_AUDIBLE and AUDIO_STREAM_DTMF volume tracks
-// AUDIO_STREAM_RING on phones and AUDIO_STREAM_MUSIC on tablets.
-// AUDIO_STREAM_DTMF tracks AUDIO_STREAM_VOICE_CALL while in call (See AudioService.java).
-// The range is constrained between -24dB and -6dB over speaker and -30dB and -18dB over headset.
-
-const VolumeCurvePoint
-Gains::sDefaultSystemVolumeCurve[Volume::VOLCNT] = {
- {1, -24.0f}, {33, -18.0f}, {66, -12.0f}, {100, -6.0f}
-};
-
-const VolumeCurvePoint
-Gains::sDefaultSystemVolumeCurveDrc[Volume::VOLCNT] = {
- {1, -34.0f}, {33, -24.0f}, {66, -15.0f}, {100, -6.0f}
-};
-
-const VolumeCurvePoint
-Gains::sHeadsetSystemVolumeCurve[Volume::VOLCNT] = {
- {1, -30.0f}, {33, -26.0f}, {66, -22.0f}, {100, -18.0f}
-};
-
-const VolumeCurvePoint
-Gains::sDefaultVoiceVolumeCurve[Volume::VOLCNT] = {
- {0, -42.0f}, {33, -28.0f}, {66, -14.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerVoiceVolumeCurve[Volume::VOLCNT] = {
- {0, -24.0f}, {33, -16.0f}, {66, -8.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sLinearVolumeCurve[Volume::VOLCNT] = {
- {0, -96.0f}, {33, -68.0f}, {66, -34.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSilentVolumeCurve[Volume::VOLCNT] = {
- {0, -96.0f}, {1, -96.0f}, {2, -96.0f}, {100, -96.0f}
-};
-
-const VolumeCurvePoint
-Gains::sFullScaleVolumeCurve[Volume::VOLCNT] = {
- {0, 0.0f}, {1, 0.0f}, {2, 0.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sHearingAidVolumeCurve[Volume::VOLCNT] = {
- {1, -128.0f}, {20, -80.0f}, {60, -40.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint *Gains::sVolumeProfiles[AUDIO_STREAM_CNT]
- [DEVICE_CATEGORY_CNT] = {
- { // AUDIO_STREAM_VOICE_CALL
- Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_SYSTEM
- Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_RING
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_MUSIC
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerMediaVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_ALARM
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_NOTIFICATION
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_BLUETOOTH_SCO
- Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_ENFORCED_AUDIBLE
- Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_DTMF
- Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_TTS
- // "Transmitted Through Speaker": always silent except on DEVICE_CATEGORY_SPEAKER
- Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_ACCESSIBILITY
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerMediaVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_REROUTING
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sFullScaleVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_PATCH
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sFullScaleVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
-};
-
-//static
-float Gains::volIndexToDb(const VolumeCurvePoint *curve, int indexMin, int indexMax, int indexInUi)
-{
- // the volume index in the UI is relative to the min and max volume indices for this stream type
- int nbSteps = 1 + curve[Volume::VOLMAX].mIndex - curve[Volume::VOLMIN].mIndex;
- int volIdx = (nbSteps * (indexInUi - indexMin)) / (indexMax - indexMin);
-
- // find what part of the curve this index volume belongs to, or if it's out of bounds
- int segment = 0;
- if (volIdx < curve[Volume::VOLMIN].mIndex) { // out of bounds
- return VOLUME_MIN_DB;
- } else if (volIdx < curve[Volume::VOLKNEE1].mIndex) {
- segment = 0;
- } else if (volIdx < curve[Volume::VOLKNEE2].mIndex) {
- segment = 1;
- } else if (volIdx <= curve[Volume::VOLMAX].mIndex) {
- segment = 2;
- } else { // out of bounds
- return 0.0f;
- }
-
- // linear interpolation in the attenuation table in dB
- float decibels = curve[segment].mDBAttenuation +
- ((float)(volIdx - curve[segment].mIndex)) *
- ( (curve[segment+1].mDBAttenuation -
- curve[segment].mDBAttenuation) /
- ((float)(curve[segment+1].mIndex -
- curve[segment].mIndex)) );
-
- ALOGVV("VOLUME vol index=[%d %d %d], dB=[%.1f %.1f %.1f]",
- curve[segment].mIndex, volIdx,
- curve[segment+1].mIndex,
- curve[segment].mDBAttenuation,
- decibels,
- curve[segment+1].mDBAttenuation);
-
- return decibels;
-}
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/StreamDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/StreamDescriptor.cpp
deleted file mode 100644
index c311a4f..0000000
--- a/services/audiopolicy/common/managerdefinitions/src/StreamDescriptor.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "APM::Volumes"
-//#define LOG_NDEBUG 0
-
-//#define VERY_VERBOSE_LOGGING
-#ifdef VERY_VERBOSE_LOGGING
-#define ALOGVV ALOGV
-#else
-#define ALOGVV(a...) do { } while(0)
-#endif
-
-#include "StreamDescriptor.h"
-#include "Gains.h"
-#include "policy.h"
-#include <utils/Log.h>
-#include <utils/String8.h>
-
-namespace android {
-
-// --- StreamDescriptor class implementation
-
-StreamDescriptor::StreamDescriptor()
- : mIndexMin(0), mIndexMax(1), mCanBeMuted(true)
-{
- // Initialize the current stream's index to mIndexMax so volume isn't 0 in
- // cases where the Java layer doesn't call into the audio policy service to
- // set the default volume.
- mIndexCur.add(AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME, mIndexMax);
-}
-
-int StreamDescriptor::getVolumeIndex(audio_devices_t device) const
-{
- device = Volume::getDeviceForVolume(device);
- // there is always a valid entry for AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME
- if (mIndexCur.indexOfKey(device) < 0) {
- device = AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME;
- }
- return mIndexCur.valueFor(device);
-}
-
-void StreamDescriptor::clearCurrentVolumeIndex()
-{
- mIndexCur.clear();
-}
-
-void StreamDescriptor::addCurrentVolumeIndex(audio_devices_t device, int index)
-{
- mIndexCur.add(device, index);
-}
-
-void StreamDescriptor::setVolumeIndexMin(int volIndexMin)
-{
- mIndexMin = volIndexMin;
-}
-
-void StreamDescriptor::setVolumeIndexMax(int volIndexMax)
-{
- mIndexMax = volIndexMax;
-}
-
-void StreamDescriptor::setVolumeCurvePoint(device_category deviceCategory,
- const VolumeCurvePoint *point)
-{
- mVolumeCurve[deviceCategory] = point;
-}
-
-void StreamDescriptor::dump(String8 *dst) const
-{
- dst->appendFormat("%s %02d %02d ",
- mCanBeMuted ? "true " : "false", mIndexMin, mIndexMax);
- for (size_t i = 0; i < mIndexCur.size(); i++) {
- dst->appendFormat("%04x : %02d, ",
- mIndexCur.keyAt(i),
- mIndexCur.valueAt(i));
- }
- dst->append("\n");
-}
-
-StreamDescriptorCollection::StreamDescriptorCollection()
-{
- for (size_t stream = 0 ; stream < AUDIO_STREAM_CNT; stream++) {
- add(static_cast<audio_stream_type_t>(stream), StreamDescriptor());
- }
-}
-
-bool StreamDescriptorCollection::canBeMuted(audio_stream_type_t stream)
-{
- return valueAt(stream).canBeMuted();
-}
-
-void StreamDescriptorCollection::clearCurrentVolumeIndex(audio_stream_type_t stream)
-{
- editValueAt(stream).clearCurrentVolumeIndex();
-}
-
-void StreamDescriptorCollection::addCurrentVolumeIndex(audio_stream_type_t stream,
- audio_devices_t device, int index)
-{
- editValueAt(stream).addCurrentVolumeIndex(device, index);
-}
-
-void StreamDescriptorCollection::setVolumeCurvePoint(audio_stream_type_t stream,
- device_category deviceCategory,
- const VolumeCurvePoint *point)
-{
- editValueAt(stream).setVolumeCurvePoint(deviceCategory, point);
-}
-
-const VolumeCurvePoint *StreamDescriptorCollection::getVolumeCurvePoint(audio_stream_type_t stream,
- device_category deviceCategory) const
-{
- return valueAt(stream).getVolumeCurvePoint(deviceCategory);
-}
-
-void StreamDescriptorCollection::setVolumeIndexMin(audio_stream_type_t stream,int volIndexMin)
-{
- return editValueAt(stream).setVolumeIndexMin(volIndexMin);
-}
-
-void StreamDescriptorCollection::setVolumeIndexMax(audio_stream_type_t stream,int volIndexMax)
-{
- return editValueAt(stream).setVolumeIndexMax(volIndexMax);
-}
-
-float StreamDescriptorCollection::volIndexToDb(audio_stream_type_t stream, device_category category,
- int indexInUi) const
-{
- const StreamDescriptor &streamDesc = valueAt(stream);
- return Gains::volIndexToDb(streamDesc.getVolumeCurvePoint(category),
- streamDesc.getVolumeIndexMin(), streamDesc.getVolumeIndexMax(),
- indexInUi);
-}
-
-status_t StreamDescriptorCollection::initStreamVolume(audio_stream_type_t stream,
- int indexMin, int indexMax)
-{
- ALOGV("initStreamVolume() stream %d, min %d, max %d", stream , indexMin, indexMax);
- if (indexMin < 0 || indexMin >= indexMax) {
- ALOGW("initStreamVolume() invalid index limits for stream %d, min %d, max %d",
- stream , indexMin, indexMax);
- return BAD_VALUE;
- }
- setVolumeIndexMin(stream, indexMin);
- setVolumeIndexMax(stream, indexMax);
- return NO_ERROR;
-}
-
-void StreamDescriptorCollection::initializeVolumeCurves(bool isSpeakerDrcEnabled)
-{
- for (int i = 0; i < AUDIO_STREAM_CNT; i++) {
- for (int j = 0; j < DEVICE_CATEGORY_CNT; j++) {
- setVolumeCurvePoint(static_cast<audio_stream_type_t>(i),
- static_cast<device_category>(j),
- Gains::sVolumeProfiles[i][j]);
- }
- }
-
- // Check availability of DRC on speaker path: if available, override some of the speaker curves
- if (isSpeakerDrcEnabled) {
- setVolumeCurvePoint(AUDIO_STREAM_SYSTEM, DEVICE_CATEGORY_SPEAKER,
- Gains::sDefaultSystemVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_RING, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerSonificationVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_ALARM, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerSonificationVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_NOTIFICATION, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerSonificationVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_MUSIC, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerMediaVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_ACCESSIBILITY, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerMediaVolumeCurveDrc);
- }
-}
-
-void StreamDescriptorCollection::switchVolumeCurve(audio_stream_type_t streamSrc,
- audio_stream_type_t streamDst)
-{
- for (int j = 0; j < DEVICE_CATEGORY_CNT; j++) {
- setVolumeCurvePoint(streamDst, static_cast<device_category>(j),
- Gains::sVolumeProfiles[streamSrc][j]);
- }
-}
-
-void StreamDescriptorCollection::dump(String8 *dst) const
-{
- dst->append("\nStreams dump:\n");
- dst->append(
- " Stream Can be muted Index Min Index Max Index Cur [device : index]...\n");
- for (size_t i = 0; i < size(); i++) {
- dst->appendFormat(" %02zu ", i);
- valueAt(i).dump(dst);
- }
-}
-
-} // namespace android
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 68858226..6ec6a76 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -49,10 +49,6 @@
#include <system/audio.h>
#include <audio_policy_conf.h>
#include "AudioPolicyManager.h"
-#ifndef USE_XML_AUDIO_POLICY_CONF
-#include <ConfigParsingUtils.h>
-#include <StreamDescriptor.h>
-#endif
#include <Serializer.h>
#include "TypeConverter.h"
#include <policy.h>
@@ -3796,7 +3792,6 @@
return mAudioPortGeneration++;
}
-#ifdef USE_XML_AUDIO_POLICY_CONF
// Treblized audio policy xml config will be located in /odm/etc or /vendor/etc.
static const char *kConfigLocationList[] =
{"/odm/etc", "/vendor/etc", "/system/etc"};
@@ -3828,7 +3823,6 @@
}
return ret;
}
-#endif
AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface,
bool /*forTesting*/)
@@ -3837,15 +3831,9 @@
mpClientInterface(clientInterface),
mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),
mA2dpSuspended(false),
-#ifdef USE_XML_AUDIO_POLICY_CONF
mVolumeCurves(new VolumeCurvesCollection()),
mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
mDefaultOutputDevice, static_cast<VolumeCurvesCollection*>(mVolumeCurves.get())),
-#else
- mVolumeCurves(new StreamDescriptorCollection()),
- mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
- mDefaultOutputDevice),
-#endif
mAudioPortGeneration(1),
mBeaconMuteRefCount(0),
mBeaconPlayingRefCount(0),
@@ -3864,13 +3852,16 @@
initialize();
}
-void AudioPolicyManager::loadConfig() {
-#ifdef USE_XML_AUDIO_POLICY_CONF
- if (deserializeAudioPolicyXmlConfig(getConfig()) != NO_ERROR) {
-#else
- if ((ConfigParsingUtils::loadConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE, getConfig()) != NO_ERROR)
- && (ConfigParsingUtils::loadConfig(AUDIO_POLICY_CONFIG_FILE, getConfig()) != NO_ERROR)) {
+// This check is to catch any legacy platform updating to Q without having
+// switched to XML since its deprecation on O.
+// TODO: after Q release, remove this check and flag as XML is now the only
+// option and all legacy platform should have transitioned to XML.
+#ifndef USE_XML_AUDIO_POLICY_CONF
+#error Audio policy no longer supports legacy .conf configuration format
#endif
+
+void AudioPolicyManager::loadConfig() {
+ if (deserializeAudioPolicyXmlConfig(getConfig()) != NO_ERROR) {
ALOGE("could not load audio policy configuration file, setting defaults");
getConfig().setDefault();
}
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 018d9e3..78dbf5f 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -340,14 +340,41 @@
return NO_ERROR;
}
-void AudioPolicyService::setAppState(uid_t uid, app_state_t state)
+void AudioPolicyService::updateUidStates()
{
- {
- Mutex::Autolock _l(mLock);
- if (mAudioPolicyManager) {
- AutoCallerClear acc;
- mAudioPolicyManager->setAppState(uid, state);
- }
+ Mutex::Autolock _l(mLock);
+ updateUidStates_l();
+}
+
+void AudioPolicyService::updateUidStates_l()
+{
+ //TODO: implement real concurrent capture policy: for now just apply each app state directly
+ for (size_t i =0; i < mAudioRecordClients.size(); i++) {
+ sp<AudioRecordClient> current = mAudioRecordClients[i];
+ if (!current->active) continue;
+ setAppState_l(current->uid, apmStatFromAmState(mUidPolicy->getUidState(current->uid)));
+ }
+}
+
+/* static */
+app_state_t AudioPolicyService::apmStatFromAmState(int amState) {
+ switch (amState) {
+ case ActivityManager::PROCESS_STATE_UNKNOWN:
+ return APP_STATE_IDLE;
+ case ActivityManager::PROCESS_STATE_TOP:
+ return APP_STATE_TOP;
+ default:
+ break;
+ }
+ return APP_STATE_FOREGROUND;
+}
+
+void AudioPolicyService::setAppState_l(uid_t uid, app_state_t state)
+{
+ AutoCallerClear acc;
+
+ if (mAudioPolicyManager) {
+ mAudioPolicyManager->setAppState(uid, state);
}
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af) {
@@ -511,7 +538,8 @@
ActivityManager am;
am.registerUidObserver(this, ActivityManager::UID_OBSERVER_GONE
| ActivityManager::UID_OBSERVER_IDLE
- | ActivityManager::UID_OBSERVER_ACTIVE,
+ | ActivityManager::UID_OBSERVER_ACTIVE
+ | ActivityManager::UID_OBSERVER_PROCSTATE,
ActivityManager::PROCESS_STATE_UNKNOWN,
String16("audioserver"));
status_t res = am.linkToDeath(this);
@@ -538,8 +566,7 @@
mObserverRegistered = false;
}
-bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) {
- if (isServiceUid(uid)) return true;
+void AudioPolicyService::UidPolicy::checkRegistered() {
bool needToReregister = false;
{
Mutex::Autolock _l(mLock);
@@ -549,91 +576,157 @@
// Looks like ActivityManager has died previously, attempt to re-register.
registerSelf();
}
+}
+
+bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) {
+ if (isServiceUid(uid)) return true;
+ checkRegistered();
{
Mutex::Autolock _l(mLock);
auto overrideIter = mOverrideUids.find(uid);
if (overrideIter != mOverrideUids.end()) {
- return overrideIter->second;
+ return overrideIter->second.first;
}
// In an absense of the ActivityManager, assume everything to be active.
if (!mObserverRegistered) return true;
auto cacheIter = mCachedUids.find(uid);
if (cacheIter != mCachedUids.end()) {
- return cacheIter->second;
+ return cacheIter->second.first;
}
}
ActivityManager am;
bool active = am.isUidActive(uid, String16("audioserver"));
{
Mutex::Autolock _l(mLock);
- mCachedUids.insert(std::pair<uid_t, bool>(uid, active));
+ mCachedUids.insert(std::pair<uid_t,
+ std::pair<bool, int>>(uid, std::pair<bool, int>(active,
+ ActivityManager::PROCESS_STATE_UNKNOWN)));
}
return active;
}
+int AudioPolicyService::UidPolicy::getUidState(uid_t uid) {
+ if (isServiceUid(uid)) {
+ return ActivityManager::PROCESS_STATE_TOP;
+ }
+ checkRegistered();
+ {
+ Mutex::Autolock _l(mLock);
+ auto overrideIter = mOverrideUids.find(uid);
+ if (overrideIter != mOverrideUids.end()) {
+ if (overrideIter->second.first) {
+ if (overrideIter->second.second != ActivityManager::PROCESS_STATE_UNKNOWN) {
+ return overrideIter->second.second;
+ } else {
+ auto cacheIter = mCachedUids.find(uid);
+ if (cacheIter != mCachedUids.end()) {
+ return cacheIter->second.second;
+ }
+ }
+ }
+ return ActivityManager::PROCESS_STATE_UNKNOWN;
+ }
+ // In an absense of the ActivityManager, assume everything to be active.
+ if (!mObserverRegistered) {
+ return ActivityManager::PROCESS_STATE_TOP;
+ }
+ auto cacheIter = mCachedUids.find(uid);
+ if (cacheIter != mCachedUids.end()) {
+ if (cacheIter->second.first) {
+ return cacheIter->second.second;
+ } else {
+ return ActivityManager::PROCESS_STATE_UNKNOWN;
+ }
+ }
+ }
+ ActivityManager am;
+ bool active = am.isUidActive(uid, String16("audioserver"));
+ int state = ActivityManager::PROCESS_STATE_UNKNOWN;
+ if (active) {
+ state = am.getUidProcessState(uid, String16("audioserver"));
+ }
+ {
+ Mutex::Autolock _l(mLock);
+ mCachedUids.insert(std::pair<uid_t,
+ std::pair<bool, int>>(uid, std::pair<bool, int>(active, state)));
+ }
+ return state;
+}
+
void AudioPolicyService::UidPolicy::onUidActive(uid_t uid) {
- updateUidCache(uid, true, true);
+ updateUid(&mCachedUids, uid, true, ActivityManager::PROCESS_STATE_UNKNOWN, true);
}
void AudioPolicyService::UidPolicy::onUidGone(uid_t uid, __unused bool disabled) {
- updateUidCache(uid, false, false);
+ updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, false);
}
void AudioPolicyService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
- updateUidCache(uid, false, true);
+ updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, true);
}
-void AudioPolicyService::UidPolicy::notifyService(uid_t uid, bool active) {
- sp<AudioPolicyService> service = mService.promote();
- if (service != nullptr) {
- service->setAppState(uid, active ?
- APP_STATE_FOREGROUND :
- APP_STATE_IDLE);
+void AudioPolicyService::UidPolicy::onUidStateChanged(uid_t uid,
+ int32_t procState,
+ int64_t procStateSeq __unused) {
+ if (procState != ActivityManager::PROCESS_STATE_UNKNOWN) {
+ updateUid(&mCachedUids, uid, true, procState, true);
}
}
void AudioPolicyService::UidPolicy::updateOverrideUid(uid_t uid, bool active, bool insert) {
- if (isServiceUid(uid)) return;
- bool wasOverridden = false, wasActive = false;
- {
- Mutex::Autolock _l(mLock);
- updateUidLocked(&mOverrideUids, uid, active, insert, &wasOverridden, &wasActive);
- }
- if (!wasOverridden && insert) {
- notifyService(uid, active); // Started to override.
- } else if (wasOverridden && !insert) {
- notifyService(uid, isUidActive(uid)); // Override ceased, notify with ground truth.
- } else if (wasActive != active) {
- notifyService(uid, active); // Override updated.
+ updateUid(&mOverrideUids, uid, active, ActivityManager::PROCESS_STATE_UNKNOWN, insert);
+}
+
+void AudioPolicyService::UidPolicy::notifyService() {
+ sp<AudioPolicyService> service = mService.promote();
+ if (service != nullptr) {
+ service->updateUidStates();
}
}
-void AudioPolicyService::UidPolicy::updateUidCache(uid_t uid, bool active, bool insert) {
- if (isServiceUid(uid)) return;
- bool wasActive = false;
+void AudioPolicyService::UidPolicy::updateUid(std::unordered_map<uid_t,
+ std::pair<bool, int>> *uids,
+ uid_t uid,
+ bool active,
+ int state,
+ bool insert) {
+ if (isServiceUid(uid)) {
+ return;
+ }
+ bool wasActive = isUidActive(uid);
+ int previousState = getUidState(uid);
{
Mutex::Autolock _l(mLock);
- updateUidLocked(&mCachedUids, uid, active, insert, nullptr, &wasActive);
- // Do not notify service if currently overridden.
- if (mOverrideUids.find(uid) != mOverrideUids.end()) return;
+ updateUidLocked(uids, uid, active, state, insert);
}
- bool nowActive = active && insert;
- if (wasActive != nowActive) notifyService(uid, nowActive);
+ if (wasActive != isUidActive(uid) || state != previousState) {
+ notifyService();
+ }
}
-void AudioPolicyService::UidPolicy::updateUidLocked(std::unordered_map<uid_t, bool> *uids,
- uid_t uid, bool active, bool insert, bool *wasThere, bool *wasActive) {
+void AudioPolicyService::UidPolicy::updateUidLocked(std::unordered_map<uid_t,
+ std::pair<bool, int>> *uids,
+ uid_t uid,
+ bool active,
+ int state,
+ bool insert) {
auto it = uids->find(uid);
if (it != uids->end()) {
- if (wasThere != nullptr) *wasThere = true;
- if (wasActive != nullptr) *wasActive = it->second;
if (insert) {
- it->second = active;
+ if (state == ActivityManager::PROCESS_STATE_UNKNOWN) {
+ it->second.first = active;
+ }
+ if (it->second.first) {
+ it->second.second = state;
+ } else {
+ it->second.second = ActivityManager::PROCESS_STATE_UNKNOWN;
+ }
} else {
uids->erase(it);
}
- } else if (insert) {
- uids->insert(std::pair<uid_t, bool>(uid, active));
+ } else if (insert && (state == ActivityManager::PROCESS_STATE_UNKNOWN)) {
+ uids->insert(std::pair<uid_t, std::pair<bool, int>>(uid,
+ std::pair<bool, int>(active, state)));
}
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index ec32511..4d7235f 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -253,7 +253,7 @@
virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);
// Sets whether the given UID records only silence
- virtual void setAppState(uid_t uid, app_state_t state);
+ virtual void setAppState_l(uid_t uid, app_state_t state);
// Overrides the UID state as if it is idle
status_t handleSetUidState(Vector<String16>& args, int err);
@@ -271,6 +271,11 @@
status_t getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects);
+ app_state_t apmStatFromAmState(int amState);
+
+ void updateUidStates();
+ void updateUidStates_l();
+
// If recording we need to make sure the UID is allowed to do that. If the UID is idle
// then it cannot record and gets buffers with zeros - silence. As soon as the UID
// transitions to an active state we will start reporting buffers with data. This approach
@@ -289,6 +294,7 @@
void binderDied(const wp<IBinder> &who) override;
bool isUidActive(uid_t uid);
+ int getUidState(uid_t uid);
void setAssistantUid(uid_t uid) { mAssistantUid = uid; }
bool isAssistantUid(uid_t uid) { return uid == mAssistantUid; }
void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
@@ -298,22 +304,26 @@
void onUidActive(uid_t uid) override;
void onUidGone(uid_t uid, bool disabled) override;
void onUidIdle(uid_t uid, bool disabled) override;
+ void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq);
void addOverrideUid(uid_t uid, bool active) { updateOverrideUid(uid, active, true); }
void removeOverrideUid(uid_t uid) { updateOverrideUid(uid, false, false); }
- private:
- void notifyService(uid_t uid, bool active);
+ void updateUid(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
+ uid_t uid, bool active, int state, bool insert);
+
+ private:
+ void notifyService();
void updateOverrideUid(uid_t uid, bool active, bool insert);
- void updateUidCache(uid_t uid, bool active, bool insert);
- void updateUidLocked(std::unordered_map<uid_t, bool> *uids,
- uid_t uid, bool active, bool insert, bool *wasThere, bool *wasActive);
+ void updateUidLocked(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
+ uid_t uid, bool active, int state, bool insert);
+ void checkRegistered();
wp<AudioPolicyService> mService;
Mutex mLock;
bool mObserverRegistered;
- std::unordered_map<uid_t, bool> mOverrideUids;
- std::unordered_map<uid_t, bool> mCachedUids;
+ std::unordered_map<uid_t, std::pair<bool, int>> mOverrideUids;
+ std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
uid_t mAssistantUid;
std::vector<uid_t> mA11yUids;
};
diff --git a/services/audiopolicy/tests/Android.mk b/services/audiopolicy/tests/Android.mk
index 513312e..2ccb542 100644
--- a/services/audiopolicy/tests/Android.mk
+++ b/services/audiopolicy/tests/Android.mk
@@ -41,6 +41,9 @@
libmedia_helper \
libutils
+LOCAL_HEADER_LIBRARIES := \
+ libmedia_headers
+
LOCAL_SRC_FILES := \
systemaudio_tests.cpp \
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 064863f..d332f6e 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -536,6 +536,7 @@
void onUidGone(uid_t uid, bool disabled);
void onUidActive(uid_t uid);
void onUidIdle(uid_t uid, bool disabled);
+ void onUidStateChanged(uid_t uid __unused, int32_t procState __unused, int64_t procStateSeq __unused) {}
void addOverrideUid(uid_t uid, String16 callingPackage, bool active);
void removeOverrideUid(uid_t uid, String16 callingPackage);