Bug 4903178 Restore priority and cgroup on stop
On AudioTrack and AudioRecord stop or failed start, restore the priority
and cgroup of the caller to their previous values, rather than forcing
to NORMAL. Dependent on new thread APIs.
Also fixes bug where priority was set to AUDIO but cgroup not set.
Change-Id: Ib83893918fb4fdf57c6b87884b51038997a631d8
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index f32929e..1d8e15b 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -80,7 +80,8 @@
// ---------------------------------------------------------------------------
AudioRecord::AudioRecord()
- : mStatus(NO_INIT), mSessionId(0)
+ : mStatus(NO_INIT), mSessionId(0),
+ mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
{
}
@@ -95,7 +96,8 @@
void* user,
int notificationFrames,
int sessionId)
- : mStatus(NO_INIT), mSessionId(0)
+ : mStatus(NO_INIT), mSessionId(0),
+ mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
{
mStatus = set(inputSource, sampleRate, format, channelMask,
frameCount, flags, cbf, user, notificationFrames, sessionId);
@@ -326,9 +328,11 @@
cblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
cblk->waitTimeMs = 0;
if (t != 0) {
- t->run("ClientRecordThread", ANDROID_PRIORITY_AUDIO);
+ t->run("ClientRecordThread", ANDROID_PRIORITY_AUDIO);
} else {
- setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
+ mPreviousPriority = getpriority(PRIO_PROCESS, 0);
+ mPreviousSchedulingGroup = androidGetThreadSchedulingGroup(0);
+ androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
}
} else {
mActive = 0;
@@ -363,7 +367,8 @@
if (t != 0) {
t->requestExit();
} else {
- setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_NORMAL);
+ setpriority(PRIO_PROCESS, 0, mPreviousPriority);
+ androidSetThreadSchedulingGroup(0, mPreviousSchedulingGroup);
}
}
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 8ccba80..7e55fbd 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -79,7 +79,8 @@
// ---------------------------------------------------------------------------
AudioTrack::AudioTrack()
- : mStatus(NO_INIT)
+ : mStatus(NO_INIT),
+ mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
{
}
@@ -94,7 +95,8 @@
void* user,
int notificationFrames,
int sessionId)
- : mStatus(NO_INIT)
+ : mStatus(NO_INIT),
+ mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
{
mStatus = set(streamType, sampleRate, format, channelMask,
frameCount, flags, cbf, user, notificationFrames,
@@ -112,7 +114,8 @@
void* user,
int notificationFrames,
int sessionId)
- : mStatus(NO_INIT)
+ : mStatus(NO_INIT),
+ mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
{
mStatus = set(streamType, sampleRate, format, channelMask,
0, flags, cbf, user, notificationFrames,
@@ -346,9 +349,11 @@
cblk->waitTimeMs = 0;
android_atomic_and(~CBLK_DISABLED_ON, &cblk->flags);
if (t != 0) {
- t->run("AudioTrackThread", ANDROID_PRIORITY_AUDIO);
+ t->run("AudioTrackThread", ANDROID_PRIORITY_AUDIO);
} else {
- setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
+ mPreviousPriority = getpriority(PRIO_PROCESS, 0);
+ mPreviousSchedulingGroup = androidGetThreadSchedulingGroup(0);
+ androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
}
ALOGV("start %p before lock cblk %p", this, mCblk);
@@ -370,7 +375,8 @@
if (t != 0) {
t->requestExit();
} else {
- setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_NORMAL);
+ setpriority(PRIO_PROCESS, 0, mPreviousPriority);
+ androidSetThreadSchedulingGroup(0, mPreviousSchedulingGroup);
}
}
}
@@ -408,7 +414,8 @@
if (t != 0) {
t->requestExit();
} else {
- setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_NORMAL);
+ setpriority(PRIO_PROCESS, 0, mPreviousPriority);
+ androidSetThreadSchedulingGroup(0, mPreviousSchedulingGroup);
}
}