summaryrefslogtreecommitdiffstats
path: root/services/audioflinger
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2019-04-24 17:45:17 -0700
committerEric Laurent <elaurent@google.com>2019-04-29 09:59:31 -0700
commit09f1ed2cb4479c93859557f5b4d40e1c3732f6f2 (patch)
tree27f2c1c23755b45acdfd0832bb9e493f6b890aaa /services/audioflinger
parent2f7a6072bbafd4faba8cbaf170d3cb72e37e3454 (diff)
downloadframeworks_av-09f1ed2cb4479c93859557f5b4d40e1c3732f6f2.tar.gz
frameworks_av-09f1ed2cb4479c93859557f5b4d40e1c3732f6f2.tar.bz2
frameworks_av-09f1ed2cb4479c93859557f5b4d40e1c3732f6f2.zip
audio: improve audio routing callbacks
Do not force audio device changed callback when the client (AudioTrack or AudioRecord) registers to AudioFlinger but only when it starts playback or capture. Doing so prevents a spurious callback happing at registration time where a stale device (previously selected by AudioFlinger thread) but irrelevant to this client is indicated. This causes a disconnection of AAudio streams despite no real device change. Bug: 128630993 Test: CTS: android.nativemedia.aaudio.AAudioTests, android.media.cts.RoutingTest CTS Verifier: Audio Input/Output Routing Notifications Test Change-Id: Ia7f1d11490989b0287c97479466c1c07a223aab3
Diffstat (limited to 'services/audioflinger')
-rw-r--r--services/audioflinger/AudioFlinger.cpp9
-rw-r--r--services/audioflinger/MmapTracks.h1
-rw-r--r--services/audioflinger/PlaybackTracks.h1
-rw-r--r--services/audioflinger/RecordTracks.h1
-rw-r--r--services/audioflinger/Threads.cpp43
-rw-r--r--services/audioflinger/Threads.h30
-rw-r--r--services/audioflinger/TrackBase.h5
-rw-r--r--services/audioflinger/Tracks.cpp20
8 files changed, 76 insertions, 34 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 0f03b7e58d..5e5ea1120b 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -701,8 +701,8 @@ sp<IAudioTrack> AudioFlinger::createTrack(const CreateTrackInput& input,
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 @@ sp<IAudioTrack> AudioFlinger::createTrack(const CreateTrackInput& input,
&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 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu
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 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu
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 968d5aa3f1..b83f6b5b17 100644
--- a/services/audioflinger/MmapTracks.h
+++ b/services/audioflinger/MmapTracks.h
@@ -31,6 +31,7 @@ public:
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 56be433d4b..bb97f8d3f0 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -69,6 +69,7 @@ public:
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 ec1f86cc11..08660dd67a 100644
--- a/services/audioflinger/RecordTracks.h
+++ b/services/audioflinger/RecordTracks.h
@@ -32,6 +32,7 @@ public:
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 fd29f31bc3..0c6cfa1292 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -566,14 +566,16 @@ status_t AudioFlinger::ThreadBase::sendConfigEvent_l(sp<ConfigEvent>& event)
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 @@ void AudioFlinger::ThreadBase::sendIoConfigEvent_l(audio_io_config_event event,
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 @@ void AudioFlinger::ThreadBase::processConfigEvents_l()
} 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 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac
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 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac
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 @@ status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
// 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 @@ status_t AudioFlinger::DirectOutputThread::selectPresentation(int presentationId
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 @@ void AudioFlinger::PlaybackThread::ioConfigChanged(audio_io_config_event event,
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 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe
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 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe
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 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac
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 @@ String8 AudioFlinger::RecordThread::getParameters(const String8& keys)
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 @@ void AudioFlinger::RecordThread::ioConfigChanged(audio_io_config_event event, pi
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 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client,
// 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 @@ String8 AudioFlinger::MmapThread::getParameters(const String8& keys)
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 37b2d08ca3..336c2b40a9 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -103,8 +103,9 @@ public:
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 @@ public:
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 @@ public:
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 @@ public:
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 @@ public:
{ 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 @@ public:
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 @@ public:
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 @@ class MmapThread : public ThreadBase
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 4402d99314..8f720b58d5 100644
--- a/services/audioflinger/TrackBase.h
+++ b/services/audioflinger/TrackBase.h
@@ -64,6 +64,7 @@ public:
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 @@ public:
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 @@ protected:
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 8d59431a65..e1f00c190d 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -73,6 +73,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
void *buffer,
size_t bufferSize,
audio_session_t sessionId,
+ pid_t creatorPid,
uid_t clientUid,
bool isOut,
alloc_type alloc,
@@ -101,7 +102,8 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
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 @@ AudioFlinger::PlaybackThread::Track::Track(
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 @@ AudioFlinger::PlaybackThread::Track::Track(
: 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 @@ AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(
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 @@ AudioFlinger::PlaybackThread::PatchTrack::PatchTrack(PlaybackThread *playbackThr
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 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack(
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 @@ AudioFlinger::RecordThread::PatchRecord::PatchRecord(RecordThread *recordThread,
: 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 @@ AudioFlinger::MmapThread::MmapTrack::MmapTrack(ThreadBase *thread,
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)