aboutsummaryrefslogtreecommitdiff
path: root/externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2025-08-04 04:50:14 +0200
committercrueter <crueter@eden-emu.dev>2025-08-04 04:50:14 +0200
commit51b170b470ed587f99a7c2a773e4464687f0d07a (patch)
tree4c03c510cfb17a5f5d6233df490d78f06dcfa7f7 /externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp
parent04e5e6453875ffa5c79cdb421a29bc19985b1049 (diff)
[cmake] refactor: Use CPM over submodules (#143)
Transfers the majority of submodules and large externals to CPM, using source archives rather than full Git clones. Not only does this save massive amounts of clone and configure time, but dependencies are grabbed on-demand rather than being required by default. Additionally, CPM will (generally) automatically search for system dependencies, though certain dependencies have options to control this. Testing shows gains ranging from 5x to 10x in terms of overall clone/configure time. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/143 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Diffstat (limited to 'externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp')
-rw-r--r--externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp111
1 files changed, 0 insertions, 111 deletions
diff --git a/externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp b/externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp
deleted file mode 100644
index 0a0c30ba32..0000000000
--- a/externals/oboe/apps/OboeTester/app/src/main/cpp/TestRoutingCrash.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2023 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.
- */
-
-#include <stdlib.h>
-#include <aaudio/AAudioExtensions.h>
-
-#include "common/OboeDebug.h"
-#include "oboe/AudioClock.h"
-#include "TestRoutingCrash.h"
-
-using namespace oboe;
-
-// open start start an Oboe stream
-int32_t TestRoutingCrash::start(bool useInput) {
-
- mDataCallback = std::make_shared<MyDataCallback>(this);
-
- // Disable MMAP because we are trying to crash a Legacy Stream.
- bool wasMMapEnabled = AAudioExtensions::getInstance().isMMapEnabled();
- AAudioExtensions::getInstance().setMMapEnabled(false);
-
- AudioStreamBuilder builder;
- oboe::Result result = builder.setFormat(oboe::AudioFormat::Float)
-#if 1
- ->setPerformanceMode(oboe::PerformanceMode::LowLatency)
-#else
- ->setPerformanceMode(oboe::PerformanceMode::None)
-#endif
- ->setDirection(useInput ? oboe::Direction::Input : oboe::Direction::Output)
- ->setChannelCount(kChannelCount)
- ->setDataCallback(mDataCallback)
- // Use VoiceCommunication so we can reroute it by setting SpeakerPhone ON/OFF.
- ->setUsage(oboe::Usage::VoiceCommunication)
- ->openStream(mStream);
- if (result != oboe::Result::OK) {
- return (int32_t) result;
- }
-
- AAudioExtensions::getInstance().setMMapEnabled(wasMMapEnabled);
- return (int32_t) mStream->requestStart();
-}
-
-int32_t TestRoutingCrash::stop() {
- oboe::Result result1 = mStream->requestStop();
- oboe::Result result2 = mStream->close();
- return (int32_t)((result1 != oboe::Result::OK) ? result1 : result2);
-}
-
-// Callback that sleeps then touches the audio buffer.
-DataCallbackResult TestRoutingCrash::MyDataCallback::onAudioReady(
- AudioStream *audioStream,
- void *audioData,
- int32_t numFrames) {
- float *floatData = (float *) audioData;
-
- // If I call getTimestamp() here it does NOT crash!
-
- // Simulate the timing of a heavy workload by sleeping.
- // Otherwise the window for the crash is very narrow.
- const double kDutyCycle = 0.7;
- const double bufferTimeNanos = 1.0e9 * numFrames / (double) audioStream->getSampleRate();
- const int64_t targetDurationNanos = (int64_t) (bufferTimeNanos * kDutyCycle);
- if (targetDurationNanos > 0) {
- AudioClock::sleepForNanos(targetDurationNanos);
- }
- const double kFilterCoefficient = 0.95; // low pass IIR filter
- const double sleepMicros = targetDurationNanos * 0.0001;
- mParent->averageSleepTimeMicros = ((1.0 - kFilterCoefficient) * sleepMicros)
- + (kFilterCoefficient * mParent->averageSleepTimeMicros);
-
- // If I call getTimestamp() here it crashes.
- audioStream->getTimestamp(CLOCK_MONOTONIC); // Trigger a restoreTrack_l() in framework.
-
- const int numSamples = numFrames * kChannelCount;
- if (audioStream->getDirection() == oboe::Direction::Input) {
- // Read buffer and write sum of samples to a member variable.
- // We just want to touch the memory and not get optimized away by the compiler.
- float sum = 0.0f;
- for (int i = 0; i < numSamples; i++) {
- sum += *floatData++;
- }
- mInputSum = sum;
- } else {
- // Fill mono buffer with a sine wave.
- // If the routing occurred then the buffer may be dead and
- // we may be writing into unallocated memory.
- for (int i = 0; i < numSamples; i++) {
- *floatData++ = sinf(mPhase) * 0.2f;
- mPhase += kPhaseIncrement;
- // Wrap the phase around in a circle.
- if (mPhase >= M_PI) mPhase -= 2 * M_PI;
- }
- }
-
- // If I call getTimestamp() here it does NOT crash!
-
- return oboe::DataCallbackResult::Continue;
-}