Skip to content

Commit 94ef6e7

Browse files
authored
AdpfWrapper: Add notifyWorkloadIncrease/Spike/Reset (#2214)
1 parent 18ff1c4 commit 94ef6e7

21 files changed

Lines changed: 515 additions & 27 deletions

apps/OboeTester/app/src/main/cpp/NativeAudioContext.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,10 @@ class ActivityContext {
316316
oboeCallbackProxy.setWorkloadReportingEnabled(enabled);
317317
}
318318

319+
void setNotifyWorkloadIncreaseEnabled(bool enabled) {
320+
oboeCallbackProxy.setNotifyWorkloadIncreaseEnabled(enabled);
321+
}
322+
319323
virtual void setupMemoryBuffer([[maybe_unused]] std::unique_ptr<uint8_t[]>& buffer,
320324
[[maybe_unused]] int length) {}
321325

apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ oboe::DataCallbackResult OboeStreamCallbackProxy::onAudioReady(
3535
audioStream->reportWorkload(numWorkloadVoices);
3636
}
3737

38+
// Tell ADPF that there is a change in workload.
39+
if (mNotifyWorkloadIncreaseEnabled) {
40+
if (numWorkloadVoices > mLastNumWorkloadVoices) {
41+
audioStream->notifyWorkloadIncrease(true /* cpu */, false /* gpu */, kClassName.c_str());
42+
} else if (numWorkloadVoices < mLastNumWorkloadVoices) {
43+
audioStream->notifyWorkloadReset(true /* cpu */, false /* gpu */, kClassName.c_str());
44+
}
45+
}
46+
mLastNumWorkloadVoices = numWorkloadVoices;
47+
3848
// Change affinity if app requested a change.
3949
uint32_t mask = mCpuAffinityMask;
4050
if (mask != mPreviousMask) {

apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,24 @@ class OboeStreamCallbackProxy : public OboeTesterStreamCallback {
181181
mWorkloadReportingEnabled = enabled;
182182
}
183183

184+
void setNotifyWorkloadIncreaseEnabled(bool enabled) {
185+
mNotifyWorkloadIncreaseEnabled = enabled;
186+
}
187+
184188
private:
185189
static constexpr double kNsToMsScaler = 0.000001;
190+
const std::string kClassName = "OboeStreamCallbackProxy";
191+
186192
std::atomic<float> mCpuLoad{0.0f};
187193
std::atomic<float> mMaxCpuLoad{0.0f};
188194
int64_t mPreviousCallbackTimeNs = 0;
189195
DoubleStatistics mStatistics;
190196
std::atomic<int32_t> mNumWorkloadVoices{0};
197+
std::atomic<int32_t> mLastNumWorkloadVoices{0};
191198
SynthWorkload mSynthWorkload;
192199
bool mHearWorkload = false;
193200
bool mWorkloadReportingEnabled = false;
201+
bool mNotifyWorkloadIncreaseEnabled = false;
194202

195203
oboe::AudioStreamDataCallback *mCallback = nullptr;
196204
static bool mCallbackReturnStop;

apps/OboeTester/app/src/main/cpp/cpu/AudioWorkloadTest.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,14 @@ class AudioWorkloadTest : oboe::AudioStreamDataCallback {
127127
* @param alternatingPeriodMs The period in milliseconds to alternate between numVoices and
128128
* alternateNumVoices.
129129
* @param adpfEnabled Whether to enable Adaptive Performance (ADPF) hints.
130+
* @param adpfWorkloadIncreaseEnabled Whether to use ADPF setWorkloadIncrease() API.
130131
* @param hearWorkload If true, the synthesized audio will be audible; otherwise, it's processed
131132
* silently and a sine wave will be audible instead.
132133
* @return 0 on success, or a negative Oboe error code on failure.
133134
*/
134135
int32_t start(int32_t targetDurationMillis, int32_t numBursts, int32_t numVoices,
135136
int32_t alternateNumVoices, int32_t alternatingPeriodMs, bool adpfEnabled,
136-
bool hearWorkload) {
137+
bool adpfWorkloadIncreaseEnabled, bool hearWorkload) {
137138
mTargetDurationMs = targetDurationMillis;
138139
mNumBursts = numBursts;
139140
mNumVoices = numVoices;
@@ -146,6 +147,7 @@ class AudioWorkloadTest : oboe::AudioStreamDataCallback {
146147
mXRunCount = 0;
147148
mRunning = true;
148149
mHearWorkload = hearWorkload;
150+
mAdpfWorkloadIncreaseEnabled = adpfWorkloadIncreaseEnabled;
149151
mStream->setPerformanceHintEnabled(adpfEnabled);
150152
mStream->setBufferSizeInFrames(mNumBursts * mFramesPerBurst);
151153
mBufferSizeInFrames = mStream->getBufferSizeInFrames();
@@ -276,6 +278,7 @@ class AudioWorkloadTest : oboe::AudioStreamDataCallback {
276278
int64_t beginTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
277279
std::chrono::high_resolution_clock::now().time_since_epoch()).count();
278280

281+
int lastVoices = mNumVoices;
279282
int currentVoices = mNumVoices;
280283
if (mAlternatingPeriodMs > 0) {
281284
int64_t timeMs = std::chrono::duration_cast<std::chrono::milliseconds>(
@@ -288,6 +291,16 @@ class AudioWorkloadTest : oboe::AudioStreamDataCallback {
288291
}
289292
}
290293

294+
if (mAdpfWorkloadIncreaseEnabled) {
295+
if (currentVoices > lastVoices) {
296+
audioStream->notifyWorkloadIncrease(true /* cpu */, false /* gpu */,
297+
kTestName.c_str());
298+
} else if (currentVoices < lastVoices) {
299+
audioStream->notifyWorkloadReset(true /* cpu */, false /* gpu */,
300+
kTestName.c_str());
301+
}
302+
}
303+
291304
auto floatData = static_cast<float *>(audioData);
292305
int channelCount = audioStream->getChannelCount();
293306

@@ -339,6 +352,8 @@ class AudioWorkloadTest : oboe::AudioStreamDataCallback {
339352
}
340353

341354
private:
355+
const std::string kTestName = "AudioWorkloadTest";
356+
342357
// Member variables
343358
std::shared_ptr<oboe::AudioStream> mStream; // Pointer to the Oboe audio stream instance
344359

@@ -357,6 +372,7 @@ class AudioWorkloadTest : oboe::AudioStreamDataCallback {
357372
std::atomic<int64_t> mLastDurationNs{0};
358373
std::atomic<int64_t> mStartTimeMs{0};
359374
std::atomic<bool> mHearWorkload{false};
375+
std::atomic<bool> mAdpfWorkloadIncreaseEnabled{false};
360376

361377
std::vector<CallbackStatus> mCallbackStatistics;
362378
std::atomic<bool> mRunning{false};

apps/OboeTester/app/src/main/cpp/cpu/AudioWorkloadTestRunner.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class AudioWorkloadTestRunner {
6060
* @param alternatingPeriodMs The period in milliseconds to alternate between numVoices and
6161
* alternateNumVoices.
6262
* @param adpfEnabled Whether to enable Adaptive Performance (ADPF) hints.
63+
* @param adpfWorkloadIncreaseEnabled Whether to use ADPF setWorkloadIncrease() API.
6364
* @param hearWorkload If true, the synthesized audio will be audible; otherwise, it's
6465
* processed silently and a sine wave will be audible instead.
6566
* @return 0 on success, -1 on failure (e.g., test already running, error opening/starting
@@ -72,6 +73,7 @@ class AudioWorkloadTestRunner {
7273
int32_t alternateNumVoices,
7374
int32_t alternatingPeriodMs,
7475
bool adpfEnabled,
76+
bool adpfWorkloadIncreaseEnabled,
7577
bool hearWorkload) {
7678
if (mIsRunning) {
7779
std::cerr << "Error: Test already running." << std::endl;
@@ -97,6 +99,7 @@ class AudioWorkloadTestRunner {
9799
alternateNumVoices,
98100
alternatingPeriodMs,
99101
adpfEnabled,
102+
adpfWorkloadIncreaseEnabled,
100103
hearWorkload);
101104

102105
if (result != static_cast<int32_t>(oboe::Result::OK)) {

apps/OboeTester/app/src/main/cpp/jni-bridge.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,13 @@ Java_com_mobileer_oboetester_NativeEngine_setWorkloadReportingEnabled(JNIEnv *en
143143
engine.getCurrentActivity()->setWorkloadReportingEnabled(enabled);
144144
}
145145

146+
JNIEXPORT void JNICALL
147+
Java_com_mobileer_oboetester_NativeEngine_setNotifyWorkloadIncreaseEnabled(JNIEnv *env,
148+
jclass type,
149+
jboolean enabled) {
150+
engine.getCurrentActivity()->setNotifyWorkloadIncreaseEnabled(enabled);
151+
}
152+
146153
JNIEXPORT jint JNICALL
147154
Java_com_mobileer_oboetester_OboeAudioStream_openNative(
148155
JNIEnv *env, jobject synth,
@@ -1117,10 +1124,11 @@ Java_com_mobileer_oboetester_AudioWorkloadTestActivity_getBufferSizeInFrames(JNI
11171124
JNIEXPORT jint JNICALL
11181125
Java_com_mobileer_oboetester_AudioWorkloadTestActivity_start(JNIEnv *env, jobject thiz,
11191126
jint targetDurationMs, jint numBursts, jint numVoices, jint numAlternateVoices,
1120-
jint alternatingPeriodMs, jboolean adpfEnabled, jboolean hearWorkload) {
1127+
jint alternatingPeriodMs, jboolean adpfEnabled, jboolean adpfWorkloadIncreaseEnabled,
1128+
jboolean hearWorkload) {
11211129
return sAudioWorkload.start(targetDurationMs, numBursts, numVoices,
11221130
numAlternateVoices, alternatingPeriodMs, adpfEnabled,
1123-
hearWorkload);
1131+
adpfWorkloadIncreaseEnabled, hearWorkload);
11241132
}
11251133

11261134
JNIEXPORT jint JNICALL
@@ -1319,16 +1327,17 @@ static AudioWorkloadTestRunner sAudioWorkloadRunner;
13191327

13201328
JNIEXPORT jint JNICALL
13211329
Java_com_mobileer_oboetester_AudioWorkloadTestRunnerActivity_start(JNIEnv *env, jobject thiz,
1322-
jint targetDurationMs,
1323-
jint numBursts,
1324-
jint numVoices,
1325-
jint alternateNumVoices,
1326-
jint alternatingPeriodMillis,
1327-
jboolean adpfEnabled,
1328-
jboolean hearWorkload) {
1330+
jint targetDurationMs,
1331+
jint numBursts,
1332+
jint numVoices,
1333+
jint alternateNumVoices,
1334+
jint alternatingPeriodMillis,
1335+
jboolean adpfEnabled,
1336+
jboolean adpfWorkloadIncreaseEnabled,
1337+
jboolean hearWorkload) {
13291338
return sAudioWorkloadRunner.start(targetDurationMs, numBursts, numVoices,
13301339
alternateNumVoices, alternatingPeriodMillis, adpfEnabled,
1331-
hearWorkload);
1340+
adpfWorkloadIncreaseEnabled, hearWorkload);
13321341
}
13331342

13341343
JNIEXPORT jboolean JNICALL

apps/OboeTester/app/src/main/java/com/mobileer/oboetester/AudioStreamBase.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ public void setPerformanceHintEnabled(boolean checked) {
8888
}
8989
public void setHearWorkload(boolean checked) {
9090
}
91+
public int notifyWorkloadIncrease(boolean cpu, boolean gpu) {
92+
return -1;
93+
}
94+
public int notifyWorkloadReset(boolean cpu, boolean gpu) {
95+
return -1;
96+
}
9197

9298
public static class DoubleStatistics {
9399
private double sum;

apps/OboeTester/app/src/main/java/com/mobileer/oboetester/AudioWorkloadTestActivity.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class AudioWorkloadTestActivity extends BaseOboeTesterActivity {
4343
private ExponentialSliderView mAlternatingPeriodMsSlider;
4444

4545
private CheckBox mEnableAdpfBox;
46+
private CheckBox mEnableAdpfWorkloadIncreaseBox;
4647
private CheckBox mHearWorkloadBox;
4748

4849
private int mCpuCount;
@@ -140,6 +141,7 @@ protected void onCreate(Bundle savedInstanceState) {
140141
mAlternatingPeriodMsSlider = (ExponentialSliderView) findViewById(R.id.alternating_period_ms);
141142

142143
mEnableAdpfBox = (CheckBox) findViewById(R.id.enable_adpf);
144+
mEnableAdpfWorkloadIncreaseBox = (CheckBox) findViewById(R.id.enable_adpf_workload_increase);
143145
mHearWorkloadBox = (CheckBox) findViewById(R.id.hear_workload);
144146

145147
mOpenButton = (Button) findViewById(R.id.button_open);
@@ -205,7 +207,7 @@ public void startTest(View view) {
205207
int result = start(mTargetDurationMsSlider.getValue(), mNumBurstsSlider.getValue(),
206208
mNumVoicesSlider.getValue(), mAlternateNumVoicesSlider.getValue(),
207209
mAlternatingPeriodMsSlider.getValue(), mEnableAdpfBox.isChecked(),
208-
mHearWorkloadBox.isChecked());
210+
mEnableAdpfWorkloadIncreaseBox.isChecked(), mHearWorkloadBox.isChecked());
209211
if (result != OPERATION_SUCCESS) {
210212
showErrorToast("start failed! Error:" + result);
211213
return;
@@ -283,6 +285,7 @@ public void enableParamsUI(boolean enabled) {
283285
mAlternateNumVoicesSlider.setEnabled(enabled);
284286
mAlternatingPeriodMsSlider.setEnabled(enabled);
285287
mEnableAdpfBox.setEnabled(enabled);
288+
mEnableAdpfWorkloadIncreaseBox.setEnabled(enabled);
286289
mHearWorkloadBox.setEnabled(enabled);
287290
}
288291

@@ -297,7 +300,7 @@ public void updateStreamInfoView() {
297300
private native int getBufferSizeInFrames();
298301
private native int start(int targetDurationMs, int numBursts, int numVoices,
299302
int numAlternateVoices, int alternatingPeriodMs, boolean adpfEnabled,
300-
boolean hearWorkload);
303+
boolean adpfWorkloadIncreaseEnabled, boolean hearWorkload);
301304
private native int getCpuCount();
302305
private native int setCpuAffinityForCallback(int mask);
303306
private native int getXRunCount();

apps/OboeTester/app/src/main/java/com/mobileer/oboetester/AudioWorkloadTestRunnerActivity.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class AudioWorkloadTestRunnerActivity extends BaseOboeTesterActivity {
3838
private ExponentialSliderView mAlternatingPeriodMsSlider;
3939

4040
private CheckBox mEnableAdpfBox;
41+
private CheckBox mEnableAdpfWorkloadIncreaseBox;
4142
private CheckBox mHearWorkloadBox;
4243

4344
private Button mStartButton;
@@ -86,6 +87,7 @@ protected void onCreate(Bundle savedInstanceState) {
8687
mAlternatingPeriodMsSlider = findViewById(R.id.alternating_period_ms);
8788

8889
mEnableAdpfBox = findViewById(R.id.enable_adpf);
90+
mEnableAdpfWorkloadIncreaseBox = findViewById(R.id.enable_adpf_workload_increase);
8991
mHearWorkloadBox = findViewById(R.id.hear_workload);
9092

9193
mStartButton = findViewById(R.id.button_start_test);
@@ -107,9 +109,11 @@ public void startTest(View view) {
107109
int alternateNumVoices = mAlternateNumVoicesSlider.getValue();
108110
int alternatingPeriodMs = mAlternatingPeriodMsSlider.getValue();
109111
boolean adpfEnabled = mEnableAdpfBox.isChecked();
112+
boolean adpfWorkloadIncreaseEnabled = mEnableAdpfWorkloadIncreaseBox.isChecked();
110113
boolean hearWorkload = mHearWorkloadBox.isChecked();
111114

112-
int result = start(targetDurationMs, numBursts, numVoices, alternateNumVoices, alternatingPeriodMs, adpfEnabled, hearWorkload);
115+
int result = start(targetDurationMs, numBursts, numVoices, alternateNumVoices,
116+
alternatingPeriodMs, adpfEnabled, adpfWorkloadIncreaseEnabled, hearWorkload);
113117
if (result != OPERATION_SUCCESS) {
114118
showErrorToast("start failed! Error:" + result);
115119
return;
@@ -150,12 +154,13 @@ public void enableParamsUI(boolean enabled) {
150154
mAlternateNumVoicesSlider.setEnabled(enabled);
151155
mAlternatingPeriodMsSlider.setEnabled(enabled);
152156
mEnableAdpfBox.setEnabled(enabled);
157+
mEnableAdpfWorkloadIncreaseBox.setEnabled(enabled);
153158
mHearWorkloadBox.setEnabled(enabled);
154159
}
155160

156161
public native int start(int targetDurationMs, int numBursts, int numVoices,
157162
int alternateNumVoices, int alternatingPeriodMs, boolean adpfEnabled,
158-
boolean hearWorkload);
163+
boolean adpfWorkloadIncreaseEnabled, boolean hearWorkload);
159164
public native boolean stopIfDone();
160165
public native String getStatus();
161166
public native int stop();

0 commit comments

Comments
 (0)