Merge "add crash dump policies to mediaswcodec-arm.policy" into qt-dev
diff --git a/media/codec2/components/avc/C2SoftAvcEnc.h b/media/codec2/components/avc/C2SoftAvcEnc.h
index aa3ca61..58a86d8 100644
--- a/media/codec2/components/avc/C2SoftAvcEnc.h
+++ b/media/codec2/components/avc/C2SoftAvcEnc.h
@@ -38,7 +38,7 @@
#define DEFAULT_MAX_REORDER_FRM 0
#define DEFAULT_QP_MIN 10
#define DEFAULT_QP_MAX 40
-#define DEFAULT_MAX_BITRATE 20000000
+#define DEFAULT_MAX_BITRATE 240000000
#define DEFAULT_MAX_SRCH_RANGE_X 256
#define DEFAULT_MAX_SRCH_RANGE_Y 256
#define DEFAULT_MAX_FRAMERATE 120000
diff --git a/media/codec2/vndk/C2Store.cpp b/media/codec2/vndk/C2Store.cpp
index 10c4dcc..f5dc838 100644
--- a/media/codec2/vndk/C2Store.cpp
+++ b/media/codec2/vndk/C2Store.cpp
@@ -26,6 +26,7 @@
#include <C2Config.h>
#include <C2PlatformStorePluginLoader.h>
#include <C2PlatformSupport.h>
+#include <media/stagefright/foundation/ADebug.h>
#include <util/C2InterfaceHelper.h>
#include <dlfcn.h>
@@ -661,31 +662,37 @@
ALOGV("in %s", __func__);
ALOGV("loading dll");
mLibHandle = dlopen(libPath.c_str(), RTLD_NOW|RTLD_NODELETE);
- LOG_ALWAYS_FATAL_IF(mLibHandle == nullptr,
- "could not dlopen %s: %s", libPath.c_str(), dlerror());
+ if (mLibHandle == nullptr) {
+ LOG_ALWAYS_FATAL_IN_CHILD_PROC("could not dlopen %s: %s", libPath.c_str(), dlerror());
+ mInit = C2_CORRUPTED;
+ return mInit;
+ }
createFactory =
(C2ComponentFactory::CreateCodec2FactoryFunc)dlsym(mLibHandle, "CreateCodec2Factory");
- LOG_ALWAYS_FATAL_IF(createFactory == nullptr,
- "createFactory is null in %s", libPath.c_str());
+ if (createFactory == nullptr) {
+ LOG_ALWAYS_FATAL_IN_CHILD_PROC("createFactory is null in %s", libPath.c_str());
+ mInit = C2_CORRUPTED;
+ return mInit;
+ }
destroyFactory =
(C2ComponentFactory::DestroyCodec2FactoryFunc)dlsym(mLibHandle, "DestroyCodec2Factory");
- LOG_ALWAYS_FATAL_IF(destroyFactory == nullptr,
- "destroyFactory is null in %s", libPath.c_str());
+ if (destroyFactory == nullptr) {
+ LOG_ALWAYS_FATAL_IN_CHILD_PROC("destroyFactory is null in %s", libPath.c_str());
+ mInit = C2_CORRUPTED;
+ return mInit;
+ }
mComponentFactory = createFactory();
if (mComponentFactory == nullptr) {
ALOGD("could not create factory in %s", libPath.c_str());
mInit = C2_NO_MEMORY;
- } else {
- mInit = C2_OK;
- }
-
- if (mInit != C2_OK) {
return mInit;
}
+ mInit = C2_OK;
+
std::shared_ptr<C2ComponentInterface> intf;
c2_status_t res = createInterface(0, &intf);
if (res != C2_OK) {
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index 0cce5bc..a1b04ca 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -177,7 +177,7 @@
}
// No lock here: worst case we remove a NULL callback which will be a nop
if (mDeviceCallback != 0 && mInput != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::removeAudioDeviceCallback(this, mInput);
+ AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId);
}
IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this);
mAudioRecord.clear();
@@ -790,14 +790,13 @@
mAudioRecord = record;
mCblkMemory = output.cblk;
mBufferMemory = output.buffers;
- 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__, mPortId,
+ __func__, output.portId,
mReqFrameCount, output.frameCount);
}
@@ -805,19 +804,20 @@
// 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__, mPortId,
+ __func__, output.portId,
mNotificationFramesReq, output.notificationFrameCount, output.frameCount);
}
mNotificationFramesAct = (uint32_t)output.notificationFrameCount;
//mInput != input includes the case where mInput == AUDIO_IO_HANDLE_NONE for first creation
- if (mDeviceCallback != 0 && mInput != output.inputId) {
+ if (mDeviceCallback != 0) {
if (mInput != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::removeAudioDeviceCallback(this, mInput);
+ AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId);
}
- AudioSystem::addAudioDeviceCallback(this, output.inputId);
+ AudioSystem::addAudioDeviceCallback(this, output.inputId, output.portId);
}
+ mPortId = output.portId;
// We retain a copy of the I/O handle, but don't own the reference
mInput = output.inputId;
mRefreshRemaining = true;
@@ -1332,9 +1332,9 @@
if (mInput != AUDIO_IO_HANDLE_NONE) {
if (mDeviceCallback != 0) {
ALOGW("%s(%d): callback already present!", __func__, mPortId);
- AudioSystem::removeAudioDeviceCallback(this, mInput);
+ AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId);
}
- status = AudioSystem::addAudioDeviceCallback(this, mInput);
+ status = AudioSystem::addAudioDeviceCallback(this, mInput, mPortId);
}
mDeviceCallback = callback;
return status;
@@ -1354,7 +1354,7 @@
}
mDeviceCallback.clear();
if (mInput != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::removeAudioDeviceCallback(this, mInput);
+ AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId);
}
return NO_ERROR;
}
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index 47e2c28..d359f52 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -523,12 +523,10 @@
if (ioDesc == 0 || ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return;
audio_port_handle_t deviceId = AUDIO_PORT_HANDLE_NONE;
- Vector<sp<AudioDeviceCallback>> callbacksToCall;
+ std::vector<sp<AudioDeviceCallback>> callbacksToCall;
{
Mutex::Autolock _l(mLock);
- bool deviceValidOrChanged = false;
- bool sendCallbacks = false;
- ssize_t ioIndex = -1;
+ auto callbacks = std::map<audio_port_handle_t, wp<AudioDeviceCallback>>();
switch (event) {
case AUDIO_OUTPUT_OPENED:
@@ -546,17 +544,11 @@
if (ioDesc->getDeviceId() != AUDIO_PORT_HANDLE_NONE) {
deviceId = ioDesc->getDeviceId();
if (event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED) {
- ioIndex = mAudioDeviceCallbackProxies.indexOfKey(ioDesc->mIoHandle);
- if (ioIndex >= 0) {
- sendCallbacks = true;
- deviceValidOrChanged = true;
+ auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
+ if (it != mAudioDeviceCallbacks.end()) {
+ callbacks = it->second;
}
}
- if (event == AUDIO_OUTPUT_REGISTERED || event == AUDIO_INPUT_REGISTERED) {
- ioIndex = mAudioDeviceCallbackProxies.indexOfKey(ioDesc->mIoHandle);
- sendCallbacks = (ioIndex >= 0)
- && !mAudioDeviceCallbackProxies.valueAt(ioIndex).notifiedOnce();
- }
}
ALOGV("ioConfigChanged() new %s %s %d samplingRate %u, format %#x channel mask %#x "
"frameCount %zu deviceId %d",
@@ -578,7 +570,7 @@
event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle);
mIoDescriptors.removeItem(ioDesc->mIoHandle);
- mAudioDeviceCallbackProxies.removeItem(ioDesc->mIoHandle);
+ mAudioDeviceCallbacks.erase(ioDesc->mIoHandle);
} break;
case AUDIO_OUTPUT_CONFIG_CHANGED:
@@ -593,10 +585,11 @@
mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc);
if (deviceId != ioDesc->getDeviceId()) {
- deviceValidOrChanged = true;
deviceId = ioDesc->getDeviceId();
- ioIndex = mAudioDeviceCallbackProxies.indexOfKey(ioDesc->mIoHandle);
- sendCallbacks = ioIndex >= 0;
+ auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
+ if (it != mAudioDeviceCallbacks.end()) {
+ callbacks = it->second;
+ }
}
ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x "
"channel mask %#x frameCount %zu frameCountHAL %zu deviceId %d",
@@ -606,35 +599,40 @@
ioDesc->getDeviceId());
} break;
- }
-
- // sendCallbacks true => ioDesc->mIoHandle and deviceId are valid
- if (sendCallbacks) {
- AudioDeviceCallbackProxies &callbackProxies =
- mAudioDeviceCallbackProxies.editValueAt(ioIndex);
- for (size_t i = 0; i < callbackProxies.size(); ) {
- sp<AudioDeviceCallback> callback = callbackProxies[i]->callback();
- if (callback.get() != nullptr) {
- // Call the callback only if the device actually changed, the input or output
- // was opened or closed or the client was newly registered and the callback
- // was never called
- if (!callbackProxies[i]->notifiedOnce() || deviceValidOrChanged) {
- callbacksToCall.add(callback);
- callbackProxies[i]->setNotifiedOnce();
- }
- i++;
- } else {
- callbackProxies.removeAt(i);
+ case AUDIO_CLIENT_STARTED: {
+ sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle);
+ if (oldDesc == 0) {
+ ALOGW("ioConfigChanged() start client on unknown io! %d", ioDesc->mIoHandle);
+ break;
+ }
+ ALOGV("ioConfigChanged() AUDIO_CLIENT_STARTED io %d port %d num callbacks %zu",
+ ioDesc->mIoHandle, ioDesc->mPortId, mAudioDeviceCallbacks.size());
+ oldDesc->mPatch = ioDesc->mPatch;
+ auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle);
+ if (it != mAudioDeviceCallbacks.end()) {
+ auto cbks = it->second;
+ auto it2 = cbks.find(ioDesc->mPortId);
+ if (it2 != cbks.end()) {
+ callbacks.emplace(ioDesc->mPortId, it2->second);
+ deviceId = oldDesc->getDeviceId();
}
}
- callbackProxies.setNotifiedOnce();
+ } break;
+ }
+
+ for (auto wpCbk : callbacks) {
+ sp<AudioDeviceCallback> spCbk = wpCbk.second.promote();
+ if (spCbk != nullptr) {
+ callbacksToCall.push_back(spCbk);
+ }
}
}
// Callbacks must be called without mLock held. May lead to dead lock if calling for
// example getRoutedDevice that updates the device and tries to acquire mLock.
- for (size_t i = 0; i < callbacksToCall.size(); i++) {
- callbacksToCall[i]->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId);
+ for (auto cb : callbacksToCall) {
+ // If callbacksToCall is not empty, it implies ioDesc->mIoHandle and deviceId are valid
+ cb->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId);
}
}
@@ -687,51 +685,34 @@
}
status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback(
- const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo)
+ const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
+ audio_port_handle_t portId)
{
+ ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
Mutex::Autolock _l(mLock);
- AudioDeviceCallbackProxies callbackProxies;
- ssize_t ioIndex = mAudioDeviceCallbackProxies.indexOfKey(audioIo);
- if (ioIndex >= 0) {
- callbackProxies = mAudioDeviceCallbackProxies.valueAt(ioIndex);
+ auto& callbacks = mAudioDeviceCallbacks.emplace(audioIo, std::map<audio_port_handle_t, wp<AudioDeviceCallback>>()).first->second;
+ auto result = callbacks.try_emplace(portId, callback);
+ if (!result.second) {
+ return INVALID_OPERATION;
}
-
- for (size_t cbIndex = 0; cbIndex < callbackProxies.size(); cbIndex++) {
- sp<AudioDeviceCallback> cbk = callbackProxies[cbIndex]->callback();
- if (cbk.get() == callback.unsafe_get()) {
- return INVALID_OPERATION;
- }
- }
- callbackProxies.add(new AudioDeviceCallbackProxy(callback));
- callbackProxies.resetNotifiedOnce();
- mAudioDeviceCallbackProxies.replaceValueFor(audioIo, callbackProxies);
return NO_ERROR;
}
status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback(
- const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo)
+ const wp<AudioDeviceCallback>& callback __unused, audio_io_handle_t audioIo,
+ audio_port_handle_t portId)
{
+ ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
Mutex::Autolock _l(mLock);
- ssize_t ioIndex = mAudioDeviceCallbackProxies.indexOfKey(audioIo);
- if (ioIndex < 0) {
+ auto it = mAudioDeviceCallbacks.find(audioIo);
+ if (it == mAudioDeviceCallbacks.end()) {
return INVALID_OPERATION;
}
- AudioDeviceCallbackProxies callbackProxies = mAudioDeviceCallbackProxies.valueAt(ioIndex);
- size_t cbIndex;
- for (cbIndex = 0; cbIndex < callbackProxies.size(); cbIndex++) {
- sp<AudioDeviceCallback> cbk = callbackProxies[cbIndex]->callback();
- if (cbk.get() == callback.unsafe_get()) {
- break;
- }
- }
- if (cbIndex == callbackProxies.size()) {
+ if (it->second.erase(portId) == 0) {
return INVALID_OPERATION;
}
- callbackProxies.removeAt(cbIndex);
- if (callbackProxies.size() != 0) {
- mAudioDeviceCallbackProxies.replaceValueFor(audioIo, callbackProxies);
- } else {
- mAudioDeviceCallbackProxies.removeItem(audioIo);
+ if (it->second.size() == 0) {
+ mAudioDeviceCallbacks.erase(audioIo);
}
return NO_ERROR;
}
@@ -1271,13 +1252,14 @@
}
status_t AudioSystem::addAudioDeviceCallback(
- const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo)
+ const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
+ audio_port_handle_t portId)
{
const sp<AudioFlingerClient> afc = getAudioFlingerClient();
if (afc == 0) {
return NO_INIT;
}
- status_t status = afc->addAudioDeviceCallback(callback, audioIo);
+ status_t status = afc->addAudioDeviceCallback(callback, audioIo, portId);
if (status == NO_ERROR) {
const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
if (af != 0) {
@@ -1288,13 +1270,14 @@
}
status_t AudioSystem::removeAudioDeviceCallback(
- const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo)
+ const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
+ audio_port_handle_t portId)
{
const sp<AudioFlingerClient> afc = getAudioFlingerClient();
if (afc == 0) {
return NO_INIT;
}
- return afc->removeAudioDeviceCallback(callback, audioIo);
+ return afc->removeAudioDeviceCallback(callback, audioIo, portId);
}
audio_port_handle_t AudioSystem::getDeviceIdForIo(audio_io_handle_t audioIo)
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index bd48f56..9387d4d 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -309,7 +309,7 @@
}
// No lock here: worst case we remove a NULL callback which will be a nop
if (mDeviceCallback != 0 && mOutput != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::removeAudioDeviceCallback(this, mOutput);
+ AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
}
IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
mAudioTrack.clear();
@@ -1495,7 +1495,6 @@
mAfFrameCount = output.afFrameCount;
mAfSampleRate = output.afSampleRate;
mAfLatency = output.afLatencyMs;
- mPortId = output.portId;
mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate;
@@ -1543,14 +1542,15 @@
mFlags = output.flags;
//mOutput != output includes the case where mOutput == AUDIO_IO_HANDLE_NONE for first creation
- if (mDeviceCallback != 0 && mOutput != output.outputId) {
+ if (mDeviceCallback != 0) {
if (mOutput != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::removeAudioDeviceCallback(this, mOutput);
+ AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
}
- AudioSystem::addAudioDeviceCallback(this, output.outputId);
+ AudioSystem::addAudioDeviceCallback(this, output.outputId, output.portId);
callbackAdded = true;
}
+ mPortId = output.portId;
// We retain a copy of the I/O handle, but don't own the reference
mOutput = output.outputId;
mRefreshRemaining = true;
@@ -1615,7 +1615,7 @@
exit:
if (status != NO_ERROR && callbackAdded) {
// note: mOutput is always valid is callbackAdded is true
- AudioSystem::removeAudioDeviceCallback(this, mOutput);
+ AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
}
mStatus = status;
@@ -2922,6 +2922,7 @@
status_t AudioTrack::addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback)
{
+
if (callback == 0) {
ALOGW("%s(%d): adding NULL callback!", __func__, mPortId);
return BAD_VALUE;
@@ -2935,9 +2936,9 @@
if (mOutput != AUDIO_IO_HANDLE_NONE) {
if (mDeviceCallback != 0) {
ALOGW("%s(%d): callback already present!", __func__, mPortId);
- AudioSystem::removeAudioDeviceCallback(this, mOutput);
+ AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
}
- status = AudioSystem::addAudioDeviceCallback(this, mOutput);
+ status = AudioSystem::addAudioDeviceCallback(this, mOutput, mPortId);
}
mDeviceCallback = callback;
return status;
@@ -2957,7 +2958,7 @@
}
mDeviceCallback.clear();
if (mOutput != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::removeAudioDeviceCallback(this, mOutput);
+ AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
}
return NO_ERROR;
}
@@ -2979,6 +2980,7 @@
mRoutedDeviceId = deviceId;
}
}
+
if (callback.get() != nullptr) {
callback->onAudioDeviceUpdate(mOutput, mRoutedDeviceId);
}
diff --git a/media/libaudioclient/IAudioFlingerClient.cpp b/media/libaudioclient/IAudioFlingerClient.cpp
index b2dbc4c..47eb7dc 100644
--- a/media/libaudioclient/IAudioFlingerClient.cpp
+++ b/media/libaudioclient/IAudioFlingerClient.cpp
@@ -52,6 +52,7 @@
data.writeInt64(ioDesc->mFrameCount);
data.writeInt64(ioDesc->mFrameCountHAL);
data.writeInt32(ioDesc->mLatency);
+ data.writeInt32(ioDesc->mPortId);
remote()->transact(IO_CONFIG_CHANGED, data, &reply, IBinder::FLAG_ONEWAY);
}
};
@@ -76,6 +77,7 @@
ioDesc->mFrameCount = data.readInt64();
ioDesc->mFrameCountHAL = data.readInt64();
ioDesc->mLatency = data.readInt32();
+ ioDesc->mPortId = data.readInt32();
ioConfigChanged(event, ioDesc);
return NO_ERROR;
} break;
diff --git a/media/libaudioclient/include/media/AudioIoDescriptor.h b/media/libaudioclient/include/media/AudioIoDescriptor.h
index 859f1a9..981d33a 100644
--- a/media/libaudioclient/include/media/AudioIoDescriptor.h
+++ b/media/libaudioclient/include/media/AudioIoDescriptor.h
@@ -28,6 +28,7 @@
AUDIO_INPUT_OPENED,
AUDIO_INPUT_CLOSED,
AUDIO_INPUT_CONFIG_CHANGED,
+ AUDIO_CLIENT_STARTED,
};
// audio input/output descriptor used to cache output configurations in client process to avoid
@@ -37,7 +38,7 @@
AudioIoDescriptor() :
mIoHandle(AUDIO_IO_HANDLE_NONE),
mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), mChannelMask(AUDIO_CHANNEL_NONE),
- mFrameCount(0), mFrameCountHAL(0), mLatency(0)
+ mFrameCount(0), mFrameCountHAL(0), mLatency(0), mPortId(AUDIO_PORT_HANDLE_NONE)
{
memset(&mPatch, 0, sizeof(struct audio_patch));
}
@@ -66,6 +67,7 @@
size_t mFrameCount;
size_t mFrameCountHAL;
uint32_t mLatency; // only valid for output
+ audio_port_handle_t mPortId; // valid for event AUDIO_CLIENT_STARTED
};
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index d3035da..f79ec21 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -438,32 +438,12 @@
audio_port_handle_t deviceId) = 0;
};
- class AudioDeviceCallbackProxy : public RefBase
- {
- public:
-
- AudioDeviceCallbackProxy(wp<AudioDeviceCallback> callback)
- : mCallback(callback) {}
- ~AudioDeviceCallbackProxy() override {}
-
- sp<AudioDeviceCallback> callback() const { return mCallback.promote(); };
-
- bool notifiedOnce() const { return mNotifiedOnce; }
- void setNotifiedOnce() { mNotifiedOnce = true; }
- private:
- /**
- * @brief mNotifiedOnce it forces the callback to be called at least once when
- * registered with a VALID AudioDevice, and allows not to flood other listeners
- * on this iohandle that already know the valid device.
- */
- bool mNotifiedOnce = false;
- wp<AudioDeviceCallback> mCallback;
- };
-
static status_t addAudioDeviceCallback(const wp<AudioDeviceCallback>& callback,
- audio_io_handle_t audioIo);
+ audio_io_handle_t audioIo,
+ audio_port_handle_t portId);
static status_t removeAudioDeviceCallback(const wp<AudioDeviceCallback>& callback,
- audio_io_handle_t audioIo);
+ audio_io_handle_t audioIo,
+ audio_port_handle_t portId);
static audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo);
@@ -494,9 +474,11 @@
status_t addAudioDeviceCallback(const wp<AudioDeviceCallback>& callback,
- audio_io_handle_t audioIo);
+ audio_io_handle_t audioIo,
+ audio_port_handle_t portId);
status_t removeAudioDeviceCallback(const wp<AudioDeviceCallback>& callback,
- audio_io_handle_t audioIo);
+ audio_io_handle_t audioIo,
+ audio_port_handle_t portId);
audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo);
@@ -504,26 +486,8 @@
Mutex mLock;
DefaultKeyedVector<audio_io_handle_t, sp<AudioIoDescriptor> > mIoDescriptors;
- class AudioDeviceCallbackProxies : public Vector<sp<AudioDeviceCallbackProxy>>
- {
- public:
- /**
- * @brief notifiedOnce ensures that if a client adds a callback, it must at least be
- * called once with the device on which it will be routed to.
- * @return true if already notified or nobody waits for a callback, false otherwise.
- */
- bool notifiedOnce() const { return (size() == 0) || mNotifiedOnce; }
- void setNotifiedOnce() { mNotifiedOnce = true; }
- void resetNotifiedOnce() { mNotifiedOnce = false; }
- private:
- /**
- * @brief mNotifiedOnce it forces each callback to be called at least once when
- * registered with a VALID AudioDevice
- */
- bool mNotifiedOnce = false;
- };
- DefaultKeyedVector<audio_io_handle_t, AudioDeviceCallbackProxies>
- mAudioDeviceCallbackProxies;
+ std::map<audio_io_handle_t, std::map<audio_port_handle_t, wp<AudioDeviceCallback>>>
+ mAudioDeviceCallbacks;
// cached values for recording getInputBufferSize() queries
size_t mInBuffSize; // zero indicates cache is invalid
uint32_t mInSamplingRate;
diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp
index d97591f..81d2abb 100644
--- a/media/libstagefright/MediaExtractorFactory.cpp
+++ b/media/libstagefright/MediaExtractorFactory.cpp
@@ -19,11 +19,11 @@
#include <utils/Log.h>
#include <android/dlext.h>
-#include <android-base/logging.h>
#include <binder/IPCThreadState.h>
#include <binder/PermissionCache.h>
#include <binder/IServiceManager.h>
#include <media/DataSource.h>
+#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/InterfaceUtils.h>
#include <media/stagefright/MediaExtractor.h>
#include <media/stagefright/MediaExtractorFactory.h>
@@ -245,17 +245,21 @@
void *libHandle = android_dlopen_ext(
libPath.string(),
RTLD_NOW | RTLD_LOCAL, dlextinfo);
- CHECK(libHandle != nullptr)
- << "couldn't dlopen(" << libPath.string() << ") " << strerror(errno);
-
- GetExtractorDef getDef =
- (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF");
- CHECK(getDef != nullptr)
- << libPath.string() << " does not contain sniffer";
-
- ALOGV("registering sniffer for %s", libPath.string());
- RegisterExtractor(
- new ExtractorPlugin(getDef(), libHandle, libPath), pluginList);
+ if (libHandle) {
+ GetExtractorDef getDef =
+ (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF");
+ if (getDef) {
+ ALOGV("registering sniffer for %s", libPath.string());
+ RegisterExtractor(
+ new ExtractorPlugin(getDef(), libHandle, libPath), pluginList);
+ } else {
+ LOG_ALWAYS_FATAL_IN_CHILD_PROC("%s does not contain sniffer", libPath.string());
+ dlclose(libHandle);
+ }
+ } else {
+ LOG_ALWAYS_FATAL_IN_CHILD_PROC(
+ "couldn't dlopen(%s) %s", libPath.string(), strerror(errno));
+ }
}
closedir(libDir);
} else {
diff --git a/media/libstagefright/codecs/avcenc/SoftAVCEnc.h b/media/libstagefright/codecs/avcenc/SoftAVCEnc.h
index 8253b7d..6d2e084 100644
--- a/media/libstagefright/codecs/avcenc/SoftAVCEnc.h
+++ b/media/libstagefright/codecs/avcenc/SoftAVCEnc.h
@@ -36,7 +36,7 @@
#define DEFAULT_MAX_REORDER_FRM 0
#define DEFAULT_QP_MIN 10
#define DEFAULT_QP_MAX 40
-#define DEFAULT_MAX_BITRATE 20000000
+#define DEFAULT_MAX_BITRATE 240000000
#define DEFAULT_MAX_SRCH_RANGE_X 256
#define DEFAULT_MAX_SRCH_RANGE_Y 256
#define DEFAULT_MAX_FRAMERATE 120000
diff --git a/media/libstagefright/foundation/include/media/stagefright/foundation/ADebug.h b/media/libstagefright/foundation/include/media/stagefright/foundation/ADebug.h
index a8b88fd..180694b 100644
--- a/media/libstagefright/foundation/include/media/stagefright/foundation/ADebug.h
+++ b/media/libstagefright/foundation/include/media/stagefright/foundation/ADebug.h
@@ -123,6 +123,15 @@
#define TRESPASS_DBG(...)
#endif
+#ifndef LOG_ALWAYS_FATAL_IN_CHILD_PROC
+#define LOG_ALWAYS_FATAL_IN_CHILD_PROC(...) \
+ do { \
+ if (fork() == 0) { \
+ LOG_ALWAYS_FATAL(__VA_ARGS__); \
+ } \
+ } while (false)
+#endif
+
struct ADebug {
enum Level {
kDebugNone, // no debug
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 0f03b7e..5e5ea11 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -701,8 +701,8 @@
updatePid = true;
}
pid_t clientPid = input.clientInfo.clientPid;
+ const pid_t callingPid = IPCThreadState::self()->getCallingPid();
if (updatePid) {
- const pid_t callingPid = IPCThreadState::self()->getCallingPid();
ALOGW_IF(clientPid != -1 && clientPid != callingPid,
"%s uid %d pid %d tried to pass itself off as pid %d",
__func__, callingUid, callingPid, clientPid);
@@ -787,7 +787,8 @@
&output.frameCount, &output.notificationFrameCount,
input.notificationsPerBuffer, input.speed,
input.sharedBuffer, sessionId, &output.flags,
- input.clientInfo.clientTid, clientUid, &lStatus, portId);
+ callingPid, input.clientInfo.clientTid, clientUid,
+ &lStatus, portId);
LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (track == 0));
// we don't abort yet if lStatus != NO_ERROR; there is still work to be done regardless
@@ -1841,8 +1842,8 @@
updatePid = true;
}
pid_t clientPid = input.clientInfo.clientPid;
+ const pid_t callingPid = IPCThreadState::self()->getCallingPid();
if (updatePid) {
- const pid_t callingPid = IPCThreadState::self()->getCallingPid();
ALOGW_IF(clientPid != -1 && clientPid != callingPid,
"%s uid %d pid %d tried to pass itself off as pid %d",
__func__, callingUid, callingPid, clientPid);
@@ -1919,7 +1920,7 @@
input.config.format, input.config.channel_mask,
&output.frameCount, sessionId,
&output.notificationFrameCount,
- clientUid, &output.flags,
+ callingPid, clientUid, &output.flags,
input.clientInfo.clientTid,
&lStatus, portId);
LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0));
diff --git a/services/audioflinger/MmapTracks.h b/services/audioflinger/MmapTracks.h
index 968d5aa..b83f6b5 100644
--- a/services/audioflinger/MmapTracks.h
+++ b/services/audioflinger/MmapTracks.h
@@ -31,6 +31,7 @@
bool isOut,
uid_t uid,
pid_t pid,
+ pid_t creatorPid,
audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
virtual ~MmapTrack();
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index 56be433..bb97f8d 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -69,6 +69,7 @@
size_t bufferSize,
const sp<IMemory>& sharedBuffer,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t uid,
audio_output_flags_t flags,
track_type type,
diff --git a/services/audioflinger/RecordTracks.h b/services/audioflinger/RecordTracks.h
index ec1f86c..08660dd 100644
--- a/services/audioflinger/RecordTracks.h
+++ b/services/audioflinger/RecordTracks.h
@@ -32,6 +32,7 @@
void *buffer,
size_t bufferSize,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t uid,
audio_input_flags_t flags,
track_type type,
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index fd29f31..0c6cfa1 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -566,14 +566,16 @@
return status;
}
-void AudioFlinger::ThreadBase::sendIoConfigEvent(audio_io_config_event event, pid_t pid)
+void AudioFlinger::ThreadBase::sendIoConfigEvent(audio_io_config_event event, pid_t pid,
+ audio_port_handle_t portId)
{
Mutex::Autolock _l(mLock);
- sendIoConfigEvent_l(event, pid);
+ sendIoConfigEvent_l(event, pid, portId);
}
// sendIoConfigEvent_l() must be called with ThreadBase::mLock held
-void AudioFlinger::ThreadBase::sendIoConfigEvent_l(audio_io_config_event event, pid_t pid)
+void AudioFlinger::ThreadBase::sendIoConfigEvent_l(audio_io_config_event event, pid_t pid,
+ audio_port_handle_t portId)
{
// The audio statistics history is exponentially weighted to forget events
// about five or more seconds in the past. In order to have
@@ -584,7 +586,7 @@
mProcessTimeMs.reset();
mTimestampVerifier.discontinuity();
- sp<ConfigEvent> configEvent = (ConfigEvent *)new IoConfigEvent(event, pid);
+ sp<ConfigEvent> configEvent = (ConfigEvent *)new IoConfigEvent(event, pid, portId);
sendConfigEvent_l(configEvent);
}
@@ -667,7 +669,7 @@
} break;
case CFG_EVENT_IO: {
IoConfigEventData *data = (IoConfigEventData *)event->mData.get();
- ioConfigChanged(data->mEvent, data->mPid);
+ ioConfigChanged(data->mEvent, data->mPid, data->mPortId);
} break;
case CFG_EVENT_SET_PARAMETER: {
SetParameterConfigEventData *data = (SetParameterConfigEventData *)event->mData.get();
@@ -1952,6 +1954,7 @@
const sp<IMemory>& sharedBuffer,
audio_session_t sessionId,
audio_output_flags_t *flags,
+ pid_t creatorPid,
pid_t tid,
uid_t uid,
status_t *status,
@@ -2235,7 +2238,7 @@
track = new Track(this, client, streamType, attr, sampleRate, format,
channelMask, frameCount,
nullptr /* buffer */, (size_t)0 /* bufferSize */, sharedBuffer,
- sessionId, uid, *flags, TrackBase::TYPE_DEFAULT, portId);
+ sessionId, creatorPid, uid, *flags, TrackBase::TYPE_DEFAULT, portId);
lStatus = track != 0 ? track->initCheck() : (status_t) NO_MEMORY;
if (lStatus != NO_ERROR) {
@@ -2391,6 +2394,7 @@
// to track the speaker usage
addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStart);
#endif
+ sendIoConfigEvent_l(AUDIO_CLIENT_STARTED, track->creatorPid(), track->portId());
}
// set retry count for buffer fill
@@ -2499,7 +2503,8 @@
return mOutput->stream->selectPresentation(presentationId, programId);
}
-void AudioFlinger::PlaybackThread::ioConfigChanged(audio_io_config_event event, pid_t pid) {
+void AudioFlinger::PlaybackThread::ioConfigChanged(audio_io_config_event event, pid_t pid,
+ audio_port_handle_t portId) {
sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
ALOGV("PlaybackThread::ioConfigChanged, thread %p, event %d", this, event);
@@ -2518,7 +2523,10 @@
desc->mFrameCountHAL = mFrameCount;
desc->mLatency = latency_l();
break;
-
+ case AUDIO_CLIENT_STARTED:
+ desc->mPatch = mPatch;
+ desc->mPortId = portId;
+ break;
case AUDIO_OUTPUT_CLOSED:
default:
break;
@@ -7405,6 +7413,7 @@
size_t *pFrameCount,
audio_session_t sessionId,
size_t *pNotificationFrameCount,
+ pid_t creatorPid,
uid_t uid,
audio_input_flags_t *flags,
pid_t tid,
@@ -7542,7 +7551,7 @@
track = new RecordTrack(this, client, attr, sampleRate,
format, channelMask, frameCount,
- nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, uid,
+ nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, creatorPid, uid,
*flags, TrackBase::TYPE_DEFAULT, portId);
lStatus = track->initCheck();
@@ -7650,6 +7659,8 @@
recordTrack->clearSyncStartEvent();
return status;
}
+ sendIoConfigEvent_l(
+ AUDIO_CLIENT_STARTED, recordTrack->creatorPid(), recordTrack->portId());
}
// Catch up with current buffer indices if thread is already running.
// This is what makes a new client discard all buffered data. If the track's mRsmpInFront
@@ -8131,7 +8142,8 @@
return String8();
}
-void AudioFlinger::RecordThread::ioConfigChanged(audio_io_config_event event, pid_t pid) {
+void AudioFlinger::RecordThread::ioConfigChanged(audio_io_config_event event, pid_t pid,
+ audio_port_handle_t portId) {
sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
desc->mIoHandle = mId;
@@ -8148,7 +8160,10 @@
desc->mFrameCountHAL = mFrameCount;
desc->mLatency = 0;
break;
-
+ case AUDIO_CLIENT_STARTED:
+ desc->mPatch = mPatch;
+ desc->mPortId = portId;
+ break;
case AUDIO_INPUT_CLOSED:
default:
break;
@@ -8606,7 +8621,8 @@
// Given that MmapThread::mAttr is mutable, should a MmapTrack have attributes ?
sp<MmapTrack> track = new MmapTrack(this, mAttr, mSampleRate, mFormat, mChannelMask, mSessionId,
- isOutput(), client.clientUid, client.clientPid, portId);
+ isOutput(), client.clientUid, client.clientPid,
+ IPCThreadState::self()->getCallingPid(), portId);
if (isOutput()) {
// force volume update when a new track is added
@@ -8832,7 +8848,8 @@
return String8();
}
-void AudioFlinger::MmapThread::ioConfigChanged(audio_io_config_event event, pid_t pid) {
+void AudioFlinger::MmapThread::ioConfigChanged(audio_io_config_event event, pid_t pid,
+ audio_port_handle_t portId __unused) {
sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
desc->mIoHandle = mId;
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 37b2d08..336c2b4 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -103,8 +103,9 @@
class IoConfigEventData : public ConfigEventData {
public:
- IoConfigEventData(audio_io_config_event event, pid_t pid) :
- mEvent(event), mPid(pid) {}
+ IoConfigEventData(audio_io_config_event event, pid_t pid,
+ audio_port_handle_t portId) :
+ mEvent(event), mPid(pid), mPortId(portId) {}
virtual void dump(char *buffer, size_t size) {
snprintf(buffer, size, "IO event: event %d\n", mEvent);
@@ -112,13 +113,14 @@
const audio_io_config_event mEvent;
const pid_t mPid;
+ const audio_port_handle_t mPortId;
};
class IoConfigEvent : public ConfigEvent {
public:
- IoConfigEvent(audio_io_config_event event, pid_t pid) :
+ IoConfigEvent(audio_io_config_event event, pid_t pid, audio_port_handle_t portId) :
ConfigEvent(CFG_EVENT_IO) {
- mData = new IoConfigEventData(event, pid);
+ mData = new IoConfigEventData(event, pid, portId);
}
virtual ~IoConfigEvent() {}
};
@@ -260,13 +262,16 @@
status_t& status) = 0;
virtual status_t setParameters(const String8& keyValuePairs);
virtual String8 getParameters(const String8& keys) = 0;
- virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0) = 0;
+ virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
+ audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE) = 0;
// sendConfigEvent_l() must be called with ThreadBase::mLock held
// Can temporarily release the lock if waiting for a reply from
// processConfigEvents_l().
status_t sendConfigEvent_l(sp<ConfigEvent>& event);
- void sendIoConfigEvent(audio_io_config_event event, pid_t pid = 0);
- void sendIoConfigEvent_l(audio_io_config_event event, pid_t pid = 0);
+ void sendIoConfigEvent(audio_io_config_event event, pid_t pid = 0,
+ audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
+ void sendIoConfigEvent_l(audio_io_config_event event, pid_t pid = 0,
+ audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
void sendPrioConfigEvent(pid_t pid, pid_t tid, int32_t prio, bool forApp);
void sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio, bool forApp);
status_t sendSetParameterConfigEvent_l(const String8& keyValuePair);
@@ -802,6 +807,7 @@
const sp<IMemory>& sharedBuffer,
audio_session_t sessionId,
audio_output_flags_t *flags,
+ pid_t creatorPid,
pid_t tid,
uid_t uid,
status_t *status /*non-NULL*/,
@@ -825,7 +831,8 @@
{ return android_atomic_acquire_load(&mSuspended) > 0; }
virtual String8 getParameters(const String8& keys);
- virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0);
+ virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
+ audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
// Consider also removing and passing an explicit mMainBuffer initialization
// parameter to AF::PlaybackThread::Track::Track().
@@ -1540,6 +1547,7 @@
size_t *pFrameCount,
audio_session_t sessionId,
size_t *pNotificationFrameCount,
+ pid_t creatorPid,
uid_t uid,
audio_input_flags_t *flags,
pid_t tid,
@@ -1562,7 +1570,8 @@
status_t& status);
virtual void cacheParameters_l() {}
virtual String8 getParameters(const String8& keys);
- virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0);
+ virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
+ audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
virtual status_t createAudioPatch_l(const struct audio_patch *patch,
audio_patch_handle_t *handle);
virtual status_t releaseAudioPatch_l(const audio_patch_handle_t handle);
@@ -1743,7 +1752,8 @@
virtual bool checkForNewParameter_l(const String8& keyValuePair,
status_t& status);
virtual String8 getParameters(const String8& keys);
- virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0);
+ virtual void ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
+ audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
void readHalParameters_l();
virtual void cacheParameters_l() {}
virtual status_t createAudioPatch_l(const struct audio_patch *patch,
diff --git a/services/audioflinger/TrackBase.h b/services/audioflinger/TrackBase.h
index 4402d99..8f720b5 100644
--- a/services/audioflinger/TrackBase.h
+++ b/services/audioflinger/TrackBase.h
@@ -64,6 +64,7 @@
void *buffer,
size_t bufferSize,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t uid,
bool isOut,
alloc_type alloc = ALLOC_CBLK,
@@ -79,6 +80,8 @@
audio_track_cblk_t* cblk() const { return mCblk; }
audio_session_t sessionId() const { return mSessionId; }
uid_t uid() const { return mUid; }
+ pid_t creatorPid() const { return mCreatorPid; }
+
audio_port_handle_t portId() const { return mPortId; }
virtual status_t setSyncEvent(const sp<SyncEvent>& event);
@@ -310,6 +313,8 @@
std::atomic<bool> mServerLatencyFromTrack{}; // latency from track or server timestamp.
std::atomic<double> mServerLatencyMs{}; // last latency pushed from server thread.
std::atomic<FrameTime> mKernelFrameTime{}; // last frame time on kernel side.
+ const pid_t mCreatorPid; // can be different from mclient->pid() for instance
+ // when created by NuPlayer on behalf of a client
};
// PatchProxyBufferProvider interface is implemented by PatchTrack and PatchRecord.
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index 8d59431..e1f00c1 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -73,6 +73,7 @@
void *buffer,
size_t bufferSize,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t clientUid,
bool isOut,
alloc_type alloc,
@@ -101,7 +102,8 @@
mType(type),
mThreadIoHandle(thread ? thread->id() : AUDIO_IO_HANDLE_NONE),
mPortId(portId),
- mIsInvalid(false)
+ mIsInvalid(false),
+ mCreatorPid(creatorPid)
{
const uid_t callingUid = IPCThreadState::self()->getCallingUid();
if (!isAudioServerOrMediaServerUid(callingUid) || clientUid == AUDIO_UID_INVALID) {
@@ -485,6 +487,7 @@
size_t bufferSize,
const sp<IMemory>& sharedBuffer,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t uid,
audio_output_flags_t flags,
track_type type,
@@ -492,7 +495,7 @@
: TrackBase(thread, client, attr, sampleRate, format, channelMask, frameCount,
(sharedBuffer != 0) ? sharedBuffer->pointer() : buffer,
(sharedBuffer != 0) ? sharedBuffer->size() : bufferSize,
- sessionId, uid, true /*isOut*/,
+ sessionId, creatorPid, uid, true /*isOut*/,
(type == TYPE_PATCH) ? ( buffer == NULL ? ALLOC_LOCAL : ALLOC_NONE) : ALLOC_CBLK,
type, portId),
mFillingUpStatus(FS_INVALID),
@@ -1543,7 +1546,7 @@
audio_attributes_t{} /* currently unused for output track */,
sampleRate, format, channelMask, frameCount,
nullptr /* buffer */, (size_t)0 /* bufferSize */, nullptr /* sharedBuffer */,
- AUDIO_SESSION_NONE, uid, AUDIO_OUTPUT_FLAG_NONE,
+ AUDIO_SESSION_NONE, getpid(), uid, AUDIO_OUTPUT_FLAG_NONE,
TYPE_OUTPUT),
mActive(false), mSourceThread(sourceThread)
{
@@ -1772,7 +1775,7 @@
audio_attributes_t{} /* currently unused for patch track */,
sampleRate, format, channelMask, frameCount,
buffer, bufferSize, nullptr /* sharedBuffer */,
- AUDIO_SESSION_NONE, AID_AUDIOSERVER, flags, TYPE_PATCH),
+ AUDIO_SESSION_NONE, getpid(), AID_AUDIOSERVER, flags, TYPE_PATCH),
PatchTrackBase(new ClientProxy(mCblk, mBuffer, frameCount, mFrameSize, true, true),
*playbackThread, timeout)
{
@@ -1927,12 +1930,14 @@
void *buffer,
size_t bufferSize,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t uid,
audio_input_flags_t flags,
track_type type,
audio_port_handle_t portId)
: TrackBase(thread, client, attr, sampleRate, format,
- channelMask, frameCount, buffer, bufferSize, sessionId, uid, false /*isOut*/,
+ channelMask, frameCount, buffer, bufferSize, sessionId,
+ creatorPid, uid, false /*isOut*/,
(type == TYPE_DEFAULT) ?
((flags & AUDIO_INPUT_FLAG_FAST) ? ALLOC_PIPE : ALLOC_CBLK) :
((buffer == NULL) ? ALLOC_LOCAL : ALLOC_NONE),
@@ -2242,7 +2247,7 @@
: RecordTrack(recordThread, NULL,
audio_attributes_t{} /* currently unused for patch track */,
sampleRate, format, channelMask, frameCount,
- buffer, bufferSize, AUDIO_SESSION_NONE, AID_AUDIOSERVER,
+ buffer, bufferSize, AUDIO_SESSION_NONE, getpid(), AID_AUDIOSERVER,
flags, TYPE_PATCH),
PatchTrackBase(new ClientProxy(mCblk, mBuffer, frameCount, mFrameSize, false, true),
*recordThread, timeout)
@@ -2310,11 +2315,12 @@
bool isOut,
uid_t uid,
pid_t pid,
+ pid_t creatorPid,
audio_port_handle_t portId)
: TrackBase(thread, NULL, attr, sampleRate, format,
channelMask, (size_t)0 /* frameCount */,
nullptr /* buffer */, (size_t)0 /* bufferSize */,
- sessionId, uid, isOut,
+ sessionId, creatorPid, uid, isOut,
ALLOC_NONE,
TYPE_DEFAULT, portId),
mPid(pid), mSilenced(false), mSilencedNotified(false)