├── .github ├── ISSUE_TEMPLATE │ └── bug_report.md ├── dependabot.yml └── workflows │ ├── build-ci.yml │ └── update-docs.yml ├── .gitignore ├── AUTHORS ├── CMakeLists.txt ├── CONTRIBUTING.md ├── CONTRIBUTORS ├── Doxyfile ├── LICENSE ├── MODULE_LICENSE_APACHE2 ├── README.md ├── apps ├── OboeTester │ ├── .gitignore │ ├── .google │ │ └── packaging.yaml │ ├── README.md │ ├── app │ │ ├── CMakeLists.txt │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── cpp │ │ │ ├── AudioStreamGateway.cpp │ │ │ ├── AudioStreamGateway.h │ │ │ ├── FormatConverterBox.cpp │ │ │ ├── FormatConverterBox.h │ │ │ ├── FullDuplexAnalyzer.cpp │ │ │ ├── FullDuplexAnalyzer.h │ │ │ ├── FullDuplexEcho.cpp │ │ │ ├── FullDuplexEcho.h │ │ │ ├── FullDuplexStreamWithConversion.cpp │ │ │ ├── FullDuplexStreamWithConversion.h │ │ │ ├── InputStreamCallbackAnalyzer.cpp │ │ │ ├── InputStreamCallbackAnalyzer.h │ │ │ ├── InterpolatingDelayLine.cpp │ │ │ ├── InterpolatingDelayLine.h │ │ │ ├── MultiChannelRecording.h │ │ │ ├── NativeAudioContext.cpp │ │ │ ├── NativeAudioContext.h │ │ │ ├── OboeStreamCallbackProxy.cpp │ │ │ ├── OboeStreamCallbackProxy.h │ │ │ ├── OboeTesterStreamCallback.cpp │ │ │ ├── OboeTesterStreamCallback.h │ │ │ ├── OboeTools.h │ │ │ ├── PlayRecordingCallback.cpp │ │ │ ├── PlayRecordingCallback.h │ │ │ ├── SawPingGenerator.cpp │ │ │ ├── SawPingGenerator.h │ │ │ ├── SinkMemoryDirect.cpp │ │ │ ├── SinkMemoryDirect.h │ │ │ ├── TestColdStartLatency.cpp │ │ │ ├── TestColdStartLatency.h │ │ │ ├── TestErrorCallback.cpp │ │ │ ├── TestErrorCallback.h │ │ │ ├── TestRapidCycle.cpp │ │ │ ├── TestRapidCycle.h │ │ │ ├── TestRoutingCrash.cpp │ │ │ ├── TestRoutingCrash.h │ │ │ ├── analyzer │ │ │ │ ├── BaseSineAnalyzer.h │ │ │ │ ├── DataPathAnalyzer.h │ │ │ │ ├── GlitchAnalyzer.h │ │ │ │ ├── InfiniteRecording.h │ │ │ │ ├── LatencyAnalyzer.h │ │ │ │ ├── ManchesterEncoder.h │ │ │ │ ├── PeakDetector.h │ │ │ │ ├── PseudoRandom.h │ │ │ │ ├── RandomPulseGenerator.h │ │ │ │ └── RoundedManchesterEncoder.h │ │ │ ├── android_debug.h │ │ │ ├── cpu │ │ │ │ ├── AudioWorkloadTest.h │ │ │ │ ├── AudioWorkloadTestRunner.h │ │ │ │ └── SynthWorkload.h │ │ │ ├── flowunits │ │ │ │ ├── ExponentialShape.cpp │ │ │ │ ├── ExponentialShape.h │ │ │ │ ├── ImpulseOscillator.cpp │ │ │ │ ├── ImpulseOscillator.h │ │ │ │ ├── LinearShape.cpp │ │ │ │ ├── LinearShape.h │ │ │ │ ├── OscillatorBase.cpp │ │ │ │ ├── OscillatorBase.h │ │ │ │ ├── SawtoothOscillator.cpp │ │ │ │ ├── SawtoothOscillator.h │ │ │ │ ├── SineOscillator.cpp │ │ │ │ ├── SineOscillator.h │ │ │ │ ├── TriangleOscillator.cpp │ │ │ │ ├── TriangleOscillator.h │ │ │ │ ├── WhiteNoise.cpp │ │ │ │ └── WhiteNoise.h │ │ │ ├── jni-bridge.cpp │ │ │ ├── synth │ │ │ │ ├── BiquadFilter.h │ │ │ │ ├── DifferentiatedParabola.h │ │ │ │ ├── EnvelopeADSR.h │ │ │ │ ├── IncludeMeOnce.h │ │ │ │ ├── LookupTable.h │ │ │ │ ├── PitchToFrequency.h │ │ │ │ ├── SawtoothOscillator.h │ │ │ │ ├── SawtoothOscillatorDPW.h │ │ │ │ ├── SimpleVoice.h │ │ │ │ ├── SineOscillator.h │ │ │ │ ├── SquareOscillatorDPW.h │ │ │ │ ├── SynthTools.h │ │ │ │ ├── Synthesizer.h │ │ │ │ ├── UnitGenerator.h │ │ │ │ └── VoiceBase.h │ │ │ ├── unused │ │ │ │ └── unused.h │ │ │ └── util │ │ │ │ ├── WaveFileWriter.cpp │ │ │ │ └── WaveFileWriter.h │ │ │ ├── ic_launcher-playstore.png │ │ │ ├── java │ │ │ └── com │ │ │ │ └── mobileer │ │ │ │ ├── audio_device │ │ │ │ ├── AudioDeviceAdapter.java │ │ │ │ ├── AudioDeviceInfoConverter.java │ │ │ │ ├── AudioDeviceListEntry.java │ │ │ │ ├── AudioDeviceSpinner.java │ │ │ │ └── CommunicationDeviceSpinner.java │ │ │ │ ├── miditools │ │ │ │ ├── EventScheduler.java │ │ │ │ ├── MidiConstants.java │ │ │ │ ├── MidiDeviceMonitor.java │ │ │ │ ├── MidiDispatcher.java │ │ │ │ ├── MidiEventScheduler.java │ │ │ │ ├── MidiEventThread.java │ │ │ │ ├── MidiFramer.java │ │ │ │ ├── MidiInputPortSelector.java │ │ │ │ ├── MidiOutputPortConnectionSelector.java │ │ │ │ ├── MidiOutputPortSelector.java │ │ │ │ ├── MidiPortConnector.java │ │ │ │ ├── MidiPortSelector.java │ │ │ │ ├── MidiPortWrapper.java │ │ │ │ ├── MidiTools.java │ │ │ │ ├── MusicKeyboardView.java │ │ │ │ └── synth │ │ │ │ │ ├── AudioLatencyTuner.java │ │ │ │ │ ├── EnvelopeADSR.java │ │ │ │ │ ├── LatencyController.java │ │ │ │ │ ├── SawOscillator.java │ │ │ │ │ ├── SawOscillatorDPW.java │ │ │ │ │ ├── SawVoice.java │ │ │ │ │ ├── SimpleAudioOutput.java │ │ │ │ │ ├── SineOscillator.java │ │ │ │ │ ├── SineVoice.java │ │ │ │ │ ├── SynthEngine.java │ │ │ │ │ ├── SynthUnit.java │ │ │ │ │ └── SynthVoice.java │ │ │ │ └── oboetester │ │ │ │ ├── AnalyzerActivity.java │ │ │ │ ├── AudioForegroundService.java │ │ │ │ ├── AudioInputTester.java │ │ │ │ ├── AudioOutputTester.java │ │ │ │ ├── AudioQueryTools.java │ │ │ │ ├── AudioRecordThread.java │ │ │ │ ├── AudioStreamBase.java │ │ │ │ ├── AudioStreamTester.java │ │ │ │ ├── AudioWorkloadTestActivity.java │ │ │ │ ├── AudioWorkloadTestRunnerActivity.java │ │ │ │ ├── AutomatedGlitchActivity.java │ │ │ │ ├── AutomatedTestRunner.java │ │ │ │ ├── BaseAutoGlitchActivity.java │ │ │ │ ├── BaseOboeTesterActivity.java │ │ │ │ ├── BufferSizeView.java │ │ │ │ ├── CachedTextViewLog.java │ │ │ │ ├── CircularCaptureBuffer.java │ │ │ │ ├── CommunicationDeviceView.java │ │ │ │ ├── DeviceReportActivity.java │ │ │ │ ├── DoubleStatistics.java │ │ │ │ ├── DynamicWorkloadActivity.java │ │ │ │ ├── EchoActivity.java │ │ │ │ ├── ExponentialSliderView.java │ │ │ │ ├── ExponentialTaper.java │ │ │ │ ├── ExternalFileWriter.java │ │ │ │ ├── ExternalTapToToneActivity.java │ │ │ │ ├── ExtraTestsActivity.java │ │ │ │ ├── FastButton.java │ │ │ │ ├── GlitchActivity.java │ │ │ │ ├── InputMarginView.java │ │ │ │ ├── IntentBasedTestSupport.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── ManualGlitchActivity.java │ │ │ │ ├── MicrophoneInfoConverter.java │ │ │ │ ├── MidiTapTester.java │ │ │ │ ├── MultiLineChart.java │ │ │ │ ├── NativeEngine.java │ │ │ │ ├── NativeSniffer.java │ │ │ │ ├── OboeAudioInputStream.java │ │ │ │ ├── OboeAudioOutputStream.java │ │ │ │ ├── OboeAudioStream.java │ │ │ │ ├── RecorderActivity.java │ │ │ │ ├── RoundTripLatencyActivity.java │ │ │ │ ├── StreamConfiguration.java │ │ │ │ ├── StreamConfigurationView.java │ │ │ │ ├── TapLatencyAnalyser.java │ │ │ │ ├── TapToToneActivity.java │ │ │ │ ├── TapToToneTester.java │ │ │ │ ├── TestAudioActivity.java │ │ │ │ ├── TestColdStartLatencyActivity.java │ │ │ │ ├── TestDataPathsActivity.java │ │ │ │ ├── TestDisconnectActivity.java │ │ │ │ ├── TestErrorCallbackActivity.java │ │ │ │ ├── TestInputActivity.java │ │ │ │ ├── TestOutputActivity.java │ │ │ │ ├── TestOutputActivityBase.java │ │ │ │ ├── TestPlugLatencyActivity.java │ │ │ │ ├── TestRapidCycleActivity.java │ │ │ │ ├── TestRouteDuringCallbackActivity.java │ │ │ │ ├── VolumeBarView.java │ │ │ │ ├── WaveformView.java │ │ │ │ └── WorkloadView.java │ │ │ └── res │ │ │ ├── drawable │ │ │ ├── button_shape.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_notification.xml │ │ │ ├── layout │ │ │ ├── activity_audio_workload_test.xml │ │ │ ├── activity_audio_workload_test_runner.xml │ │ │ ├── activity_auto_glitches.xml │ │ │ ├── activity_cold_start_latency.xml │ │ │ ├── activity_data_paths.xml │ │ │ ├── activity_device_report.xml │ │ │ ├── activity_dynamic_workload.xml │ │ │ ├── activity_echo.xml │ │ │ ├── activity_error_callback.xml │ │ │ ├── activity_external_tap_to_tone.xml │ │ │ ├── activity_extra_tests.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_manual_glitches.xml │ │ │ ├── activity_rapid_cycle.xml │ │ │ ├── activity_recorder.xml │ │ │ ├── activity_routing_crash.xml │ │ │ ├── activity_rt_latency.xml │ │ │ ├── activity_tap_to_tone.xml │ │ │ ├── activity_test_disconnect.xml │ │ │ ├── activity_test_input.xml │ │ │ ├── activity_test_output.xml │ │ │ ├── activity_test_plug_latency.xml │ │ │ ├── audio_devices.xml │ │ │ ├── auto_test_runner.xml │ │ │ ├── buffer_size_view.xml │ │ │ ├── comm_device_view.xml │ │ │ ├── exponential_slider_view.xml │ │ │ ├── input_margin_view.xml │ │ │ ├── merge_audio_common.xml │ │ │ ├── merge_audio_simple.xml │ │ │ ├── sample_fast_button.xml │ │ │ ├── sample_multi_line_chart.xml │ │ │ ├── stream_config.xml │ │ │ └── workload_view.xml │ │ │ ├── menu │ │ │ └── menu_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── raw │ │ │ └── sine441stereo.mp3 │ │ │ ├── values-w600dp │ │ │ └── dimens.xml │ │ │ ├── values │ │ │ ├── arrays.xml │ │ │ ├── attrs_exponential_slider.xml │ │ │ ├── attrs_fast_button.xml │ │ │ ├── attrs_multi_line_chart.xml │ │ │ ├── attrs_waveform.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ ├── button_color_selector.xml │ │ │ ├── provider_paths.xml │ │ │ └── service_device_info.xml │ ├── build.gradle │ ├── docs │ │ ├── AutomatedTesting.md │ │ ├── Build.md │ │ ├── PrivacyPolicy.md │ │ ├── README.md │ │ ├── TestOutput.md │ │ ├── Usage.md │ │ └── images │ │ │ ├── auto_glitch_test.png │ │ │ ├── echo_input_output.png │ │ │ ├── main_activity.png │ │ │ ├── recorder.png │ │ │ ├── round_trip_latency.png │ │ │ ├── tap_to_tone.png │ │ │ ├── test_glitches.png │ │ │ ├── test_input.png │ │ │ ├── test_output.png │ │ │ └── test_output_running.png │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── scripts │ │ └── dsp_timing.py │ └── settings.gradle └── fxlab │ ├── .gitignore │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── app │ ├── .gitignore │ ├── CMakeLists.txt │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── DuplexCallback.h │ │ ├── DuplexEngine.cpp │ │ ├── DuplexEngine.h │ │ ├── FunctionList.h │ │ ├── effects │ │ │ ├── CombFilter.h │ │ │ ├── DelayLineEffect.h │ │ │ ├── DoublingEffect.h │ │ │ ├── DriveControl.h │ │ │ ├── EchoEffect.h │ │ │ ├── Effects.h │ │ │ ├── FlangerEffect.h │ │ │ ├── SingleFunctionEffects.h │ │ │ ├── SlapbackEffect.h │ │ │ ├── TremoloEffect.h │ │ │ ├── VibratroEffect.h │ │ │ ├── WhiteChorusEffect.h │ │ │ ├── descrip │ │ │ │ ├── AllPassDescription.h │ │ │ │ ├── DistortionDescription.h │ │ │ │ ├── DoublingDescription.h │ │ │ │ ├── EchoDescription.h │ │ │ │ ├── EffectDescription.h │ │ │ │ ├── FIRDescription.h │ │ │ │ ├── FlangerDescription.h │ │ │ │ ├── GainDescription.h │ │ │ │ ├── IIRDescription.h │ │ │ │ ├── OverdriveDescription.h │ │ │ │ ├── PassthroughDescription.h │ │ │ │ ├── SlapbackDescription.h │ │ │ │ ├── TremoloDescription.h │ │ │ │ ├── VibratoDescription.h │ │ │ │ └── WhiteChorusDescription.h │ │ │ └── utils │ │ │ │ ├── DelayLine.h │ │ │ │ ├── PhaseAccumulator.h │ │ │ │ ├── SineWave.h │ │ │ │ └── WhiteNoise.h │ │ ├── logging_macros.h │ │ ├── native-lib.cpp │ │ └── tests │ │ │ ├── .gitignore │ │ │ ├── CMakeLists.txt │ │ │ ├── DelayLineEffectTest.h │ │ │ ├── DelayLineTest.h │ │ │ ├── TypeTests.h │ │ │ └── testEffects.cpp │ │ ├── kotlin │ │ └── com │ │ │ └── mobileer │ │ │ └── androidfxlab │ │ │ ├── EffectsAdapter.kt │ │ │ ├── MainActivity.kt │ │ │ ├── NativeInterface.kt │ │ │ └── datatype │ │ │ ├── Effect.kt │ │ │ ├── EffectDescription.kt │ │ │ └── ParamDescription.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_add.xml │ │ ├── ic_baseline_audio_is_disabled_24.xml │ │ ├── ic_baseline_audio_is_enabled_24.xml │ │ ├── ic_baseline_drag_indicator.xml │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── effect_header.xml │ │ ├── effect_view.xml │ │ └── param_seek.xml │ │ ├── menu │ │ ├── add_menu.xml │ │ └── toolbar_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── build.gradle │ ├── docs │ ├── Dev-Guide.md │ ├── Presentation.pdf │ └── README.md │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── screenshot.png │ └── settings.gradle ├── build_all_android.sh ├── docs ├── AndroidAudioHistory.md ├── FAQ.md ├── FullGuide.md ├── GettingStarted.md ├── OpenSLESMigration.md ├── PrivacyPolicy.md ├── README.md ├── images │ ├── cmakelists-location-in-as.png │ ├── getting-started-video.jpg │ ├── oboe-lifecycle.png │ ├── oboe-sharing-mode-exclusive.jpg │ └── oboe-sharing-mode-shared.jpg └── index.md ├── include └── oboe │ ├── AudioClock.h │ ├── AudioStream.h │ ├── AudioStreamBase.h │ ├── AudioStreamBuilder.h │ ├── AudioStreamCallback.h │ ├── Definitions.h │ ├── FifoBuffer.h │ ├── FifoControllerBase.h │ ├── FullDuplexStream.h │ ├── LatencyTuner.h │ ├── Oboe.h │ ├── OboeExtensions.h │ ├── ResultWithValue.h │ ├── StabilizedCallback.h │ ├── Utilities.h │ └── Version.h ├── prefab ├── oboe-VERSION.pom └── oboe-VERSION │ ├── AndroidManifest.xml │ └── prefab │ ├── modules │ └── oboe │ │ ├── libs │ │ ├── android.arm64-v8a │ │ │ └── abi.json │ │ ├── android.armeabi-v7a │ │ │ └── abi.json │ │ ├── android.x86 │ │ │ └── abi.json │ │ └── android.x86_64 │ │ │ └── abi.json │ │ └── module.json │ └── prefab.json ├── prefab_build.sh ├── samples ├── .gitignore ├── LiveEffect │ ├── README.md │ ├── build.gradle │ ├── screenshot.png │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── FullDuplexPass.h │ │ ├── LiveEffectEngine.cpp │ │ ├── LiveEffectEngine.h │ │ ├── jni_bridge.cpp │ │ └── ndk-stl-config.cmake │ │ ├── java │ │ └── com │ │ │ └── google │ │ │ └── oboe │ │ │ └── samples │ │ │ └── liveEffect │ │ │ ├── DuplexStreamForegroundService.java │ │ │ ├── LiveEffectEngine.java │ │ │ └── MainActivity.java │ │ └── res │ │ ├── layout-v21 │ │ └── activity_main.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── MegaDrone │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── megadrone-screenshot.png │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── MegaDroneEngine.cpp │ │ ├── MegaDroneEngine.h │ │ ├── Synth.h │ │ └── native-lib.cpp │ │ ├── java │ │ └── com │ │ │ └── google │ │ │ └── oboe │ │ │ └── samples │ │ │ └── megadrone │ │ │ └── MainActivity.java │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── README.md ├── RhythmGame │ ├── CMakeLists.txt │ ├── README.md │ ├── build.gradle │ ├── images │ │ ├── 1-timeline.png │ │ ├── 2-architecture.png │ │ ├── 3-audioData.png │ │ ├── 4-audio-rendering.png │ │ ├── 5-lockfreequeue.png │ │ ├── 6-audio-ui-sync.png │ │ ├── 7-tap-window.png │ │ └── RhythmGame-screenshot.png │ ├── proguard-rules.pro │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ ├── CLAP.mp3 │ │ │ └── FUNKY_HOUSE.mp3 │ │ │ ├── cpp │ │ │ ├── Game.cpp │ │ │ ├── Game.h │ │ │ ├── GameConstants.h │ │ │ ├── audio │ │ │ │ ├── AAssetDataSource.cpp │ │ │ │ ├── AAssetDataSource.h │ │ │ │ ├── DataSource.h │ │ │ │ ├── FFMpegExtractor.cpp │ │ │ │ ├── FFMpegExtractor.h │ │ │ │ ├── NDKExtractor.cpp │ │ │ │ ├── NDKExtractor.h │ │ │ │ ├── Player.cpp │ │ │ │ └── Player.h │ │ │ ├── native-lib.cpp │ │ │ ├── ui │ │ │ │ ├── OpenGLFunctions.cpp │ │ │ │ └── OpenGLFunctions.h │ │ │ └── utils │ │ │ │ ├── LockFreeQueue.h │ │ │ │ ├── UtilityFunctions.cpp │ │ │ │ ├── UtilityFunctions.h │ │ │ │ └── logging.h │ │ │ ├── java │ │ │ └── com │ │ │ │ └── google │ │ │ │ └── oboe │ │ │ │ └── samples │ │ │ │ └── rhythmgame │ │ │ │ ├── GameSurfaceView.java │ │ │ │ ├── MainActivity.java │ │ │ │ └── RendererWrapper.java │ │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ └── ic_launcher_background.xml │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── test │ │ ├── CMakeLists.txt │ │ ├── run_tests.sh │ │ └── testLockFreeQueue.cpp │ └── third_party │ │ └── glm │ │ ├── CMakeLists.txt │ │ ├── common.hpp │ │ ├── detail │ │ ├── _features.hpp │ │ ├── _fixes.hpp │ │ ├── _noise.hpp │ │ ├── _swizzle.hpp │ │ ├── _swizzle_func.hpp │ │ ├── _vectorize.hpp │ │ ├── dummy.cpp │ │ ├── func_common.hpp │ │ ├── func_common.inl │ │ ├── func_common_simd.inl │ │ ├── func_exponential.hpp │ │ ├── func_exponential.inl │ │ ├── func_exponential_simd.inl │ │ ├── func_geometric.hpp │ │ ├── func_geometric.inl │ │ ├── func_geometric_simd.inl │ │ ├── func_integer.hpp │ │ ├── func_integer.inl │ │ ├── func_integer_simd.inl │ │ ├── func_matrix.hpp │ │ ├── func_matrix.inl │ │ ├── func_matrix_simd.inl │ │ ├── func_packing.hpp │ │ ├── func_packing.inl │ │ ├── func_packing_simd.inl │ │ ├── func_trigonometric.hpp │ │ ├── func_trigonometric.inl │ │ ├── func_trigonometric_simd.inl │ │ ├── func_vector_relational.hpp │ │ ├── func_vector_relational.inl │ │ ├── func_vector_relational_simd.inl │ │ ├── glm.cpp │ │ ├── precision.hpp │ │ ├── setup.hpp │ │ ├── type_float.hpp │ │ ├── type_gentype.hpp │ │ ├── type_gentype.inl │ │ ├── type_half.hpp │ │ ├── type_half.inl │ │ ├── type_int.hpp │ │ ├── type_mat.hpp │ │ ├── type_mat.inl │ │ ├── type_mat2x2.hpp │ │ ├── type_mat2x2.inl │ │ ├── type_mat2x3.hpp │ │ ├── type_mat2x3.inl │ │ ├── type_mat2x4.hpp │ │ ├── type_mat2x4.inl │ │ ├── type_mat3x2.hpp │ │ ├── type_mat3x2.inl │ │ ├── type_mat3x3.hpp │ │ ├── type_mat3x3.inl │ │ ├── type_mat3x4.hpp │ │ ├── type_mat3x4.inl │ │ ├── type_mat4x2.hpp │ │ ├── type_mat4x2.inl │ │ ├── type_mat4x3.hpp │ │ ├── type_mat4x3.inl │ │ ├── type_mat4x4.hpp │ │ ├── type_mat4x4.inl │ │ ├── type_mat4x4_simd.inl │ │ ├── type_vec.hpp │ │ ├── type_vec.inl │ │ ├── type_vec1.hpp │ │ ├── type_vec1.inl │ │ ├── type_vec2.hpp │ │ ├── type_vec2.inl │ │ ├── type_vec3.hpp │ │ ├── type_vec3.inl │ │ ├── type_vec4.hpp │ │ ├── type_vec4.inl │ │ └── type_vec4_simd.inl │ │ ├── exponential.hpp │ │ ├── ext.hpp │ │ ├── fwd.hpp │ │ ├── geometric.hpp │ │ ├── glm.hpp │ │ ├── gtc │ │ ├── bitfield.hpp │ │ ├── bitfield.inl │ │ ├── color_encoding.inl │ │ ├── color_space.hpp │ │ ├── color_space.inl │ │ ├── constants.hpp │ │ ├── constants.inl │ │ ├── epsilon.hpp │ │ ├── epsilon.inl │ │ ├── functions.hpp │ │ ├── functions.inl │ │ ├── integer.hpp │ │ ├── integer.inl │ │ ├── matrix_access.hpp │ │ ├── matrix_access.inl │ │ ├── matrix_integer.hpp │ │ ├── matrix_inverse.hpp │ │ ├── matrix_inverse.inl │ │ ├── matrix_transform.hpp │ │ ├── matrix_transform.inl │ │ ├── noise.hpp │ │ ├── noise.inl │ │ ├── packing.hpp │ │ ├── packing.inl │ │ ├── quaternion.hpp │ │ ├── quaternion.inl │ │ ├── quaternion_simd.inl │ │ ├── random.hpp │ │ ├── random.inl │ │ ├── reciprocal.hpp │ │ ├── reciprocal.inl │ │ ├── round.hpp │ │ ├── round.inl │ │ ├── type_aligned.hpp │ │ ├── type_precision.hpp │ │ ├── type_precision.inl │ │ ├── type_ptr.hpp │ │ ├── type_ptr.inl │ │ ├── ulp.hpp │ │ ├── ulp.inl │ │ ├── vec1.hpp │ │ └── vec1.inl │ │ ├── gtx │ │ ├── associated_min_max.hpp │ │ ├── associated_min_max.inl │ │ ├── bit.hpp │ │ ├── bit.inl │ │ ├── closest_point.hpp │ │ ├── closest_point.inl │ │ ├── color_space.hpp │ │ ├── color_space.inl │ │ ├── color_space_YCoCg.hpp │ │ ├── color_space_YCoCg.inl │ │ ├── common.hpp │ │ ├── common.inl │ │ ├── compatibility.hpp │ │ ├── compatibility.inl │ │ ├── component_wise.hpp │ │ ├── component_wise.inl │ │ ├── dual_quaternion.hpp │ │ ├── dual_quaternion.inl │ │ ├── euler_angles.hpp │ │ ├── euler_angles.inl │ │ ├── extend.hpp │ │ ├── extend.inl │ │ ├── extended_min_max.hpp │ │ ├── extended_min_max.inl │ │ ├── fast_exponential.hpp │ │ ├── fast_exponential.inl │ │ ├── fast_square_root.hpp │ │ ├── fast_square_root.inl │ │ ├── fast_trigonometry.hpp │ │ ├── fast_trigonometry.inl │ │ ├── float_notmalize.inl │ │ ├── gradient_paint.hpp │ │ ├── gradient_paint.inl │ │ ├── handed_coordinate_space.hpp │ │ ├── handed_coordinate_space.inl │ │ ├── hash.hpp │ │ ├── hash.inl │ │ ├── integer.hpp │ │ ├── integer.inl │ │ ├── intersect.hpp │ │ ├── intersect.inl │ │ ├── io.hpp │ │ ├── io.inl │ │ ├── log_base.hpp │ │ ├── log_base.inl │ │ ├── matrix_cross_product.hpp │ │ ├── matrix_cross_product.inl │ │ ├── matrix_decompose.hpp │ │ ├── matrix_decompose.inl │ │ ├── matrix_interpolation.hpp │ │ ├── matrix_interpolation.inl │ │ ├── matrix_major_storage.hpp │ │ ├── matrix_major_storage.inl │ │ ├── matrix_operation.hpp │ │ ├── matrix_operation.inl │ │ ├── matrix_query.hpp │ │ ├── matrix_query.inl │ │ ├── matrix_transform_2d.hpp │ │ ├── matrix_transform_2d.inl │ │ ├── mixed_product.hpp │ │ ├── mixed_product.inl │ │ ├── norm.hpp │ │ ├── norm.inl │ │ ├── normal.hpp │ │ ├── normal.inl │ │ ├── normalize_dot.hpp │ │ ├── normalize_dot.inl │ │ ├── number_precision.hpp │ │ ├── number_precision.inl │ │ ├── optimum_pow.hpp │ │ ├── optimum_pow.inl │ │ ├── orthonormalize.hpp │ │ ├── orthonormalize.inl │ │ ├── perpendicular.hpp │ │ ├── perpendicular.inl │ │ ├── polar_coordinates.hpp │ │ ├── polar_coordinates.inl │ │ ├── projection.hpp │ │ ├── projection.inl │ │ ├── quaternion.hpp │ │ ├── quaternion.inl │ │ ├── range.hpp │ │ ├── raw_data.hpp │ │ ├── raw_data.inl │ │ ├── rotate_normalized_axis.hpp │ │ ├── rotate_normalized_axis.inl │ │ ├── rotate_vector.hpp │ │ ├── rotate_vector.inl │ │ ├── scalar_multiplication.hpp │ │ ├── scalar_relational.hpp │ │ ├── scalar_relational.inl │ │ ├── simd_mat4.hpp │ │ ├── simd_mat4.inl │ │ ├── simd_quat.hpp │ │ ├── simd_quat.inl │ │ ├── simd_vec4.hpp │ │ ├── simd_vec4.inl │ │ ├── spline.hpp │ │ ├── spline.inl │ │ ├── std_based_type.hpp │ │ ├── std_based_type.inl │ │ ├── string_cast.hpp │ │ ├── string_cast.inl │ │ ├── transform.hpp │ │ ├── transform.inl │ │ ├── transform2.hpp │ │ ├── transform2.inl │ │ ├── type_aligned.hpp │ │ ├── type_aligned.inl │ │ ├── type_trait.hpp │ │ ├── type_trait.inl │ │ ├── vector_angle.hpp │ │ ├── vector_angle.inl │ │ ├── vector_query.hpp │ │ ├── vector_query.inl │ │ ├── wrap.hpp │ │ └── wrap.inl │ │ ├── integer.hpp │ │ ├── mat2x2.hpp │ │ ├── mat2x3.hpp │ │ ├── mat2x4.hpp │ │ ├── mat3x2.hpp │ │ ├── mat3x3.hpp │ │ ├── mat3x4.hpp │ │ ├── mat4x2.hpp │ │ ├── mat4x3.hpp │ │ ├── mat4x4.hpp │ │ ├── matrix.hpp │ │ ├── packing.hpp │ │ ├── simd │ │ ├── common.h │ │ ├── exponential.h │ │ ├── geometric.h │ │ ├── integer.h │ │ ├── matrix.h │ │ ├── packing.h │ │ ├── platform.h │ │ ├── trigonometric.h │ │ └── vector_relational.h │ │ ├── trigonometric.hpp │ │ ├── vec2.hpp │ │ ├── vec3.hpp │ │ ├── vec4.hpp │ │ └── vector_relational.hpp ├── SoundBoard │ ├── README.md │ ├── build.gradle │ ├── proguard-rules.pro │ ├── soundboard_image.png │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── SoundBoardEngine.cpp │ │ ├── SoundBoardEngine.h │ │ ├── Synth.h │ │ └── native-lib.cpp │ │ ├── ic_launcher-playstore.png │ │ ├── kotlin │ │ └── com │ │ │ └── google │ │ │ └── oboe │ │ │ └── samples │ │ │ └── soundboard │ │ │ ├── MainActivity.kt │ │ │ ├── MusicTileView.kt │ │ │ └── NoteListener.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher_foreground.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── audio-device │ ├── README.md │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── google │ │ │ └── oboe │ │ │ └── samples │ │ │ └── audio_device │ │ │ ├── AudioDeviceAdapter.java │ │ │ ├── AudioDeviceInfoConverter.java │ │ │ ├── AudioDeviceListEntry.java │ │ │ └── AudioDeviceSpinner.java │ │ └── res │ │ ├── layout │ │ └── audio_devices.xml │ │ └── values │ │ ├── dimens.xml │ │ └── strings.xml ├── build.gradle ├── debug-utils │ ├── logging_macros.h │ ├── trace.cpp │ └── trace.h ├── drumthumper │ ├── README.md │ ├── build.gradle │ ├── drumthumper-screenshot.png │ ├── playstore │ │ ├── DrumSetFeatureImage.png │ │ ├── ScreenShotPhone.png │ │ ├── ScreenShotWithMix.png │ │ └── drumset.jpg │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ ├── CrashCymbal.wav │ │ ├── HiHat_Closed.wav │ │ ├── HiHat_Open.wav │ │ ├── KickDrum.wav │ │ ├── LowTom.wav │ │ ├── MidTom.wav │ │ ├── RideCymbal.wav │ │ └── SnareDrum.wav │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ └── DrumPlayerJNI.cpp │ │ ├── kotlin │ │ └── com │ │ │ └── plausibleaudio │ │ │ └── drumthumper │ │ │ ├── DrumPlayer.kt │ │ │ ├── DrumThumperActivity.kt │ │ │ └── TriggerPad.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── _ic_launcher_foreground.xml │ │ ├── drawable │ │ └── _ic_launcher_background.xml │ │ ├── layout-land │ │ └── drumthumper_activity.xml │ │ ├── layout │ │ └── drumthumper_activity.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── _ic_launcher.xml │ │ └── _ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── hello-oboe │ ├── README.md │ ├── build.gradle │ ├── hello-oboe-screenshot.png │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── HelloOboeEngine.cpp │ │ ├── HelloOboeEngine.h │ │ ├── LatencyTuningCallback.cpp │ │ ├── LatencyTuningCallback.h │ │ ├── SoundGenerator.cpp │ │ ├── SoundGenerator.h │ │ └── jni_bridge.cpp │ │ ├── java │ │ └── com │ │ │ └── google │ │ │ └── oboe │ │ │ └── samples │ │ │ └── hellooboe │ │ │ ├── BackgroundRunner.java │ │ │ ├── MainActivity.java │ │ │ └── PlaybackEngine.java │ │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── audio_apis_spinner.xml │ │ ├── buffer_sizes_spinner.xml │ │ └── channel_counts_spinner.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── iolib │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ └── player │ │ │ ├── DataSource.h │ │ │ ├── OneShotSampleSource.cpp │ │ │ ├── OneShotSampleSource.h │ │ │ ├── SampleBuffer.cpp │ │ │ ├── SampleBuffer.h │ │ │ ├── SampleSource.cpp │ │ │ ├── SampleSource.h │ │ │ ├── SimpleMultiPlayer.cpp │ │ │ └── SimpleMultiPlayer.h │ │ └── res │ │ └── values │ │ └── strings.xml ├── minimaloboe │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── minimaloboe-screenshot.png │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── MinimalOboeJNI.cpp │ │ ├── SimpleNoiseMaker.cpp │ │ └── SimpleNoiseMaker.h │ │ ├── kotlin │ │ └── com │ │ │ └── example │ │ │ └── minimaloboe │ │ │ ├── AudioPlayer.kt │ │ │ ├── MainActivity.kt │ │ │ └── ui │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Shape.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml ├── parselib │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── stream │ │ │ ├── FileInputStream.cpp │ │ │ ├── FileInputStream.h │ │ │ ├── InputStream.cpp │ │ │ ├── InputStream.h │ │ │ ├── MemInputStream.cpp │ │ │ └── MemInputStream.h │ │ └── wav │ │ │ ├── AudioEncoding.cpp │ │ │ ├── AudioEncoding.h │ │ │ ├── WavChunkHeader.cpp │ │ │ ├── WavChunkHeader.h │ │ │ ├── WavFmtChunkHeader.cpp │ │ │ ├── WavFmtChunkHeader.h │ │ │ ├── WavRIFFChunkHeader.cpp │ │ │ ├── WavRIFFChunkHeader.h │ │ │ ├── WavStreamReader.cpp │ │ │ ├── WavStreamReader.h │ │ │ └── WavTypes.h │ │ └── res │ │ └── values │ │ └── strings.xml ├── settings.gradle └── shared │ ├── DefaultDataCallback.h │ ├── DefaultErrorCallback.h │ ├── IRenderableAudio.h │ ├── IRestartable.h │ ├── ITappable.h │ ├── Mixer.h │ ├── MonoToStereo.h │ ├── Oscillator.h │ ├── SynthSound.h │ └── TappableAudioSource.h ├── src ├── aaudio │ ├── AAudioExtensions.h │ ├── AAudioLoader.cpp │ ├── AAudioLoader.h │ ├── AudioStreamAAudio.cpp │ └── AudioStreamAAudio.h ├── common │ ├── AdpfWrapper.cpp │ ├── AdpfWrapper.h │ ├── AudioSourceCaller.cpp │ ├── AudioSourceCaller.h │ ├── AudioStream.cpp │ ├── AudioStreamBuilder.cpp │ ├── DataConversionFlowGraph.cpp │ ├── DataConversionFlowGraph.h │ ├── FilterAudioStream.cpp │ ├── FilterAudioStream.h │ ├── FixedBlockAdapter.cpp │ ├── FixedBlockAdapter.h │ ├── FixedBlockReader.cpp │ ├── FixedBlockReader.h │ ├── FixedBlockWriter.cpp │ ├── FixedBlockWriter.h │ ├── LatencyTuner.cpp │ ├── MonotonicCounter.h │ ├── OboeDebug.h │ ├── OboeExtensions.cpp │ ├── QuirksManager.cpp │ ├── QuirksManager.h │ ├── README.md │ ├── SourceFloatCaller.cpp │ ├── SourceFloatCaller.h │ ├── SourceI16Caller.cpp │ ├── SourceI16Caller.h │ ├── SourceI24Caller.cpp │ ├── SourceI24Caller.h │ ├── SourceI32Caller.cpp │ ├── SourceI32Caller.h │ ├── StabilizedCallback.cpp │ ├── Trace.cpp │ ├── Trace.h │ ├── Utilities.cpp │ └── Version.cpp ├── fifo │ ├── FifoBuffer.cpp │ ├── FifoController.cpp │ ├── FifoController.h │ ├── FifoControllerBase.cpp │ ├── FifoControllerIndirect.cpp │ └── FifoControllerIndirect.h ├── flowgraph │ ├── ChannelCountConverter.cpp │ ├── ChannelCountConverter.h │ ├── ClipToRange.cpp │ ├── ClipToRange.h │ ├── FlowGraphNode.cpp │ ├── FlowGraphNode.h │ ├── FlowgraphUtilities.h │ ├── Limiter.cpp │ ├── Limiter.h │ ├── ManyToMultiConverter.cpp │ ├── ManyToMultiConverter.h │ ├── MonoBlend.cpp │ ├── MonoBlend.h │ ├── MonoToMultiConverter.cpp │ ├── MonoToMultiConverter.h │ ├── MultiToManyConverter.cpp │ ├── MultiToManyConverter.h │ ├── MultiToMonoConverter.cpp │ ├── MultiToMonoConverter.h │ ├── RampLinear.cpp │ ├── RampLinear.h │ ├── SampleRateConverter.cpp │ ├── SampleRateConverter.h │ ├── SinkFloat.cpp │ ├── SinkFloat.h │ ├── SinkI16.cpp │ ├── SinkI16.h │ ├── SinkI24.cpp │ ├── SinkI24.h │ ├── SinkI32.cpp │ ├── SinkI32.h │ ├── SinkI8_24.cpp │ ├── SinkI8_24.h │ ├── SourceFloat.cpp │ ├── SourceFloat.h │ ├── SourceI16.cpp │ ├── SourceI16.h │ ├── SourceI24.cpp │ ├── SourceI24.h │ ├── SourceI32.cpp │ ├── SourceI32.h │ ├── SourceI8_24.cpp │ ├── SourceI8_24.h │ └── resampler │ │ ├── HyperbolicCosineWindow.h │ │ ├── IntegerRatio.cpp │ │ ├── IntegerRatio.h │ │ ├── KaiserWindow.h │ │ ├── LinearResampler.cpp │ │ ├── LinearResampler.h │ │ ├── MultiChannelResampler.cpp │ │ ├── MultiChannelResampler.h │ │ ├── PolyphaseResampler.cpp │ │ ├── PolyphaseResampler.h │ │ ├── PolyphaseResamplerMono.cpp │ │ ├── PolyphaseResamplerMono.h │ │ ├── PolyphaseResamplerStereo.cpp │ │ ├── PolyphaseResamplerStereo.h │ │ ├── README.md │ │ ├── ResamplerDefinitions.h │ │ ├── SincResampler.cpp │ │ ├── SincResampler.h │ │ ├── SincResamplerStereo.cpp │ │ └── SincResamplerStereo.h └── opensles │ ├── AudioInputStreamOpenSLES.cpp │ ├── AudioInputStreamOpenSLES.h │ ├── AudioOutputStreamOpenSLES.cpp │ ├── AudioOutputStreamOpenSLES.h │ ├── AudioStreamBuffered.cpp │ ├── AudioStreamBuffered.h │ ├── AudioStreamOpenSLES.cpp │ ├── AudioStreamOpenSLES.h │ ├── EngineOpenSLES.cpp │ ├── EngineOpenSLES.h │ ├── OpenSLESUtilities.cpp │ ├── OpenSLESUtilities.h │ ├── OutputMixerOpenSLES.cpp │ └── OutputMixerOpenSLES.h └── tests ├── CMakeLists.txt ├── README.md ├── UnitTestRunner ├── .gitignore ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── .gitignore │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── google │ │ │ └── oboe │ │ │ └── tests │ │ │ └── unittestrunner │ │ │ └── MainActivity.java │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── run_tests.sh ├── testAAudio.cpp ├── testAudioClock.cpp ├── testFlowgraph.cpp ├── testFullDuplexStream.cpp ├── testResampler.cpp ├── testReturnStop.cpp ├── testReturnStopDeadlock.cpp ├── testStreamClosedMethods.cpp ├── testStreamFramesProcessed.cpp ├── testStreamOpen.cpp ├── testStreamStates.cpp ├── testStreamStop.cpp ├── testStreamWaitState.cpp ├── testUtilities.cpp └── testXRunBehaviour.cpp /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve Oboe 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | Android version(s): 11 | Android device(s): 12 | Oboe version: 13 | App name used for testing: 14 | (Please try to reproduce the issue using the OboeTester or an Oboe sample.) 15 | 16 | **Short description** 17 | (Please only report one bug per Issue. Do not combine multiple bugs.) 18 | 19 | **Steps to reproduce** 20 | 21 | **Expected behavior** 22 | 23 | **Actual behavior** 24 | 25 | **Device** 26 | 27 | Please list which devices have this bug. 28 | If device specific, and you are on Linux or a Macintosh, connect the device and please share the result for the following script. This gets properties of the device. 29 | 30 | ``` 31 | for p in \ 32 | ro.product.brand ro.product.manufacturer ro.product.model \ 33 | ro.product.device ro.product.cpu.abi ro.build.description \ 34 | ro.hardware ro.hardware.chipname ro.arch "| grep aaudio"; 35 | do echo "$p = $(adb shell getprop $p)"; done 36 | ``` 37 | 38 | **Any additional context** 39 | 40 | If applicable, please attach a few seconds of an uncompressed recording of the sound in a WAV or AIFF file. 41 | -------------------------------------------------------------------------------- /.github/workflows/build-ci.yml: -------------------------------------------------------------------------------- 1 | name: Build CI 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | permissions: 10 | contents: write 11 | security-events: write 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v4 19 | - name: set up JDK 17 20 | uses: actions/setup-java@v4 21 | with: 22 | distribution: 'temurin' 23 | java-version: 18 24 | - name: build samples and apps 25 | uses: github/codeql-action/init@v3 26 | with: 27 | languages: cpp 28 | - run: | 29 | pushd samples 30 | chmod +x gradlew 31 | ./gradlew -q clean bundleDebug 32 | popd 33 | pushd apps/OboeTester 34 | chmod +x gradlew 35 | ./gradlew -q clean bundleDebug 36 | popd 37 | pushd apps/fxlab 38 | chmod +x gradlew 39 | ./gradlew -q clean bundleDebug 40 | popd 41 | - name: Perform CodeQL Analysis 42 | uses: github/codeql-action/analyze@v3 43 | -------------------------------------------------------------------------------- /.github/workflows/update-docs.yml: -------------------------------------------------------------------------------- 1 | name: Update Docs 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | 7 | permissions: 8 | contents: write 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Doxygen Action 18 | uses: mattnotmitt/doxygen-action@v1.12.0 19 | with: 20 | doxyfile-path: "./Doxyfile" 21 | working-directory: "." 22 | 23 | - name: Deploy 24 | uses: peaceiris/actions-gh-pages@v4 25 | with: 26 | github_token: ${{ secrets.GITHUB_TOKEN }} 27 | publish_dir: ./docs/reference 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | */.DS_Store 2 | .DS_Store 3 | .externalNativeBuild/ 4 | .cxx/ 5 | .idea 6 | build 7 | .logpile 8 | 9 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | # This is the official list of authors for copyright purposes. 2 | # This file is distinct from the CONTRIBUTORS files. 3 | # See the latter for an explanation. 4 | 5 | # Names should be added to this file as: 6 | # Name or Organization <email address> 7 | # The email address is not required for organizations. 8 | 9 | Google Inc. 10 | -------------------------------------------------------------------------------- /CONTRIBUTORS: -------------------------------------------------------------------------------- 1 | # People who have agreed to one of the CLAs and can contribute patches. 2 | # The AUTHORS file lists the copyright holders; this file 3 | # lists people. For example, Google employees are listed here 4 | # but not in AUTHORS, because Google holds the copyright. 5 | # 6 | # https://developers.google.com/open-source/cla/individual 7 | # https://developers.google.com/open-source/cla/corporate 8 | # 9 | # Names should be added to this file as: 10 | # Name <email address> 11 | 12 | Phil Burk <philburk@google.com> 13 | Don Turner <donturner@google.com> 14 | Mikhail Naganov <mnaganov@google.com> 15 | -------------------------------------------------------------------------------- /MODULE_LICENSE_APACHE2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/MODULE_LICENSE_APACHE2 -------------------------------------------------------------------------------- /apps/OboeTester/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build/ 7 | .idea/ 8 | /app/build/ 9 | /app/release/ 10 | /app/debug/ 11 | /app/app.iml 12 | *.iml 13 | /app/externalNativeBuild/ 14 | -------------------------------------------------------------------------------- /apps/OboeTester/.google/packaging.yaml: -------------------------------------------------------------------------------- 1 | status: PUBLISHED 2 | technologies: [Android, NDK] 3 | categories: [NDK, C++] 4 | languages: [C++, Java] 5 | solutions: [Mobile] 6 | github: googlesamples/android-ndk 7 | license: apache2 8 | -------------------------------------------------------------------------------- /apps/OboeTester/README.md: -------------------------------------------------------------------------------- 1 | # Oboe Tester 2 | 3 | OboeTester is an app that can be used to test many of the features of Oboe, AAudio and OpenSL ES. 4 | It can also be used to measure device latency and glitches. 5 | 6 | # [OboeTester Documentation](docs) 7 | -------------------------------------------------------------------------------- /apps/OboeTester/app/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /apps/OboeTester/app/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Apr 11 16:29:30 PDT 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip 7 | -------------------------------------------------------------------------------- /apps/OboeTester/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/gfan/dev/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/cpp/OboeTools.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef OBOETESTER_OBOETOOLS_H 18 | #define OBOETESTER_OBOETOOLS_H 19 | 20 | #define NANOS_PER_MICROSECOND ((int64_t) 1000) 21 | #define NANOS_PER_MILLISECOND (1000 * NANOS_PER_MICROSECOND) 22 | #define NANOS_PER_SECOND (1000 * NANOS_PER_MILLISECOND) 23 | #define MILLISECONDS_PER_SECOND 1000 24 | 25 | #endif //OBOETESTER_OBOETOOLS_H 26 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/cpp/flowunits/ExponentialShape.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include <math.h> 18 | 19 | #include "ExponentialShape.h" 20 | 21 | ExponentialShape::ExponentialShape() 22 | : FlowGraphFilter(1) { 23 | } 24 | 25 | int32_t ExponentialShape::onProcess(int32_t numFrames) { 26 | float *inputs = input.getBuffer(); 27 | float *outputs = output.getBuffer(); 28 | 29 | for (int i = 0; i < numFrames; i++) { 30 | float normalizedPhase = (inputs[i] * 0.5) + 0.5; 31 | outputs[i] = mMinimum * powf(mRatio, normalizedPhase); 32 | } 33 | 34 | return numFrames; 35 | } 36 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/cpp/flowunits/OscillatorBase.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include "OscillatorBase.h" 18 | 19 | using namespace oboe::flowgraph; 20 | 21 | OscillatorBase::OscillatorBase() 22 | : frequency(*this, 1) 23 | , amplitude(*this, 1) 24 | , output(*this, 1) { 25 | setSampleRate(48000); 26 | } 27 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/cpp/flowunits/SineOscillator.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef FLOWGRAPH_SINE_OSCILLATOR_H 18 | #define FLOWGRAPH_SINE_OSCILLATOR_H 19 | 20 | #include <unistd.h> 21 | 22 | #include "OscillatorBase.h" 23 | 24 | /** 25 | * Oscillator that generates a sine wave at the specified frequency and amplitude. 26 | */ 27 | class SineOscillator : public OscillatorBase { 28 | public: 29 | SineOscillator(); 30 | 31 | int32_t onProcess(int32_t numFrames) override; 32 | }; 33 | 34 | #endif //FLOWGRAPH_SINE_OSCILLATOR_H 35 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/cpp/flowunits/WhiteNoise.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include <math.h> 18 | #include <unistd.h> 19 | 20 | #include "WhiteNoise.h" 21 | 22 | int32_t WhiteNoise::onProcess(int32_t numFrames) { 23 | const float *amplitudes = amplitude.getBuffer(); 24 | float *buffer = output.getBuffer(); 25 | 26 | for (int i = 0; i < numFrames; i++) { 27 | float noise = (float) mPseudoRandom.nextRandomDouble(); // -1 to +1 28 | *buffer++ = noise * (*amplitudes++); 29 | } 30 | 31 | return numFrames; 32 | } 33 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/java/com/mobileer/miditools/synth/SineVoice.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mobileer.miditools.synth; 18 | 19 | /** 20 | * Replace sawtooth with a sine wave. 21 | */ 22 | public class SineVoice extends SawVoice { 23 | public SineVoice(int sampleRate) { 24 | super(sampleRate); 25 | } 26 | 27 | @Override 28 | protected SawOscillator createOscillator() { 29 | return new SineOscillator(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/java/com/mobileer/oboetester/NativeEngine.java: -------------------------------------------------------------------------------- 1 | package com.mobileer.oboetester; 2 | 3 | public class NativeEngine { 4 | 5 | static native boolean isMMapSupported(); 6 | 7 | static native boolean isMMapExclusiveSupported(); 8 | 9 | static native void setWorkaroundsEnabled(boolean enabled); 10 | 11 | static native boolean areWorkaroundsEnabled(); 12 | 13 | static native int getCpuCount(); 14 | 15 | static native void setCpuAffinityMask(int mask); 16 | 17 | static native void setWorkloadReportingEnabled(boolean enabled); 18 | 19 | static native void setNotifyWorkloadIncreaseEnabled(boolean enabled); 20 | } 21 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/java/com/mobileer/oboetester/OboeAudioInputStream.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mobileer.oboetester; 18 | 19 | class OboeAudioInputStream extends OboeAudioStream { 20 | 21 | @Override 22 | public boolean isInput() { 23 | return true; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/java/com/mobileer/oboetester/OboeAudioOutputStream.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mobileer.oboetester; 18 | 19 | /** 20 | * Native synthesizer and audio output. 21 | */ 22 | public class OboeAudioOutputStream extends OboeAudioStream { 23 | 24 | @Override 25 | public boolean isInput() { 26 | return false; 27 | } 28 | 29 | public native void trigger(); 30 | 31 | public native void setChannelEnabled(int channelIndex, boolean enabled); 32 | 33 | public native void setSignalType(int type); 34 | 35 | public native void setAmplitude(float amplitude); 36 | } 37 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/drawable/button_shape.xml: -------------------------------------------------------------------------------- 1 | <shape xmlns:android="http://schemas.android.com/apk/res/android" android:padding="16dp" 2 | android:shape="rectangle"> 3 | <corners android:radius="6dp" /> 4 | <gradient android:angle="270" android:endColor="#d0e06E" android:startColor="#a07FCE" /> 5 | <stroke android:width="1px" android:color="#050875" /> 6 | </shape> 7 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/layout/activity_device_report.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:orientation="vertical" 7 | android:paddingBottom="@dimen/activity_vertical_margin" 8 | android:paddingLeft="@dimen/activity_horizontal_margin" 9 | android:paddingRight="@dimen/activity_horizontal_margin" 10 | android:paddingTop="@dimen/activity_vertical_margin" 11 | tools:context="com.mobileer.oboetester.DeviceReportActivity"> 12 | 13 | <ScrollView 14 | android:id="@+id/text_log_device_scroller" 15 | android:layout_width="wrap_content" 16 | android:layout_height="wrap_content"> 17 | <TextView 18 | android:id="@+id/text_log_device_report" 19 | android:layout_width="match_parent" 20 | android:layout_height="match_parent" 21 | android:fontFamily="monospace" 22 | android:gravity="bottom" 23 | android:scrollbars="vertical" 24 | android:text="@string/device_report" 25 | /> 26 | </ScrollView> 27 | 28 | </LinearLayout> 29 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/layout/audio_devices.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright (C) 2017 The Android Open Source Project 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ http://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | <TextView xmlns:android="http://schemas.android.com/apk/res/android" 18 | android:id="@+id/device_name" 19 | android:layout_width="match_parent" 20 | android:layout_height="wrap_content" 21 | android:fontFamily="sans-serif" 22 | android:text="Device Name" /> 23 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/layout/sample_fast_button.xml: -------------------------------------------------------------------------------- 1 | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res/com.mobileer.oboetester" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent"> 5 | 6 | <com.mobileer.oboetester.FastButton 7 | android:layout_width="300dp" 8 | android:layout_height="300dp" 9 | android:background="#ccc" 10 | android:paddingBottom="40dp" 11 | android:paddingLeft="20dp" 12 | app:exampleColor="#33b5e5" 13 | app:exampleDimension="24sp" 14 | app:exampleDrawable="@android:drawable/ic_menu_add" 15 | app:exampleString="Hello, FastButton" /> 16 | 17 | </FrameLayout> 18 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/layout/sample_multi_line_chart.xml: -------------------------------------------------------------------------------- 1 | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent"> 5 | 6 | <com.mobileer.oboetester.MultiLineChart 7 | style="@style/Widget.AppTheme.MyView" 8 | android:layout_width="300dp" 9 | android:layout_height="300dp" 10 | android:paddingLeft="20dp" 11 | android:paddingBottom="40dp" 12 | app:exampleDimension="24sp" 13 | app:exampleDrawable="@android:drawable/ic_menu_add" 14 | app:exampleString="Hello, MultiLineChart" /> 15 | 16 | </FrameLayout> -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/layout/workload_view.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:orientation="vertical" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent"> 6 | 7 | <TextView 8 | android:id="@+id/textWorkload" 9 | android:layout_width="wrap_content" 10 | android:layout_height="wrap_content" 11 | android:text="Workload" /> 12 | 13 | <SeekBar 14 | android:id="@+id/faderWorkload" 15 | android:layout_width="match_parent" 16 | android:layout_height="wrap_content" 17 | android:max="1000" 18 | android:progress="0" /> 19 | 20 | </LinearLayout> 21 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto"> 3 | <item 4 | android:id="@+id/action_share" 5 | android:orderInCategory="100" 6 | android:title="@string/share" 7 | app:showAsAction="never" /> 8 | 9 | </menu> 10 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background"/> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground"/> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background"/> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground"/> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/raw/sine441stereo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/app/src/main/res/raw/sine441stereo.mp3 -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values-w600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Example customization of dimensions originally defined in res/values/dimens.xml 3 | (such as screen margins) for screens with more than 600dp of available width. This 4 | would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 5 | <dimen name="activity_horizontal_margin">64dp</dimen> 6 | 7 | <dimen name="big_font_size">20dp</dimen> 8 | </resources> 9 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | </resources> 4 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/attrs_exponential_slider.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Copyright (C) 2025 The Android Open Source Project 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | --> 16 | 17 | <resources> 18 | <declare-styleable name="ExponentialSliderView"> 19 | <attr name="sliderLabel" format="string" /> 20 | <attr name="minValue" format="float" /> 21 | <attr name="maxValue" format="float" /> 22 | <attr name="exponent" format="float" /> 23 | <attr name="defaultValue" format="integer" /> 24 | </declare-styleable> 25 | </resources> 26 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/attrs_fast_button.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <declare-styleable name="FastButton"> 3 | <attr name="fastString" format="string" /> 4 | <attr name="fastDimension" format="dimension" /> 5 | <attr name="fastColor" format="color" /> 6 | <attr name="fastDrawable" format="color|reference" /> 7 | </declare-styleable> 8 | </resources> 9 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/attrs_multi_line_chart.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <declare-styleable name="MultiLineChart"> 3 | <attr name="exampleString" format="string" /> 4 | <attr name="exampleDimension" format="dimension" /> 5 | <attr name="exampleColor" format="color" /> 6 | <attr name="lineColor" format="color" /> 7 | <attr name="backgroundColor" format="color" /> 8 | <attr name="exampleDrawable" format="color|reference" /> 9 | </declare-styleable> 10 | </resources> -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/attrs_waveform.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Copyright (C) 2013 The Android Open Source Project 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | --> 16 | 17 | <resources> 18 | <declare-styleable name="WaveformView"> 19 | <attr name="showZero" 20 | format="boolean" /> 21 | </declare-styleable> 22 | </resources> 23 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Default screen margins, per the Android Design guidelines. --> 3 | <dimen name="activity_horizontal_margin">16dp</dimen> 4 | <dimen name="activity_vertical_margin">16dp</dimen> 5 | <dimen name="small_horizontal_margin">6dp</dimen> 6 | <dimen name="small_vertical_margin">6dp</dimen> 7 | <dimen name="waveform_stroke_width">2.0dp</dimen> 8 | 9 | <dimen name="big_font_size">90dp</dimen> 10 | </resources> 11 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="Theme.AppCompat.Light"> 5 | <!-- Customize your theme here. --> 6 | </style> 7 | 8 | <style name="Widget.AppTheme.MyView" parent=""> 9 | <item name="android:background">@color/gray_400</item> 10 | <item name="exampleColor">@color/light_blue_400</item> 11 | </style> 12 | 13 | </resources> 14 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/xml/button_color_selector.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:state_pressed="true" android:color="#3f000000"/> 4 | <item android:state_focused="true" android:color="#0f000000"/> 5 | </selector> 6 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <paths xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <external-path name="external_files" path="."/> 4 | </paths> 5 | -------------------------------------------------------------------------------- /apps/OboeTester/app/src/main/res/xml/service_device_info.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Copyright (C) 2015 The Android Open Source Project 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | http://www.apache.org/licenses/LICENSE-2.0 7 | Unless required by applicable law or agreed to in writing, software 8 | distributed under the License is distributed on an "AS IS" BASIS, 9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | See the License for the specific language governing permissions and 11 | limitations under the License. 12 | --> 13 | 14 | <devices> 15 | <!-- These must match the values in MidiTaptester.java --> 16 | <device manufacturer="Mobileer" product="MidiTapLatencyTester"> 17 | <input-port name="input" /> 18 | </device> 19 | </devices> 20 | -------------------------------------------------------------------------------- /apps/OboeTester/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | google() 6 | jcenter() 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:8.5.1' 10 | } 11 | } 12 | 13 | allprojects { 14 | repositories { 15 | google() 16 | jcenter() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/OboeTester/docs/README.md: -------------------------------------------------------------------------------- 1 | # OboeTester Documentation 2 | 3 | OboeTester is an app that can be used to test many of the features of Oboe, AAudio and OpenSL ES. 4 | It can also be used to test Android devices, measure latency and glitches, etc. 5 | 6 | OboeTester can be run as an interactive app. 7 | It can also be run as part of an [automated test using Intents](AutomatedTesting.md) 8 | 9 | ## Install OboeTester 10 | 11 | You have two options: 12 | 1) Download OboeTester from the [Play Store](https://play.google.com/store/apps/details?id=com.mobileer.oboetester) 13 | 2) OR [build the latest version of OboeTester using Android Studio](Build.md) 14 | 15 | ## [How to Use OboeTester Interactively](Usage.md) 16 | 17 | ## [Automated Testing with OboeTester](AutomatedTesting.md) 18 | 19 | -- [Privacy Policy](PrivacyPolicy.md) -- 20 | -------------------------------------------------------------------------------- /apps/OboeTester/docs/TestOutput.md: -------------------------------------------------------------------------------- 1 | # Test Output 2 | 3 | DRAFT for testing image embedding. 4 | 5 | 6 | <table style="width:100%"> 7 | <tr> 8 | <th>Notes</th> 9 | <th>Screenshot</th> 10 | </tr> 11 | <tr> 12 | <td> 13 | Tap on the green bar to hide or show the detailed settings dialog.<br/> 14 | The resulting setting will displayed on the far right when the stream is opened.<br/> 15 | API: select between OpenSL ES or AAudio (default)<br/> 16 | Device: setect output device by type.<br/> 17 | Format: note that the 24 and 32-bit formats are only supported in Android 12+. MP3 is only supported on Android 16+. The test uses a 44.1kHz stereo MP3 file for playback. The stream must be configured as 44.1kHz stereo selecting MP3 format.<br/> 18 | MMAP: will be disabled if device does not support MMAP<br/> 19 | Effect: will enable a simple effect, may prevent LOW_LATENCY<br/> 20 | Convert: conversion done in Oboe may allow you to get LOW_LATENCY<br/> 21 | SRC: sample rate conversion quality<br/> 22 | <br/><br/><br/><br/><br/><br/><br/><br/> 23 | </td> 24 | <td><img src="/apps/OboeTester/docs/images/test_output.png" width=400></td> 25 | </tr> 26 | </table> 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/auto_glitch_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/auto_glitch_test.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/echo_input_output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/echo_input_output.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/main_activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/main_activity.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/recorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/recorder.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/round_trip_latency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/round_trip_latency.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/tap_to_tone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/tap_to_tone.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/test_glitches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/test_glitches.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/test_input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/test_input.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/test_output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/test_output.png -------------------------------------------------------------------------------- /apps/OboeTester/docs/images/test_output_running.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/docs/images/test_output_running.png -------------------------------------------------------------------------------- /apps/OboeTester/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/OboeTester/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /apps/OboeTester/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Aug 03 13:45:58 PDT 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip 7 | -------------------------------------------------------------------------------- /apps/OboeTester/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /apps/fxlab/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | -------------------------------------------------------------------------------- /apps/fxlab/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are 4 | just a few small guidelines you need to follow. 5 | 6 | ## Code reviews 7 | 8 | All submissions, including submissions by project members, require review. We 9 | use GitHub pull requests for this purpose. Consult 10 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 11 | information on using pull requests. 12 | 13 | ## Community Guidelines 14 | 15 | This project follows [Google's Open Source Community 16 | Guidelines](https://opensource.google.com/conduct/). 17 | -------------------------------------------------------------------------------- /apps/fxlab/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /apps/fxlab/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/effects/EchoEffect.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #ifndef ANDROID_FXLAB_ECHOEFFECT_H 17 | #define ANDROID_FXLAB_ECHOEFFECT_H 18 | 19 | #include "DelayLineEffect.h" 20 | #include "utils/WhiteNoise.h" 21 | 22 | 23 | template <class iter_type> 24 | class EchoEffect: public DelayLineEffect<iter_type> { 25 | public: 26 | EchoEffect(float feedback, float delay_ms): 27 | DelayLineEffect<iter_type> {1, 0, feedback, 28 | static_cast<int>(delay_ms * SAMPLE_RATE / 1000), 29 | 0, 30 | std::function<float()>{[](){return 0.0;}}} 31 | {} 32 | }; 33 | #endif //ANDROID_FXLAB_ECHOEFFECT_H 34 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/effects/FlangerEffect.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #ifndef ANDROID_FXLAB_FLANGEREFFECT_H 17 | #define ANDROID_FXLAB_FLANGEREFFECT_H 18 | 19 | #include "DelayLineEffect.h" 20 | 21 | template<class iter_type> 22 | class FlangerEffect : public DelayLineEffect<iter_type> { 23 | public: 24 | // feedback should be 0.7071 25 | FlangerEffect(float depth_ms, float frequency, float feedback): 26 | DelayLineEffect<iter_type>(feedback, feedback, feedback, 0, depth_ms * SAMPLE_RATE / 1000, 27 | SineWave {frequency, 1, SAMPLE_RATE}) { } 28 | }; 29 | #endif //ANDROID_FXLAB_FLANGEREFFECT_H 30 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/effects/SlapbackEffect.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef ANDROID_FXLAB_SLAPBACKEFFECT_H 18 | #define ANDROID_FXLAB_SLAPBACKEFFECT_H 19 | 20 | template <class iter_type> 21 | class SlapbackEffect: public DelayLineEffect<iter_type> { 22 | public: 23 | SlapbackEffect(float feedforward, float delay_ms): 24 | DelayLineEffect<iter_type> {1, feedforward, 0, 25 | static_cast<int>(delay_ms * SAMPLE_RATE / 1000), 26 | 0, 27 | std::function<float()>{[](){return 0.0;}}} 28 | {} 29 | }; 30 | #endif //ANDROID_FXLAB_SLAPBACKEFFECT_H 31 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/effects/VibratroEffect.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #ifndef ANDROID_FXLAB_VIBRATROEFFECT_H 17 | #define ANDROID_FXLAB_VIBRATROEFFECT_H 18 | 19 | #include "DelayLineEffect.h" 20 | template <class iter_type> 21 | class VibratoEffect : public DelayLineEffect<iter_type> { 22 | public: 23 | VibratoEffect(float depth_ms, float frequency): 24 | DelayLineEffect<iter_type>(0, 1, 0, 1, depth_ms * SAMPLE_RATE / 1000, 25 | SineWave {frequency, 1, SAMPLE_RATE}) { } 26 | }; 27 | #endif //ANDROID_FXLAB_VIBRATROEFFECT_H 28 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/effects/descrip/DoublingDescription.h: -------------------------------------------------------------------------------- 1 | #ifndef ANDROID_FXLAB_DOUBLINGDESCRIPTION_H 2 | #define ANDROID_FXLAB_DOUBLINGDESCRIPTION_H 3 | 4 | #include "EffectDescription.h" 5 | #include "../DoublingEffect.h" 6 | 7 | namespace Effect { 8 | class DoublingDescription: public EffectDescription<DoublingDescription, 3> { 9 | public: 10 | static constexpr std::string_view getName() { 11 | return std::string_view("Doubling"); 12 | } 13 | 14 | static constexpr std::string_view getCategory() { 15 | return std::string_view("Delay"); 16 | } 17 | 18 | static constexpr std::array<ParamType, getNumParams()> getParams() { 19 | return std::array<ParamType, getNumParams()> { 20 | ParamType("Depth (ms)", 10, 100, 40), 21 | ParamType("Delay (ms)", 1, 100, 40), 22 | ParamType("Noise pass", 1, 10, 4), 23 | }; 24 | } 25 | template<class iter_type> 26 | static _ef<iter_type> buildEffect(std::array<float, getNumParams()> paramArr) { 27 | return _ef<iter_type> { 28 | DoublingEffect<iter_type>{paramArr[0], paramArr[1], paramArr[2]} 29 | }; 30 | } 31 | }; 32 | } //namespace Effect 33 | #endif //ANDROID_FXLAB_DOUBLINGDESCRIPTION_H 34 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/effects/utils/SineWave.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef ANDROID_FXLAB_SINEWAVE_H 18 | #define ANDROID_FXLAB_SINEWAVE_H 19 | 20 | #include "PhaseAccumulator.h" 21 | 22 | class SineWave { 23 | public: 24 | // freq in hz 25 | SineWave(float frequency, float amplitude, int sampleRate): 26 | mPhasor(frequency, sampleRate), 27 | kAmplitude(amplitude) { } 28 | 29 | float operator() () { 30 | return kAmplitude * sinf(mPhasor.incrementPhase()); 31 | } 32 | 33 | private: 34 | PhaseAccumulator mPhasor; 35 | const float kAmplitude; 36 | }; 37 | #endif //ANDROID_FXLAB_SINEWAVE_H 38 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/tests/.gitignore: -------------------------------------------------------------------------------- 1 | CMakeFiles/ 2 | CMakeCache.txt 3 | cmake_install.cmake 4 | Makefile 5 | runTests 6 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/tests/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22.1) 2 | 3 | project(Effects_Tests) 4 | # We need C++17 to test 5 | set(CMAKE_CXX_STANDARD 17) 6 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 7 | set(CMAKE_CXX_EXTENSIONS OFF) 8 | 9 | # Locate GTest 10 | find_package(GTest REQUIRED) 11 | include_directories(${GTEST_INCLUDE_DIRS}) 12 | 13 | # Link runTests with what we want to test and the GTest and pthread library 14 | add_executable(runTests testEffects.cpp) 15 | target_link_libraries(runTests ${GTEST_LIBRARIES} pthread) 16 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/cpp/tests/testEffects.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 18 | #include <gtest/gtest.h> 19 | 20 | #include "DelayLineTest.h" 21 | #include "DelayLineEffectTest.h" 22 | #include "TypeTests.h" 23 | // This is the runner for the various unit tests in the test directory 24 | // Currently it is designed to be run on the development machine via CMAKE 25 | // Since this tests effects, it should be independent of Android, and simply test locally 26 | int main(int argc, char **argv) { 27 | ::testing::InitGoogleTest(&argc, argv); 28 | return RUN_ALL_TESTS(); 29 | } 30 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/kotlin/com/mobileer/androidfxlab/datatype/Effect.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mobileer.androidfxlab.datatype 18 | 19 | /** 20 | * Class which represents an audio effect 21 | */ 22 | data class Effect(val effectDescription: EffectDescription) { 23 | val name = effectDescription.name 24 | val paramValues = FloatArray(effectDescription.paramValues.size) { 25 | i -> effectDescription.paramValues[i].defaultValue 26 | } 27 | var enable: Boolean = true 28 | } 29 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/kotlin/com/mobileer/androidfxlab/datatype/EffectDescription.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mobileer.androidfxlab.datatype 18 | 19 | data class EffectDescription( 20 | val name: String, 21 | val category: String, 22 | val id: Int, 23 | val paramValues: Array<ParamDescription> 24 | ) { 25 | override fun equals(other: Any?): Boolean { 26 | if (this === other) return true 27 | if (javaClass != other?.javaClass) return false 28 | other as EffectDescription 29 | if (id != other.id) return false 30 | return true 31 | } 32 | override fun hashCode(): Int = id 33 | } 34 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/kotlin/com/mobileer/androidfxlab/datatype/ParamDescription.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mobileer.androidfxlab.datatype 18 | 19 | data class ParamDescription ( 20 | val paramName: String, 21 | val minValue: Float, 22 | val maxValue: Float, 23 | val defaultValue: Float) 24 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | <!-- 2 | ~ Copyright 2019 Google LLC 3 | ~ 4 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 5 | ~ you may not use this file except in compliance with the License. 6 | ~ You may obtain a copy of the License at 7 | ~ 8 | ~ https://www.apache.org/licenses/LICENSE-2.0 9 | ~ 10 | ~ Unless required by applicable law or agreed to in writing, software 11 | ~ distributed under the License is distributed on an "AS IS" BASIS, 12 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | ~ See the License for the specific language governing permissions and 14 | ~ limitations under the License. 15 | --> 16 | 17 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 18 | android:width="24dp" 19 | android:height="24dp" 20 | android:viewportWidth="24" 21 | android:viewportHeight="24"> 22 | <path 23 | android:fillColor="#FF000000" 24 | android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> 25 | </vector> 26 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/drawable/ic_baseline_audio_is_disabled_24.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0" 6 | android:tint="?attr/colorControlNormal"> 7 | <path 8 | android:fillColor="@android:color/white" 9 | android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z"/> 10 | </vector> 11 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/drawable/ic_baseline_audio_is_enabled_24.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0" 6 | android:tint="?attr/colorControlNormal"> 7 | <path 8 | android:fillColor="@android:color/white" 9 | android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"/> 10 | </vector> 11 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/menu/add_menu.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright 2019 Google LLC 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ https://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | 18 | <menu> 19 | </menu> 20 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/menu/toolbar_menu.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <!-- Add a mute toggle action to our Toolbar--> 6 | <item 7 | android:id="@+id/action_toggle_mute" 8 | android:icon="@drawable/ic_baseline_audio_is_disabled_24" 9 | android:title="@string/action_toggle_mute" 10 | app:showAsAction="ifRoom" 11 | /> 12 | </menu> 13 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright 2019 Google LLC 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ https://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | 18 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 19 | <background android:drawable="@drawable/ic_launcher_background"/> 20 | <foreground android:drawable="@drawable/ic_launcher_foreground"/> 21 | </adaptive-icon> -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright 2019 Google LLC 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ https://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | 18 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 19 | <background android:drawable="@drawable/ic_launcher_background"/> 20 | <foreground android:drawable="@drawable/ic_launcher_foreground"/> 21 | </adaptive-icon> -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright 2019 Google LLC 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ https://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | 18 | <resources> 19 | <color name="colorPrimary">#6200EE</color> 20 | <color name="colorPrimaryDark">#3700B3</color> 21 | <color name="colorAccent">#03DAC6</color> 22 | <color name="colorAccentDark">#018786</color> 23 | </resources> 24 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <!-- 2 | ~ Copyright 2019 Google LLC 3 | ~ 4 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 5 | ~ you may not use this file except in compliance with the License. 6 | ~ You may obtain a copy of the License at 7 | ~ 8 | ~ https://www.apache.org/licenses/LICENSE-2.0 9 | ~ 10 | ~ Unless required by applicable law or agreed to in writing, software 11 | ~ distributed under the License is distributed on an "AS IS" BASIS, 12 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | ~ See the License for the specific language governing permissions and 14 | ~ limitations under the License. 15 | --> 16 | 17 | <resources> 18 | <string name="app_name">AndroidFX Lab</string> 19 | <string name="action_toggle_mute">Toggle volume</string> 20 | </resources> 21 | -------------------------------------------------------------------------------- /apps/fxlab/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <!-- 2 | ~ Copyright 2019 Google LLC 3 | ~ 4 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 5 | ~ you may not use this file except in compliance with the License. 6 | ~ You may obtain a copy of the License at 7 | ~ 8 | ~ https://www.apache.org/licenses/LICENSE-2.0 9 | ~ 10 | ~ Unless required by applicable law or agreed to in writing, software 11 | ~ distributed under the License is distributed on an "AS IS" BASIS, 12 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | ~ See the License for the specific language governing permissions and 14 | ~ limitations under the License. 15 | --> 16 | 17 | <resources> 18 | 19 | <!-- Base application theme. --> 20 | <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> 21 | <!-- Customize your theme here. --> 22 | <item name="colorPrimary">@color/colorPrimary</item> 23 | <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 24 | <item name="colorAccent">@color/colorAccent</item> 25 | </style> 26 | 27 | </resources> 28 | -------------------------------------------------------------------------------- /apps/fxlab/docs/Presentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/docs/Presentation.pdf -------------------------------------------------------------------------------- /apps/fxlab/docs/README.md: -------------------------------------------------------------------------------- 1 | # Docs for Android FX Lab 2 | 3 | * [How to Build the App](Dev-Guide.md) 4 | * [Slides for Internal Architecture (PDF)](Presentation.pdf) 5 | -------------------------------------------------------------------------------- /apps/fxlab/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /apps/fxlab/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Mar 11 13:58:39 EDT 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /apps/fxlab/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/apps/fxlab/screenshot.png -------------------------------------------------------------------------------- /apps/fxlab/settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | include ':app' 18 | -------------------------------------------------------------------------------- /docs/PrivacyPolicy.md: -------------------------------------------------------------------------------- 1 | [Home](README.md) 2 | 3 | # Oboe Privacy Policy 4 | 5 | Oboe is a library that simply passes audio between the application and the native Android APIs. 6 | 7 | Oboe does not collect any user data or information. 8 | 9 | Oboe does not create Cookies. 10 | 11 | Oboe is considered "kid safe". 12 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | Oboe documentation 2 | === 3 | - [Android Audio History](AndroidAudioHistory.md) 4 | - [API reference](https://google.github.io/oboe/) 5 | - [Apps using Oboe](https://github.com/google/oboe/wiki/AppsUsingOboe) 6 | - [FAQs](FAQ.md) 7 | - [Full Guide to Oboe](FullGuide.md) 8 | - [Getting Started with Oboe](GettingStarted.md) 9 | - [Privacy Policy](PrivacyPolicy.md) 10 | - [Releases](https://github.com/google/oboe/releases) 11 | - [Wiki](https://github.com/google/oboe/wiki) 12 | -------------------------------------------------------------------------------- /docs/images/cmakelists-location-in-as.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/docs/images/cmakelists-location-in-as.png -------------------------------------------------------------------------------- /docs/images/getting-started-video.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/docs/images/getting-started-video.jpg -------------------------------------------------------------------------------- /docs/images/oboe-lifecycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/docs/images/oboe-lifecycle.png -------------------------------------------------------------------------------- /docs/images/oboe-sharing-mode-exclusive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/docs/images/oboe-sharing-mode-exclusive.jpg -------------------------------------------------------------------------------- /docs/images/oboe-sharing-mode-shared.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/docs/images/oboe-sharing-mode-shared.jpg -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Home 4 | --- 5 | Oboe is an audio library for Android. 6 | -------------------------------------------------------------------------------- /prefab/oboe-VERSION.pom: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" 3 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4 | <groupId>com.google.oboe</groupId> 5 | <artifactId>oboe</artifactId> 6 | <version>VERSION</version> 7 | <packaging>aar</packaging> 8 | <name>oboe</name> 9 | <description>The AAR for Oboe.</description> 10 | <url>https://github.com/google/oboe</url> 11 | <licenses> 12 | <license> 13 | <name>The Oboe License</name> 14 | <url>https://github.com/google/oboe/blob/main/LICENSE</url> 15 | <distribution>repo</distribution> 16 | </license> 17 | </licenses> 18 | <developers> 19 | <developer> 20 | <name>The Android Open Source Project</name> 21 | </developer> 22 | </developers> 23 | <scm> 24 | <connection>scm:git:https://github.com/google/oboe</connection> 25 | <url>https://github.com/google/oboe</url> 26 | </scm> 27 | </project> 28 | -------------------------------------------------------------------------------- /prefab/oboe-VERSION/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.oboe"> 2 | <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33"/> 3 | </manifest> 4 | -------------------------------------------------------------------------------- /prefab/oboe-VERSION/prefab/modules/oboe/libs/android.arm64-v8a/abi.json: -------------------------------------------------------------------------------- 1 | {"abi":"arm64-v8a","api":21,"ndk":21,"stl":"c++_shared"} -------------------------------------------------------------------------------- /prefab/oboe-VERSION/prefab/modules/oboe/libs/android.armeabi-v7a/abi.json: -------------------------------------------------------------------------------- 1 | {"abi":"armeabi-v7a","api":16,"ndk":21,"stl":"c++_shared"} -------------------------------------------------------------------------------- /prefab/oboe-VERSION/prefab/modules/oboe/libs/android.x86/abi.json: -------------------------------------------------------------------------------- 1 | {"abi":"x86","api":16,"ndk":21,"stl":"c++_shared"} -------------------------------------------------------------------------------- /prefab/oboe-VERSION/prefab/modules/oboe/libs/android.x86_64/abi.json: -------------------------------------------------------------------------------- 1 | {"abi":"x86_64","api":21,"ndk":21,"stl":"c++_shared"} -------------------------------------------------------------------------------- /prefab/oboe-VERSION/prefab/modules/oboe/module.json: -------------------------------------------------------------------------------- 1 | { 2 | "export_libraries": [], 3 | "library_name": null, 4 | "android": { 5 | "export_libraries": [], 6 | "library_name": null 7 | } 8 | } -------------------------------------------------------------------------------- /prefab/oboe-VERSION/prefab/prefab.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_version": 1, 3 | "name": "oboe", 4 | "version": "VERSION", 5 | "dependencies": [] 6 | } 7 | -------------------------------------------------------------------------------- /samples/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | test/build 11 | -------------------------------------------------------------------------------- /samples/LiveEffect/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/LiveEffect/screenshot.png -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/LiveEffect/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/LiveEffect/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/LiveEffect/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/LiveEffect/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <style name="AppTheme" parent="android:Theme.Material.Light"> 4 | </style> 5 | </resources> 6 | -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Example customization of dimensions originally defined in res/values/dimens.xml 3 | (such as screen margins) for screens with more than 820dp of available width. This 4 | would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 5 | <dimen name="activity_horizontal_margin">64dp</dimen> 6 | </resources> 7 | -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <color name="colorBlue">#4444CC</color> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Default screen margins, per the Android Design guidelines. --> 3 | <dimen name="activity_horizontal_margin">16dp</dimen> 4 | <dimen name="activity_vertical_margin">16dp</dimen> 5 | <dimen name="activity_vertical_group_margin">32dp</dimen> 6 | </resources> 7 | -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">LiveEffect</string> 3 | <string name="action_settings">Settings</string> 4 | <string name="start_effect">Start</string> 5 | <string name="stop_effect">Stop</string> 6 | <string name="need_record_audio_permission">"This sample needs RECORD_AUDIO permission"</string> 7 | <string name="status_playing">Engine Playing ....</string> 8 | <string name="status_open_failed">Engine Failed to Open Streams!</string> 9 | <string name="status_record_audio_denied">Error: Permission for RECORD_AUDIO was denied</string> 10 | <string name="status_touch_to_begin">RECORD_AUDIO permission granted, touch START to begin</string> 11 | <string name="status_warning">Warning: If you run this sample using the built-in microphone 12 | and speaker you may create a feedback loop which will not be pleasant to listen to.</string> 13 | <string name="recording_device">Recording device</string> 14 | <string name="playback_device">Playback device</string> 15 | 16 | <string name="apiSelection">APIs</string> 17 | <string name="aaudio">AAudio</string> 18 | <string name="sles">OpenSL ES</string> 19 | </resources> 20 | -------------------------------------------------------------------------------- /samples/LiveEffect/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 5 | <!-- Customize your theme here. --> 6 | </style> 7 | 8 | </resources> 9 | -------------------------------------------------------------------------------- /samples/MegaDrone/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /samples/MegaDrone/megadrone-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/megadrone-screenshot.png -------------------------------------------------------------------------------- /samples/MegaDrone/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <application 5 | android:allowBackup="true" 6 | android:icon="@mipmap/ic_launcher" 7 | android:label="@string/app_name" 8 | android:roundIcon="@mipmap/ic_launcher_round" 9 | android:supportsRtl="true" 10 | android:theme="@style/AppTheme"> 11 | <activity android:name="com.google.oboe.samples.megadrone.MainActivity" 12 | android:screenOrientation="portrait" 13 | android:exported="true"> 14 | <intent-filter> 15 | <action android:name="android.intent.action.MAIN" /> 16 | 17 | <category android:name="android.intent.category.LAUNCHER" /> 18 | </intent-filter> 19 | </activity> 20 | </application> 21 | 22 | </manifest> 23 | -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22.1) 2 | 3 | 4 | ### INCLUDE OBOE LIBRARY ### 5 | 6 | # Set the path to the Oboe library directory 7 | set (OBOE_DIR ../../../../..) 8 | 9 | # Add the Oboe library as a subproject. Since Oboe is an out-of-tree source library we must also 10 | # specify a binary directory 11 | add_subdirectory(${OBOE_DIR} ./oboe-bin) 12 | 13 | # Include the Oboe headers 14 | include_directories(${OBOE_DIR}/include ${OBOE_DIR}/samples/shared ${OBOE_DIR}/samples/debug-utils) 15 | 16 | 17 | ### END OBOE INCLUDE SECTION ### 18 | 19 | add_library( megadrone SHARED 20 | native-lib.cpp 21 | MegaDroneEngine.cpp 22 | ) 23 | 24 | target_link_libraries(megadrone log oboe ) 25 | target_link_options(megadrone PRIVATE "-Wl,-z,max-page-size=16384") 26 | 27 | # Enable optimization flags: if having problems with source level debugging, 28 | # disable -Ofast ( and debug ), re-enable it after done debugging. 29 | target_compile_options(megadrone PRIVATE -Wall -Werror -Ofast) 30 | -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | tools:context=".MainActivity"> 8 | 9 | <TextView 10 | android:id="@+id/sample_text" 11 | android:layout_width="wrap_content" 12 | android:layout_height="wrap_content" 13 | android:text="Tap anywhere to play" 14 | app:layout_constraintBottom_toBottomOf="parent" 15 | app:layout_constraintLeft_toLeftOf="parent" 16 | app:layout_constraintRight_toRightOf="parent" 17 | app:layout_constraintTop_toTopOf="parent" /> 18 | 19 | </androidx.constraintlayout.widget.ConstraintLayout> 20 | -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/MegaDrone/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorPrimary">#008577</color> 4 | <color name="colorPrimaryDark">#00574B</color> 5 | <color name="colorAccent">#D81B60</color> 6 | </resources> 7 | -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">Mega Drone</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/MegaDrone/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 5 | <!-- Customize your theme here. --> 6 | <item name="colorPrimary">@color/colorPrimary</item> 7 | <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 8 | <item name="colorAccent">@color/colorAccent</item> 9 | </style> 10 | 11 | </resources> 12 | -------------------------------------------------------------------------------- /samples/RhythmGame/images/1-timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/1-timeline.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/2-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/2-architecture.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/3-audioData.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/3-audioData.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/4-audio-rendering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/4-audio-rendering.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/5-lockfreequeue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/5-lockfreequeue.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/6-audio-ui-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/6-audio-ui-sync.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/7-tap-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/7-tap-window.png -------------------------------------------------------------------------------- /samples/RhythmGame/images/RhythmGame-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/images/RhythmGame-screenshot.png -------------------------------------------------------------------------------- /samples/RhythmGame/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <application 5 | android:allowBackup="true" 6 | android:icon="@mipmap/ic_launcher" 7 | android:label="@string/app_name" 8 | android:roundIcon="@mipmap/ic_launcher_round" 9 | android:supportsRtl="true" 10 | android:theme="@style/AppTheme"> 11 | <activity android:name=".MainActivity" 12 | android:screenOrientation="portrait" 13 | android:exported="true"> 14 | <intent-filter> 15 | <action android:name="android.intent.action.MAIN" /> 16 | 17 | <category android:name="android.intent.category.LAUNCHER" /> 18 | </intent-filter> 19 | </activity> 20 | </application> 21 | 22 | </manifest> 23 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/assets/CLAP.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/assets/CLAP.mp3 -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/assets/FUNKY_HOUSE.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/assets/FUNKY_HOUSE.mp3 -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/cpp/audio/DataSource.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef RHYTHMGAME_AUDIOSOURCE_H 18 | #define RHYTHMGAME_AUDIOSOURCE_H 19 | 20 | #include <cstdint> 21 | #include <GameConstants.h> 22 | 23 | class DataSource { 24 | public: 25 | virtual ~DataSource(){}; 26 | virtual int64_t getSize() const = 0; 27 | virtual AudioProperties getProperties() const = 0; 28 | virtual const float* getData() const = 0; 29 | }; 30 | 31 | 32 | #endif //RHYTHMGAME_AUDIOSOURCE_H 33 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/cpp/audio/NDKExtractor.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef FFMPEG_NDKMEDIAEXTRACTOR_H 18 | #define FFMPEG_NDKMEDIAEXTRACTOR_H 19 | 20 | 21 | #include <cstdint> 22 | #include <android/asset_manager.h> 23 | #include <GameConstants.h> 24 | 25 | 26 | class NDKExtractor { 27 | 28 | public: 29 | static int32_t decode(AAsset *asset, uint8_t *targetData, AudioProperties targetProperties); 30 | }; 31 | 32 | 33 | #endif //FFMPEG_NDKMEDIAEXTRACTOR_H 34 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/cpp/ui/OpenGLFunctions.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include "OpenGLFunctions.h" 18 | #include "utils/logging.h" 19 | 20 | void CheckOpenGLError(const char* stmt, const char* fname, int line) 21 | { 22 | GLenum err = glGetError(); 23 | if (err != GL_NO_ERROR) 24 | { 25 | LOGW("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt); 26 | assert(false); 27 | } 28 | } 29 | 30 | void SetGLScreenColor(ScreenColor color){ 31 | glClearColor(color.red, color.green, color.blue, color.alpha); 32 | glClear(GL_COLOR_BUFFER_BIT); 33 | } 34 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorPrimary">#3F51B5</color> 4 | <color name="colorPrimaryDark">#303F9F</color> 5 | <color name="colorAccent">#FF4081</color> 6 | </resources> 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">RhythmGame</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/RhythmGame/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 5 | <!-- Customize your theme here. --> 6 | <item name="colorPrimary">@color/colorPrimary</item> 7 | <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 8 | <item name="colorAccent">@color/colorAccent</item> 9 | </style> 10 | 11 | </resources> 12 | -------------------------------------------------------------------------------- /samples/RhythmGame/test/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22.1) 2 | 3 | set(GOOGLETEST_ROOT ${ANDROID_NDK}/sources/third_party/googletest/googletest) 4 | add_library(gtest STATIC ${GOOGLETEST_ROOT}/src/gtest_main.cc ${GOOGLETEST_ROOT}/src/gtest-all.cc) 5 | target_include_directories(gtest PRIVATE ${GOOGLETEST_ROOT}) 6 | target_include_directories(gtest PUBLIC ${GOOGLETEST_ROOT}/include) 7 | 8 | include_directories(../src/main/cpp/) 9 | 10 | # Build our test binary 11 | add_executable (testRhythmGame testLockFreeQueue.cpp) 12 | target_link_libraries(testRhythmGame gtest) 13 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/common.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/common.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_common.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/_fixes.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/_fixes.hpp 3 | 4 | #include <cmath> 5 | 6 | //! Workaround for compatibility with other libraries 7 | #ifdef max 8 | #undef max 9 | #endif 10 | 11 | //! Workaround for compatibility with other libraries 12 | #ifdef min 13 | #undef min 14 | #endif 15 | 16 | //! Workaround for Android 17 | #ifdef isnan 18 | #undef isnan 19 | #endif 20 | 21 | //! Workaround for Android 22 | #ifdef isinf 23 | #undef isinf 24 | #endif 25 | 26 | //! Workaround for Chrone Native Client 27 | #ifdef log2 28 | #undef log2 29 | #endif 30 | 31 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/func_exponential_simd.inl: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/func_exponential_simd.inl 3 | 4 | #include "../simd/exponential.h" 5 | 6 | #if GLM_ARCH & GLM_ARCH_SSE2_BIT 7 | 8 | namespace glm{ 9 | namespace detail 10 | { 11 | template <precision P> 12 | struct compute_sqrt<tvec4, float, P, true> 13 | { 14 | GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) 15 | { 16 | tvec4<float, P> result(uninitialize); 17 | result.data = _mm_sqrt_ps(v.data); 18 | return result; 19 | } 20 | }; 21 | 22 | template <> 23 | struct compute_sqrt<tvec4, float, aligned_lowp, true> 24 | { 25 | GLM_FUNC_QUALIFIER static tvec4<float, aligned_lowp> call(tvec4<float, aligned_lowp> const & v) 26 | { 27 | tvec4<float, aligned_lowp> result(uninitialize); 28 | result.data = glm_vec4_sqrt_lowp(v.data); 29 | return result; 30 | } 31 | }; 32 | }//namespace detail 33 | }//namespace glm 34 | 35 | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT 36 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/func_packing_simd.inl: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/func_packing_simd.inl 3 | 4 | namespace glm{ 5 | namespace detail 6 | { 7 | 8 | }//namespace detail 9 | }//namespace glm 10 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/func_trigonometric_simd.inl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/third_party/glm/detail/func_trigonometric_simd.inl -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/func_vector_relational_simd.inl: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/func_vector_relational_simd.inl 3 | 4 | namespace glm{ 5 | namespace detail 6 | { 7 | 8 | }//namespace detail 9 | }//namespace glm 10 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/type_half.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/type_half.hpp 3 | 4 | #pragma once 5 | 6 | #include "setup.hpp" 7 | 8 | namespace glm{ 9 | namespace detail 10 | { 11 | typedef short hdata; 12 | 13 | GLM_FUNC_DECL float toFloat32(hdata value); 14 | GLM_FUNC_DECL hdata toFloat16(float const & value); 15 | 16 | }//namespace detail 17 | }//namespace glm 18 | 19 | #include "type_half.inl" 20 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/type_mat.inl: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/type_mat.inl 3 | 4 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/type_mat4x4_simd.inl: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/type_mat4x4_sse2.inl 3 | 4 | namespace glm 5 | { 6 | 7 | }//namespace glm 8 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/detail/type_vec.inl: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/detail/type_vec.inl 3 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/exponential.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/exponential.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_exponential.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/geometric.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/geometric.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_geometric.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtc/functions.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtc_functions 2 | /// @file glm/gtc/functions.inl 3 | 4 | #include "../detail/func_exponential.hpp" 5 | 6 | namespace glm 7 | { 8 | template <typename T> 9 | GLM_FUNC_QUALIFIER T gauss 10 | ( 11 | T x, 12 | T ExpectedValue, 13 | T StandardDeviation 14 | ) 15 | { 16 | return exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast<T>(6.28318530717958647692528676655900576))); 17 | } 18 | 19 | template <typename T, precision P> 20 | GLM_FUNC_QUALIFIER T gauss 21 | ( 22 | tvec2<T, P> const& Coord, 23 | tvec2<T, P> const& ExpectedValue, 24 | tvec2<T, P> const& StandardDeviation 25 | ) 26 | { 27 | tvec2<T, P> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation); 28 | return exp(-(Squared.x + Squared.y)); 29 | } 30 | }//namespace glm 31 | 32 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtc/type_precision.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtc_swizzle 2 | /// @file glm/gtc/swizzle.inl 3 | 4 | namespace glm 5 | { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtc/vec1.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtc_vec1 2 | /// @file glm/gtc/vec1.inl 3 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/extend.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_extend 2 | /// @file glm/gtx/extend.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// 6 | /// @defgroup gtx_extend GLM_GTX_extend 7 | /// @ingroup gtx 8 | /// 9 | /// @brief Extend a position from a source to a position at a defined length. 10 | /// 11 | /// <glm/gtx/extend.hpp> need to be included to use these functionalities. 12 | 13 | #pragma once 14 | 15 | // Dependency: 16 | #include "../glm.hpp" 17 | 18 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 19 | # pragma message("GLM: GLM_GTX_extend extension included") 20 | #endif 21 | 22 | namespace glm 23 | { 24 | /// @addtogroup gtx_extend 25 | /// @{ 26 | 27 | /// Extends of Length the Origin position using the (Source - Origin) direction. 28 | /// @see gtx_extend 29 | template <typename genType> 30 | GLM_FUNC_DECL genType extend( 31 | genType const & Origin, 32 | genType const & Source, 33 | typename genType::value_type const Length); 34 | 35 | /// @} 36 | }//namespace glm 37 | 38 | #include "extend.inl" 39 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/extend.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_extend 2 | /// @file glm/gtx/extend.inl 3 | 4 | namespace glm 5 | { 6 | template <typename genType> 7 | GLM_FUNC_QUALIFIER genType extend 8 | ( 9 | genType const & Origin, 10 | genType const & Source, 11 | genType const & Distance 12 | ) 13 | { 14 | return Origin + (Source - Origin) * Distance; 15 | } 16 | 17 | template <typename T, precision P> 18 | GLM_FUNC_QUALIFIER tvec2<T, P> extend 19 | ( 20 | tvec2<T, P> const & Origin, 21 | tvec2<T, P> const & Source, 22 | T const & Distance 23 | ) 24 | { 25 | return Origin + (Source - Origin) * Distance; 26 | } 27 | 28 | template <typename T, precision P> 29 | GLM_FUNC_QUALIFIER tvec3<T, P> extend 30 | ( 31 | tvec3<T, P> const & Origin, 32 | tvec3<T, P> const & Source, 33 | T const & Distance 34 | ) 35 | { 36 | return Origin + (Source - Origin) * Distance; 37 | } 38 | 39 | template <typename T, precision P> 40 | GLM_FUNC_QUALIFIER tvec4<T, P> extend 41 | ( 42 | tvec4<T, P> const & Origin, 43 | tvec4<T, P> const & Source, 44 | T const & Distance 45 | ) 46 | { 47 | return Origin + (Source - Origin) * Distance; 48 | } 49 | }//namespace glm 50 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/float_notmalize.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_float_normalize 2 | /// @file glm/gtx/float_normalize.inl 3 | 4 | #include <limits> 5 | 6 | namespace glm 7 | { 8 | template <typename T, precision P, template <typename, precision> class vecType> 9 | GLM_FUNC_QUALIFIER vecType<float, P> floatNormalize(vecType<T, P> const & v) 10 | { 11 | return vecType<float, P>(v) / static_cast<float>(std::numeric_limits<T>::max()); 12 | } 13 | 14 | }//namespace glm 15 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/gradient_paint.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_gradient_paint 2 | /// @file glm/gtx/gradient_paint.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER T radialGradient 8 | ( 9 | tvec2<T, P> const & Center, 10 | T const & Radius, 11 | tvec2<T, P> const & Focal, 12 | tvec2<T, P> const & Position 13 | ) 14 | { 15 | tvec2<T, P> F = Focal - Center; 16 | tvec2<T, P> D = Position - Focal; 17 | T Radius2 = pow2(Radius); 18 | T Fx2 = pow2(F.x); 19 | T Fy2 = pow2(F.y); 20 | 21 | T Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x)); 22 | T Denominator = Radius2 - (Fx2 + Fy2); 23 | return Numerator / Denominator; 24 | } 25 | 26 | template <typename T, precision P> 27 | GLM_FUNC_QUALIFIER T linearGradient 28 | ( 29 | tvec2<T, P> const & Point0, 30 | tvec2<T, P> const & Point1, 31 | tvec2<T, P> const & Position 32 | ) 33 | { 34 | tvec2<T, P> Dist = Point1 - Point0; 35 | return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); 36 | } 37 | }//namespace glm 38 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/handed_coordinate_space.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_handed_coordinate_space 2 | /// @file glm/gtx/handed_coordinate_space.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER bool rightHanded 8 | ( 9 | tvec3<T, P> const & tangent, 10 | tvec3<T, P> const & binormal, 11 | tvec3<T, P> const & normal 12 | ) 13 | { 14 | return dot(cross(normal, tangent), binormal) > T(0); 15 | } 16 | 17 | template <typename T, precision P> 18 | GLM_FUNC_QUALIFIER bool leftHanded 19 | ( 20 | tvec3<T, P> const & tangent, 21 | tvec3<T, P> const & binormal, 22 | tvec3<T, P> const & normal 23 | ) 24 | { 25 | return dot(cross(normal, tangent), binormal) < T(0); 26 | } 27 | }//namespace glm 28 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/log_base.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_log_base 2 | /// @file glm/gtx/log_base.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// 6 | /// @defgroup gtx_log_base GLM_GTX_log_base 7 | /// @ingroup gtx 8 | /// 9 | /// @brief Logarithm for any base. base can be a vector or a scalar. 10 | /// 11 | /// <glm/gtx/log_base.hpp> need to be included to use these functionalities. 12 | 13 | #pragma once 14 | 15 | // Dependency: 16 | #include "../glm.hpp" 17 | 18 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 19 | # pragma message("GLM: GLM_GTX_log_base extension included") 20 | #endif 21 | 22 | namespace glm 23 | { 24 | /// @addtogroup gtx_log_base 25 | /// @{ 26 | 27 | /// Logarithm for any base. 28 | /// From GLM_GTX_log_base. 29 | template <typename genType> 30 | GLM_FUNC_DECL genType log( 31 | genType const & x, 32 | genType const & base); 33 | 34 | /// Logarithm for any base. 35 | /// From GLM_GTX_log_base. 36 | template <typename T, precision P, template <typename, precision> class vecType> 37 | GLM_FUNC_DECL vecType<T, P> sign( 38 | vecType<T, P> const & x, 39 | vecType<T, P> const & base); 40 | 41 | /// @} 42 | }//namespace glm 43 | 44 | #include "log_base.inl" 45 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/log_base.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_log_base 2 | /// @file glm/gtx/log_base.inl 3 | 4 | namespace glm 5 | { 6 | template <typename genType> 7 | GLM_FUNC_QUALIFIER genType log(genType const & x, genType const & base) 8 | { 9 | assert(x != genType(0)); 10 | return glm::log(x) / glm::log(base); 11 | } 12 | 13 | template <typename T, precision P, template <typename, precision> class vecType> 14 | GLM_FUNC_QUALIFIER vecType<T, P> log(vecType<T, P> const & x, vecType<T, P> const & base) 15 | { 16 | return glm::log(x) / glm::log(base); 17 | } 18 | }//namespace glm 19 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/matrix_cross_product.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_matrix_cross_product 2 | /// @file glm/gtx/matrix_cross_product.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER tmat3x3<T, P> matrixCross3 8 | ( 9 | tvec3<T, P> const & x 10 | ) 11 | { 12 | tmat3x3<T, P> Result(T(0)); 13 | Result[0][1] = x.z; 14 | Result[1][0] = -x.z; 15 | Result[0][2] = -x.y; 16 | Result[2][0] = x.y; 17 | Result[1][2] = x.x; 18 | Result[2][1] = -x.x; 19 | return Result; 20 | } 21 | 22 | template <typename T, precision P> 23 | GLM_FUNC_QUALIFIER tmat4x4<T, P> matrixCross4 24 | ( 25 | tvec3<T, P> const & x 26 | ) 27 | { 28 | tmat4x4<T, P> Result(T(0)); 29 | Result[0][1] = x.z; 30 | Result[1][0] = -x.z; 31 | Result[0][2] = -x.y; 32 | Result[2][0] = x.y; 33 | Result[1][2] = x.x; 34 | Result[2][1] = -x.x; 35 | return Result; 36 | } 37 | 38 | }//namespace glm 39 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/mixed_product.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_mixed_product 2 | /// @file glm/gtx/mixed_product.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// 6 | /// @defgroup gtx_mixed_product GLM_GTX_mixed_producte 7 | /// @ingroup gtx 8 | /// 9 | /// @brief Mixed product of 3 vectors. 10 | /// 11 | /// <glm/gtx/mixed_product.hpp> need to be included to use these functionalities. 12 | 13 | #pragma once 14 | 15 | // Dependency: 16 | #include "../glm.hpp" 17 | 18 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 19 | # pragma message("GLM: GLM_GTX_mixed_product extension included") 20 | #endif 21 | 22 | namespace glm 23 | { 24 | /// @addtogroup gtx_mixed_product 25 | /// @{ 26 | 27 | /// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) 28 | template <typename T, precision P> 29 | GLM_FUNC_DECL T mixedProduct( 30 | tvec3<T, P> const & v1, 31 | tvec3<T, P> const & v2, 32 | tvec3<T, P> const & v3); 33 | 34 | /// @} 35 | }// namespace glm 36 | 37 | #include "mixed_product.inl" 38 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/mixed_product.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_mixed_product 2 | /// @file glm/gtx/mixed_product.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER T mixedProduct 8 | ( 9 | tvec3<T, P> const & v1, 10 | tvec3<T, P> const & v2, 11 | tvec3<T, P> const & v3 12 | ) 13 | { 14 | return dot(cross(v1, v2), v3); 15 | } 16 | }//namespace glm 17 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/normal.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_normal 2 | /// @file glm/gtx/normal.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// @see gtx_extented_min_max (dependence) 6 | /// 7 | /// @defgroup gtx_normal GLM_GTX_normal 8 | /// @ingroup gtx 9 | /// 10 | /// @brief Compute the normal of a triangle. 11 | /// 12 | /// <glm/gtx/normal.hpp> need to be included to use these functionalities. 13 | 14 | #pragma once 15 | 16 | // Dependency: 17 | #include "../glm.hpp" 18 | 19 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 20 | # pragma message("GLM: GLM_GTX_normal extension included") 21 | #endif 22 | 23 | namespace glm 24 | { 25 | /// @addtogroup gtx_normal 26 | /// @{ 27 | 28 | //! Computes triangle normal from triangle points. 29 | //! From GLM_GTX_normal extension. 30 | template <typename T, precision P> 31 | GLM_FUNC_DECL tvec3<T, P> triangleNormal( 32 | tvec3<T, P> const & p1, 33 | tvec3<T, P> const & p2, 34 | tvec3<T, P> const & p3); 35 | 36 | /// @} 37 | }//namespace glm 38 | 39 | #include "normal.inl" 40 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/normal.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_normal 2 | /// @file glm/gtx/normal.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER tvec3<T, P> triangleNormal 8 | ( 9 | tvec3<T, P> const & p1, 10 | tvec3<T, P> const & p2, 11 | tvec3<T, P> const & p3 12 | ) 13 | { 14 | return normalize(cross(p1 - p2, p1 - p3)); 15 | } 16 | }//namespace glm 17 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/normalize_dot.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_normalize_dot 2 | /// @file glm/gtx/normalize_dot.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P, template <typename, precision> class vecType> 7 | GLM_FUNC_QUALIFIER T normalizeDot(vecType<T, P> const & x, vecType<T, P> const & y) 8 | { 9 | return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); 10 | } 11 | 12 | template <typename T, precision P, template <typename, precision> class vecType> 13 | GLM_FUNC_QUALIFIER T fastNormalizeDot(vecType<T, P> const & x, vecType<T, P> const & y) 14 | { 15 | return glm::dot(x, y) * glm::fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y)); 16 | } 17 | }//namespace glm 18 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/number_precision.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_number_precision 2 | /// @file glm/gtx/number_precision.inl 3 | 4 | namespace glm 5 | { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/optimum_pow.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_optimum_pow 2 | /// @file glm/gtx/optimum_pow.inl 3 | 4 | namespace glm 5 | { 6 | template <typename genType> 7 | GLM_FUNC_QUALIFIER genType pow2(genType const & x) 8 | { 9 | return x * x; 10 | } 11 | 12 | template <typename genType> 13 | GLM_FUNC_QUALIFIER genType pow3(genType const & x) 14 | { 15 | return x * x * x; 16 | } 17 | 18 | template <typename genType> 19 | GLM_FUNC_QUALIFIER genType pow4(genType const & x) 20 | { 21 | return (x * x) * (x * x); 22 | } 23 | }//namespace glm 24 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/orthonormalize.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_orthonormalize 2 | /// @file glm/gtx/orthonormalize.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER tmat3x3<T, P> orthonormalize(tmat3x3<T, P> const & m) 8 | { 9 | tmat3x3<T, P> r = m; 10 | 11 | r[0] = normalize(r[0]); 12 | 13 | T d0 = dot(r[0], r[1]); 14 | r[1] -= r[0] * d0; 15 | r[1] = normalize(r[1]); 16 | 17 | T d1 = dot(r[1], r[2]); 18 | d0 = dot(r[0], r[2]); 19 | r[2] -= r[0] * d0 + r[1] * d1; 20 | r[2] = normalize(r[2]); 21 | 22 | return r; 23 | } 24 | 25 | template <typename T, precision P> 26 | GLM_FUNC_QUALIFIER tvec3<T, P> orthonormalize(tvec3<T, P> const & x, tvec3<T, P> const & y) 27 | { 28 | return normalize(x - y * dot(y, x)); 29 | } 30 | }//namespace glm 31 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/perpendicular.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_perpendicular 2 | /// @file glm/gtx/perpendicular.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// @see gtx_projection (dependence) 6 | /// 7 | /// @defgroup gtx_perpendicular GLM_GTX_perpendicular 8 | /// @ingroup gtx 9 | /// 10 | /// @brief Perpendicular of a vector from other one 11 | /// 12 | /// <glm/gtx/perpendicular.hpp> need to be included to use these functionalities. 13 | 14 | #pragma once 15 | 16 | // Dependency: 17 | #include "../glm.hpp" 18 | #include "../gtx/projection.hpp" 19 | 20 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 21 | # pragma message("GLM: GLM_GTX_perpendicular extension included") 22 | #endif 23 | 24 | namespace glm 25 | { 26 | /// @addtogroup gtx_perpendicular 27 | /// @{ 28 | 29 | //! Projects x a perpendicular axis of Normal. 30 | //! From GLM_GTX_perpendicular extension. 31 | template <typename vecType> 32 | GLM_FUNC_DECL vecType perp( 33 | vecType const & x, 34 | vecType const & Normal); 35 | 36 | /// @} 37 | }//namespace glm 38 | 39 | #include "perpendicular.inl" 40 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/perpendicular.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_perpendicular 2 | /// @file glm/gtx/perpendicular.inl 3 | 4 | namespace glm 5 | { 6 | template <typename vecType> 7 | GLM_FUNC_QUALIFIER vecType perp 8 | ( 9 | vecType const & x, 10 | vecType const & Normal 11 | ) 12 | { 13 | return x - proj(x, Normal); 14 | } 15 | }//namespace glm 16 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/polar_coordinates.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_polar_coordinates 2 | /// @file glm/gtx/polar_coordinates.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER tvec3<T, P> polar 8 | ( 9 | tvec3<T, P> const & euclidean 10 | ) 11 | { 12 | T const Length(length(euclidean)); 13 | tvec3<T, P> const tmp(euclidean / Length); 14 | T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z)); 15 | 16 | return tvec3<T, P>( 17 | asin(tmp.y), // latitude 18 | atan(tmp.x, tmp.z), // longitude 19 | xz_dist); // xz distance 20 | } 21 | 22 | template <typename T, precision P> 23 | GLM_FUNC_QUALIFIER tvec3<T, P> euclidean 24 | ( 25 | tvec2<T, P> const & polar 26 | ) 27 | { 28 | T const latitude(polar.x); 29 | T const longitude(polar.y); 30 | 31 | return tvec3<T, P>( 32 | cos(latitude) * sin(longitude), 33 | sin(latitude), 34 | cos(latitude) * cos(longitude)); 35 | } 36 | 37 | }//namespace glm 38 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/projection.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_projection 2 | /// @file glm/gtx/projection.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// 6 | /// @defgroup gtx_projection GLM_GTX_projection 7 | /// @ingroup gtx 8 | /// 9 | /// @brief Projection of a vector to other one 10 | /// 11 | /// <glm/gtx/projection.hpp> need to be included to use these functionalities. 12 | 13 | #pragma once 14 | 15 | // Dependency: 16 | #include "../geometric.hpp" 17 | 18 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 19 | # pragma message("GLM: GLM_GTX_projection extension included") 20 | #endif 21 | 22 | namespace glm 23 | { 24 | /// @addtogroup gtx_projection 25 | /// @{ 26 | 27 | /// Projects x on Normal. 28 | /// 29 | /// @see gtx_projection 30 | template <typename vecType> 31 | GLM_FUNC_DECL vecType proj(vecType const & x, vecType const & Normal); 32 | 33 | /// @} 34 | }//namespace glm 35 | 36 | #include "projection.inl" 37 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/projection.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_projection 2 | /// @file glm/gtx/projection.inl 3 | 4 | namespace glm 5 | { 6 | template <typename vecType> 7 | GLM_FUNC_QUALIFIER vecType proj(vecType const & x, vecType const & Normal) 8 | { 9 | return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; 10 | } 11 | }//namespace glm 12 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/raw_data.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_raw_data 2 | /// @file glm/gtx/raw_data.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// 6 | /// @defgroup gtx_raw_data GLM_GTX_raw_data 7 | /// @ingroup gtx 8 | /// 9 | /// @brief Projection of a vector to other one 10 | /// 11 | /// <glm/gtx/raw_data.hpp> need to be included to use these functionalities. 12 | 13 | #pragma once 14 | 15 | // Dependencies 16 | #include "../detail/setup.hpp" 17 | #include "../detail/type_int.hpp" 18 | 19 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 20 | # pragma message("GLM: GLM_GTX_raw_data extension included") 21 | #endif 22 | 23 | namespace glm 24 | { 25 | /// @addtogroup gtx_raw_data 26 | /// @{ 27 | 28 | //! Type for byte numbers. 29 | //! From GLM_GTX_raw_data extension. 30 | typedef detail::uint8 byte; 31 | 32 | //! Type for word numbers. 33 | //! From GLM_GTX_raw_data extension. 34 | typedef detail::uint16 word; 35 | 36 | //! Type for dword numbers. 37 | //! From GLM_GTX_raw_data extension. 38 | typedef detail::uint32 dword; 39 | 40 | //! Type for qword numbers. 41 | //! From GLM_GTX_raw_data extension. 42 | typedef detail::uint64 qword; 43 | 44 | /// @} 45 | }// namespace glm 46 | 47 | #include "raw_data.inl" 48 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/raw_data.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_raw_data 2 | /// @file glm/gtx/raw_data.inl 3 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/scalar_relational.hpp: -------------------------------------------------------------------------------- 1 | /// @ref gtx_scalar_relational 2 | /// @file glm/gtx/scalar_relational.hpp 3 | /// 4 | /// @see core (dependence) 5 | /// 6 | /// @defgroup gtx_scalar_relational GLM_GTX_scalar_relational 7 | /// @ingroup gtx 8 | /// 9 | /// @brief Extend a position from a source to a position at a defined length. 10 | /// 11 | /// <glm/gtx/scalar_relational.hpp> need to be included to use these functionalities. 12 | 13 | #pragma once 14 | 15 | // Dependency: 16 | #include "../glm.hpp" 17 | 18 | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 19 | # pragma message("GLM: GLM_GTX_extend extension included") 20 | #endif 21 | 22 | namespace glm 23 | { 24 | /// @addtogroup gtx_scalar_relational 25 | /// @{ 26 | 27 | 28 | 29 | /// @} 30 | }//namespace glm 31 | 32 | #include "scalar_relational.inl" 33 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/std_based_type.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_std_based_type 2 | /// @file glm/gtx/std_based_type.inl 3 | 4 | namespace glm 5 | { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/transform.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtx_transform 2 | /// @file glm/gtx/transform.inl 3 | 4 | namespace glm 5 | { 6 | template <typename T, precision P> 7 | GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(tvec3<T, P> const & v) 8 | { 9 | return translate(tmat4x4<T, P>(static_cast<T>(1)), v); 10 | } 11 | 12 | template <typename T, precision P> 13 | GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate(T angle, tvec3<T, P> const & v) 14 | { 15 | return rotate(tmat4x4<T, P>(static_cast<T>(1)), angle, v); 16 | } 17 | 18 | template <typename T, precision P> 19 | GLM_FUNC_QUALIFIER tmat4x4<T, P> scale(tvec3<T, P> const & v) 20 | { 21 | return scale(tmat4x4<T, P>(static_cast<T>(1)), v); 22 | } 23 | 24 | }//namespace glm 25 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/type_aligned.inl: -------------------------------------------------------------------------------- 1 | /// @ref gtc_type_aligned 2 | /// @file glm/gtc/type_aligned.inl 3 | 4 | namespace glm 5 | { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/gtx/type_trait.inl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/RhythmGame/third_party/glm/gtx/type_trait.inl -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/integer.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/integer.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_integer.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/matrix.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/matrix.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_matrix.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/packing.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/packing.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_packing.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/simd/exponential.h: -------------------------------------------------------------------------------- 1 | /// @ref simd 2 | /// @file glm/simd/experimental.h 3 | 4 | #pragma once 5 | 6 | #include "platform.h" 7 | 8 | #if GLM_ARCH & GLM_ARCH_SSE2_BIT 9 | 10 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec1_sqrt_lowp(glm_vec4 x) 11 | { 12 | return _mm_mul_ss(_mm_rsqrt_ss(x), x); 13 | } 14 | 15 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_sqrt_lowp(glm_vec4 x) 16 | { 17 | return _mm_mul_ps(_mm_rsqrt_ps(x), x); 18 | } 19 | 20 | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT 21 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/simd/packing.h: -------------------------------------------------------------------------------- 1 | /// @ref simd 2 | /// @file glm/simd/packing.h 3 | 4 | #pragma once 5 | 6 | #if GLM_ARCH & GLM_ARCH_SSE2_BIT 7 | 8 | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT 9 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/simd/trigonometric.h: -------------------------------------------------------------------------------- 1 | /// @ref simd 2 | /// @file glm/simd/trigonometric.h 3 | 4 | #pragma once 5 | 6 | #if GLM_ARCH & GLM_ARCH_SSE2_BIT 7 | 8 | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT 9 | 10 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/simd/vector_relational.h: -------------------------------------------------------------------------------- 1 | /// @ref simd 2 | /// @file glm/simd/vector_relational.h 3 | 4 | #pragma once 5 | 6 | #if GLM_ARCH & GLM_ARCH_SSE2_BIT 7 | 8 | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT 9 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/trigonometric.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/trigonometric.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_trigonometric.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/vec2.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/vec2.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/type_vec2.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/vec3.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/vec3.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/type_vec3.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/vec4.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/vec4.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/type_vec4.hpp" 7 | -------------------------------------------------------------------------------- /samples/RhythmGame/third_party/glm/vector_relational.hpp: -------------------------------------------------------------------------------- 1 | /// @ref core 2 | /// @file glm/vector_relational.hpp 3 | 4 | #pragma once 5 | 6 | #include "detail/func_vector_relational.hpp" 7 | -------------------------------------------------------------------------------- /samples/SoundBoard/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /samples/SoundBoard/soundboard_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/soundboard_image.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <application 5 | android:allowBackup="true" 6 | android:icon="@mipmap/ic_launcher" 7 | android:label="@string/app_name" 8 | android:roundIcon="@mipmap/ic_launcher_round" 9 | android:supportsRtl="true" 10 | android:theme="@style/AppTheme"> 11 | <activity android:name="com.google.oboe.samples.soundboard.MainActivity" 12 | android:exported="true"> 13 | <intent-filter> 14 | <action android:name="android.intent.action.MAIN" /> 15 | 16 | <category android:name="android.intent.category.LAUNCHER" /> 17 | </intent-filter> 18 | </activity> 19 | </application> 20 | 21 | </manifest> 22 | -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22.1) 2 | 3 | 4 | ### INCLUDE OBOE LIBRARY ### 5 | 6 | # Set the path to the Oboe library directory 7 | set (OBOE_DIR ../../../../..) 8 | 9 | # Add the Oboe library as a subproject. Since Oboe is an out-of-tree source library we must also 10 | # specify a binary directory 11 | add_subdirectory(${OBOE_DIR} ./oboe-bin) 12 | 13 | # Include the Oboe headers 14 | include_directories(${OBOE_DIR}/include ${OBOE_DIR}/samples/shared ${OBOE_DIR}/samples/debug-utils) 15 | 16 | 17 | ### END OBOE INCLUDE SECTION ### 18 | 19 | add_library( soundboard SHARED 20 | native-lib.cpp 21 | SoundBoardEngine.cpp 22 | ) 23 | 24 | target_link_libraries(soundboard log oboe ) 25 | target_link_options(soundboard PRIVATE "-Wl,-z,max-page-size=16384") 26 | 27 | # Enable optimization flags: if having problems with source level debugging, 28 | # disable -Ofast ( and debug ), re-enable it after done debugging. 29 | target_compile_options(soundboard PRIVATE -Wall -Werror -Ofast) 30 | -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | tools:context=".MainActivity"> 8 | 9 | </androidx.constraintlayout.widget.ConstraintLayout> 10 | -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background"/> 4 | <foreground android:drawable="@mipmap/ic_launcher_foreground"/> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background"/> 4 | <foreground android:drawable="@mipmap/ic_launcher_foreground"/> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/SoundBoard/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorPrimary">#700000</color> 4 | <color name="colorPrimaryDark">#280000</color> 5 | <color name="colorAccent">#D81B60</color> 6 | </resources> 7 | -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">soundboard</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/SoundBoard/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 5 | <!-- Customize your theme here. --> 6 | <item name="colorPrimary">@color/colorPrimary</item> 7 | <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 8 | <item name="colorAccent">@color/colorAccent</item> 9 | </style> 10 | 11 | </resources> 12 | -------------------------------------------------------------------------------- /samples/audio-device/README.md: -------------------------------------------------------------------------------- 1 | ### Audio Device Library 2 | This folder contains a number of classes for working with Audio Devices. See the hello-oboe sample 3 | for usage. 4 | -------------------------------------------------------------------------------- /samples/audio-device/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | defaultConfig { 5 | minSdkVersion 21 6 | targetSdkVersion 35 7 | compileSdkVersion 35 8 | } 9 | buildTypes { 10 | release { 11 | minifyEnabled false 12 | proguardFiles getDefaultProguardFile('proguard-android.txt') 13 | } 14 | } 15 | compileOptions { 16 | sourceCompatibility JavaVersion.VERSION_18 17 | targetCompatibility JavaVersion.VERSION_18 18 | } 19 | namespace 'com.google.oboe.samples.audio_device' 20 | } 21 | 22 | dependencies { 23 | implementation 'androidx.appcompat:appcompat:1.7.0' 24 | } 25 | -------------------------------------------------------------------------------- /samples/audio-device/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/donturner/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /samples/audio-device/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest> 2 | </manifest> 3 | -------------------------------------------------------------------------------- /samples/audio-device/src/main/res/layout/audio_devices.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright (C) 2017 The Android Open Source Project 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ http://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | <TextView 18 | xmlns:android="http://schemas.android.com/apk/res/android" 19 | android:id="@+id/device_name" 20 | android:layout_width="match_parent" 21 | android:layout_height="wrap_content" 22 | android:padding="@dimen/default_padding" 23 | android:text="@string/device_name"/> 24 | -------------------------------------------------------------------------------- /samples/audio-device/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <dimen name="default_padding">16dp</dimen> 4 | </resources> 5 | -------------------------------------------------------------------------------- /samples/audio-device/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="device_name">Device Name</string> 3 | <string name="auto_select">Auto select</string> 4 | </resources> 5 | -------------------------------------------------------------------------------- /samples/debug-utils/trace.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef SIMPLESYNTH_TRACE_H 18 | #define SIMPLESYNTH_TRACE_H 19 | 20 | class Trace { 21 | 22 | public: 23 | static void beginSection(const char *format, ...); 24 | static void endSection(); 25 | static bool isEnabled() { return is_enabled_; } 26 | static void initialize(); 27 | 28 | private: 29 | static bool is_enabled_; 30 | static bool has_error_been_shown_; 31 | }; 32 | 33 | #endif //SIMPLESYNTH_TRACE_H 34 | -------------------------------------------------------------------------------- /samples/drumthumper/drumthumper-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/drumthumper-screenshot.png -------------------------------------------------------------------------------- /samples/drumthumper/playstore/DrumSetFeatureImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/playstore/DrumSetFeatureImage.png -------------------------------------------------------------------------------- /samples/drumthumper/playstore/ScreenShotPhone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/playstore/ScreenShotPhone.png -------------------------------------------------------------------------------- /samples/drumthumper/playstore/ScreenShotWithMix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/playstore/ScreenShotWithMix.png -------------------------------------------------------------------------------- /samples/drumthumper/playstore/drumset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/playstore/drumset.jpg -------------------------------------------------------------------------------- /samples/drumthumper/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <application 5 | android:allowBackup="true" 6 | android:icon="@mipmap/ic_launcher" 7 | android:label="@string/app_name" 8 | android:roundIcon="@mipmap/ic_launcher_round" 9 | android:supportsRtl="true" 10 | android:theme="@style/AppTheme"> 11 | <activity android:name="com.plausiblesoftware.drumthumper.DrumThumperActivity" 12 | android:exported="true"> 13 | <intent-filter> 14 | <action android:name="android.intent.action.MAIN" /> 15 | 16 | <category android:name="android.intent.category.LAUNCHER" /> 17 | </intent-filter> 18 | </activity> 19 | </application> 20 | 21 | </manifest> 22 | -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/CrashCymbal.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/CrashCymbal.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/HiHat_Closed.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/HiHat_Closed.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/HiHat_Open.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/HiHat_Open.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/KickDrum.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/KickDrum.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/LowTom.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/LowTom.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/MidTom.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/MidTom.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/RideCymbal.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/RideCymbal.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/assets/SnareDrum.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/assets/SnareDrum.wav -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-anydpi-v26/_ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/_ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/_ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-anydpi-v26/_ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/_ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/_ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/drumthumper/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorPrimary">#008577</color> 4 | <color name="colorPrimaryDark">#00574B</color> 5 | <color name="colorAccent">#D81B60</color> 6 | <color name="black">#FF000000</color> 7 | <color name="red">#BB0000</color> 8 | </resources> 9 | -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">DrumThumper</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/drumthumper/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 5 | <!-- Customize your theme here. --> 6 | <item name="colorPrimary">@color/colorPrimary</item> 7 | <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 8 | <item name="colorAccent">@color/colorAccent</item> 9 | </style> 10 | 11 | </resources> 12 | -------------------------------------------------------------------------------- /samples/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /samples/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Mar 03 18:52:06 GMT 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 7 | -------------------------------------------------------------------------------- /samples/hello-oboe/hello-oboe-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/hello-oboe/hello-oboe-screenshot.png -------------------------------------------------------------------------------- /samples/hello-oboe/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/gfan/dev/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <uses-feature android:name="android.hardware.audio.output" android:required="true" /> 5 | <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 6 | <application 7 | android:allowBackup="false" 8 | android:fullBackupContent="false" 9 | android:supportsRtl="true" 10 | android:icon="@mipmap/ic_launcher" 11 | android:label="@string/app_name" 12 | android:theme="@style/AppTheme" > 13 | <activity 14 | android:name="com.google.oboe.samples.hellooboe.MainActivity" 15 | android:label="@string/app_name" 16 | android:screenOrientation="portrait" 17 | android:exported="true"> 18 | <intent-filter> 19 | <action android:name="android.intent.action.MAIN" /> 20 | <category android:name="android.intent.category.LAUNCHER" /> 21 | </intent-filter> 22 | </activity> 23 | </application> 24 | </manifest> 25 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/layout/audio_apis_spinner.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright (C) 2017 The Android Open Source Project 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ http://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | <TextView 18 | xmlns:android="http://schemas.android.com/apk/res/android" 19 | android:id="@+id/audioApiOption" 20 | android:layout_width="match_parent" 21 | android:layout_height="wrap_content" 22 | android:padding="@dimen/default_padding" 23 | /> 24 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/layout/buffer_sizes_spinner.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright (C) 2017 The Android Open Source Project 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ http://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | <TextView 18 | xmlns:android="http://schemas.android.com/apk/res/android" 19 | android:id="@+id/bufferSizeOption" 20 | android:layout_width="match_parent" 21 | android:layout_height="wrap_content" 22 | android:padding="@dimen/default_padding" 23 | /> 24 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/layout/channel_counts_spinner.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- 3 | ~ Copyright (C) 2018 The Android Open Source Project 4 | ~ 5 | ~ Licensed under the Apache License, Version 2.0 (the "License"); 6 | ~ you may not use this file except in compliance with the License. 7 | ~ You may obtain a copy of the License at 8 | ~ 9 | ~ http://www.apache.org/licenses/LICENSE-2.0 10 | ~ 11 | ~ Unless required by applicable law or agreed to in writing, software 12 | ~ distributed under the License is distributed on an "AS IS" BASIS, 13 | ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ~ See the License for the specific language governing permissions and 15 | ~ limitations under the License. 16 | --> 17 | <TextView 18 | xmlns:android="http://schemas.android.com/apk/res/android" 19 | android:id="@+id/channelCountOption" 20 | android:layout_width="match_parent" 21 | android:layout_height="wrap_content" 22 | android:padding="@dimen/default_padding" 23 | /> 24 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/hello-oboe/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/hello-oboe/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/hello-oboe/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/hello-oboe/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <style name="AppTheme" parent="android:Theme.Material.Light"> 4 | </style> 5 | </resources> 6 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Example customization of dimensions originally defined in res/values/dimens.xml 3 | (such as screen margins) for screens with more than 820dp of available width. This 4 | would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 5 | <dimen name="activity_horizontal_margin">64dp</dimen> 6 | </resources> 7 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Default screen margins, per the Android Design guidelines. --> 3 | <dimen name="activity_horizontal_margin">16dp</dimen> 4 | <dimen name="activity_vertical_margin">16dp</dimen> 5 | </resources> 6 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">Hello Oboe</string> 3 | <string name="init_status">Touch anywhere on the screen to play audio</string> 4 | <string name="action_settings">Settings</string> 5 | <string name="need_record_audio_permission">"This sample needs RECORD_AUDIO permission"</string> 6 | <string name="playback_device">Playback device</string> 7 | <string name="latency">Latency: %s</string> 8 | <string name="buffer_size_title">Buffer size</string> 9 | <string name="automatic">Automatic</string> 10 | <string name="buffer_size_description_key">description</string> 11 | <string name="buffer_size_value_key">value</string> 12 | <string name="audio_api_description_key">description</string> 13 | <string name="audio_api_value_key">value</string> 14 | <string name="only_supported_on_api_26">Only supported in AAudio (API 26+)</string> 15 | <string name="audio_api">Audio API</string> 16 | </resources> 17 | -------------------------------------------------------------------------------- /samples/hello-oboe/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 5 | <!-- Customize your theme here. --> 6 | </style> 7 | 8 | </resources> 9 | -------------------------------------------------------------------------------- /samples/iolib/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /samples/iolib/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | defaultConfig { 5 | minSdkVersion 21 6 | targetSdkVersion 35 7 | compileSdkVersion 35 8 | 9 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 10 | consumerProguardFiles 'consumer-rules.pro' 11 | } 12 | buildTypes { 13 | release { 14 | minifyEnabled false 15 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 16 | } 17 | } 18 | compileOptions { 19 | sourceCompatibility JavaVersion.VERSION_18 20 | targetCompatibility JavaVersion.VERSION_18 21 | } 22 | externalNativeBuild { 23 | cmake { 24 | path 'src/main/cpp/CMakeLists.txt' 25 | } 26 | } 27 | namespace 'com.google.oboe.samples.iolib' 28 | } 29 | 30 | dependencies { 31 | implementation fileTree(dir: 'libs', include: ['*.jar']) 32 | 33 | implementation 'androidx.appcompat:appcompat:1.7.0' 34 | } 35 | -------------------------------------------------------------------------------- /samples/iolib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" /> 2 | -------------------------------------------------------------------------------- /samples/iolib/src/main/cpp/player/DataSource.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef _PLAYER_AUDIOSOURCE_H_ 18 | #define _PLAYER_AUDIOSOURCE_H_ 19 | 20 | #include <cstdint> 21 | 22 | namespace iolib { 23 | 24 | /* 25 | * Defines an interface for audio data sources for the SimpleMultiPlayer class. 26 | */ 27 | class DataSource { 28 | public: 29 | virtual ~DataSource() {}; 30 | 31 | virtual void mixAudio(float* outBuff, int numChannels, int numFrames) = 0; 32 | }; 33 | 34 | } 35 | 36 | #endif //_PLAYER_AUDIOSOURCE_H_ 37 | -------------------------------------------------------------------------------- /samples/iolib/src/main/cpp/player/SampleSource.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2020 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include "SampleSource.h" 18 | 19 | namespace iolib { 20 | // for now, all methods of SampleSource are either in-line or pure virtual 21 | } 22 | -------------------------------------------------------------------------------- /samples/iolib/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">iolib</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/minimaloboe/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /samples/minimaloboe/README.md: -------------------------------------------------------------------------------- 1 | # Minimal Oboe 2 | 3 | ## Overview 4 | 5 | This app is a very simple demonstration of turning on audio from buttons. 6 | It uses a low-latency Oboe stream. 7 | 8 | ## Implementation 9 | 10 | The app is written using Kotlin and Jetpack Compose. 11 | 12 | The app state is maintained by subclassing DefaultLifecycleObserver. 13 | Oboe is called through an external native function. 14 | 15 | This app uses shared_ptr for passing callbacks to Oboe. 16 | When the stream is disconnected, it starts a new stream. 17 | 18 | ## Screenshots 19 |  20 | -------------------------------------------------------------------------------- /samples/minimaloboe/minimaloboe-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/minimaloboe-screenshot.png -------------------------------------------------------------------------------- /samples/minimaloboe/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <application 5 | android:allowBackup="true" 6 | android:icon="@mipmap/ic_launcher" 7 | android:label="@string/app_name" 8 | android:roundIcon="@mipmap/ic_launcher_round" 9 | android:supportsRtl="true" 10 | android:theme="@style/Theme.Samples"> 11 | <activity 12 | android:name=".MainActivity" 13 | android:exported="true" 14 | android:label="@string/app_name" 15 | android:theme="@style/Theme.Samples"> 16 | <intent-filter> 17 | <action android:name="android.intent.action.MAIN" /> 18 | 19 | <category android:name="android.intent.category.LAUNCHER" /> 20 | </intent-filter> 21 | </activity> 22 | </application> 23 | 24 | </manifest> 25 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/kotlin/com/example/minimaloboe/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.example.minimaloboe.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) 9 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/kotlin/com/example/minimaloboe/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.example.minimaloboe.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp) 11 | ) 12 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/kotlin/com/example/minimaloboe/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.example.minimaloboe.ui.theme 2 | 3 | import androidx.compose.material.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography( 11 | body1 = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 24.sp 15 | ), 16 | button = TextStyle( 17 | fontFamily = FontFamily.Default, 18 | fontWeight = FontWeight.W500, 19 | fontSize = 20.sp 20 | ) 21 | ) 22 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/samples/minimaloboe/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="purple_200">#FFBB86FC</color> 4 | <color name="purple_500">#FF6200EE</color> 5 | <color name="purple_700">#FF3700B3</color> 6 | <color name="teal_200">#FF03DAC5</color> 7 | <color name="teal_700">#FF018786</color> 8 | <color name="black">#FF000000</color> 9 | <color name="white">#FFFFFFFF</color> 10 | </resources> 11 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">MinimalOboe</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/minimaloboe/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | 4 | <style name="Theme.Samples" parent="android:Theme.Material.Light.NoActionBar"> 5 | <item name="android:statusBarColor">@color/purple_700</item> 6 | </style> 7 | </resources> 8 | -------------------------------------------------------------------------------- /samples/parselib/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | defaultConfig { 5 | minSdkVersion 21 6 | targetSdkVersion 35 7 | compileSdkVersion 35 8 | 9 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 10 | } 11 | buildTypes { 12 | release { 13 | minifyEnabled false 14 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') 15 | } 16 | } 17 | compileOptions { 18 | sourceCompatibility JavaVersion.VERSION_18 19 | targetCompatibility JavaVersion.VERSION_18 20 | } 21 | externalNativeBuild { 22 | cmake { 23 | path 'src/main/cpp/CMakeLists.txt' 24 | } 25 | } 26 | namespace 'com.google.oboe.samples' 27 | } 28 | 29 | dependencies { 30 | implementation fileTree(dir: 'libs', include: ['*.jar']) 31 | 32 | implementation 'androidx.appcompat:appcompat:1.7.0' 33 | } 34 | -------------------------------------------------------------------------------- /samples/parselib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" /> 2 | -------------------------------------------------------------------------------- /samples/parselib/src/main/cpp/stream/InputStream.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #include "InputStream.h" 17 | 18 | namespace parselib { 19 | 20 | // All of the methods of InputStream are pure virtual 21 | 22 | } /* namespace wavlib */ 23 | -------------------------------------------------------------------------------- /samples/parselib/src/main/cpp/wav/AudioEncoding.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #include "AudioEncoding.h" 17 | 18 | namespace parselib { 19 | 20 | } // namespace wavlib 21 | -------------------------------------------------------------------------------- /samples/parselib/src/main/cpp/wav/AudioEncoding.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #ifndef _IO_WAV_AUDIOFORMAT_H_ 17 | #define _IO_WAV_AUDIOFORMAT_H_ 18 | 19 | namespace parselib { 20 | 21 | /** 22 | * Definitions for Audio Encodings in WAV files. 23 | */ 24 | class AudioEncoding { 25 | public: 26 | static const int INVALID = -1; 27 | static const int PCM_16 = 0; 28 | static const int PCM_8 = 1; 29 | static const int PCM_IEEEFLOAT = 2; 30 | static const int PCM_24 = 3; 31 | static const int PCM_32 = 4; 32 | }; 33 | 34 | } // namespace parselib 35 | 36 | #endif // _IO_WAV_AUDIOFORMAT_H_ 37 | -------------------------------------------------------------------------------- /samples/parselib/src/main/cpp/wav/WavChunkHeader.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #include "stream/InputStream.h" 17 | 18 | #include "WavChunkHeader.h" 19 | 20 | namespace parselib { 21 | 22 | const RiffID WavChunkHeader::RIFFID_DATA = makeRiffID('d', 'a', 't', 'a'); 23 | 24 | void WavChunkHeader::read(InputStream *stream) { 25 | stream->read(&mChunkId, sizeof(mChunkId)); 26 | stream->read(&mChunkSize, sizeof(mChunkSize)); 27 | } 28 | 29 | } // namespace parselib 30 | -------------------------------------------------------------------------------- /samples/parselib/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">wavlib</string> 3 | </resources> 4 | -------------------------------------------------------------------------------- /samples/settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | include ':audio-device' 19 | include ':hello-oboe' 20 | include ':RhythmGame' 21 | include ':MegaDrone' 22 | include ':LiveEffect' 23 | include ':SoundBoard' 24 | include ':drumthumper' 25 | include ':parselib' 26 | include ':iolib' 27 | include ':minimaloboe' 28 | -------------------------------------------------------------------------------- /samples/shared/IRenderableAudio.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef SAMPLES_IRENDERABLEAUDIO_H 18 | #define SAMPLES_IRENDERABLEAUDIO_H 19 | 20 | #include <cstdint> 21 | #include <string> 22 | 23 | class IRenderableAudio { 24 | 25 | public: 26 | virtual ~IRenderableAudio() = default; 27 | virtual void renderAudio(float *audioData, int32_t numFrames) = 0; 28 | }; 29 | 30 | 31 | #endif //SAMPLES_IRENDERABLEAUDIO_H 32 | -------------------------------------------------------------------------------- /samples/shared/IRestartable.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #ifndef SAMPLES_IRESTARTABLE_H 17 | #define SAMPLES_IRESTARTABLE_H 18 | 19 | /** 20 | * Represents an object which can be restarted. For example an audio engine which has one or more 21 | * streams which can be restarted following a change in audio device configuration. For example, 22 | * headphones being connected. 23 | */ 24 | class IRestartable { 25 | public: 26 | virtual void restart() = 0; 27 | }; 28 | #endif //SAMPLES_IRESTARTABLE_H 29 | -------------------------------------------------------------------------------- /samples/shared/ITappable.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef SAMPLES_ITAPPABLE_H 18 | #define SAMPLES_ITAPPABLE_H 19 | 20 | class ITappable { 21 | public: 22 | virtual ~ITappable() = default; 23 | virtual void tap(bool isDown) = 0; 24 | }; 25 | #endif //SAMPLES_ITAPPABLE_H 26 | -------------------------------------------------------------------------------- /src/common/FixedBlockAdapter.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include <stdint.h> 18 | 19 | #include "FixedBlockAdapter.h" 20 | 21 | FixedBlockAdapter::~FixedBlockAdapter() { 22 | } 23 | 24 | int32_t FixedBlockAdapter::open(int32_t bytesPerFixedBlock) 25 | { 26 | mSize = bytesPerFixedBlock; 27 | mStorage = std::make_unique<uint8_t[]>(bytesPerFixedBlock); 28 | mPosition = 0; 29 | return 0; 30 | } 31 | 32 | int32_t FixedBlockAdapter::close() 33 | { 34 | mStorage.reset(nullptr); 35 | mSize = 0; 36 | mPosition = 0; 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /src/common/SourceFloatCaller.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include <algorithm> 18 | #include <unistd.h> 19 | #include "flowgraph/FlowGraphNode.h" 20 | #include "SourceFloatCaller.h" 21 | 22 | using namespace oboe; 23 | using namespace flowgraph; 24 | 25 | int32_t SourceFloatCaller::onProcess(int32_t numFrames) { 26 | int32_t numBytes = mStream->getBytesPerFrame() * numFrames; 27 | int32_t bytesRead = mBlockReader.read((uint8_t *) output.getBuffer(), numBytes); 28 | int32_t framesRead = bytesRead / mStream->getBytesPerFrame(); 29 | return framesRead; 30 | } 31 | -------------------------------------------------------------------------------- /src/common/Version.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | #include "oboe/Version.h" 17 | 18 | namespace oboe { 19 | 20 | // This variable enables the version information to be read from the resulting binary e.g. 21 | // by running `objdump -s --section=.data <binary>` 22 | // Please do not optimize or change in any way. 23 | char kVersionText[] = "OboeVersion" OBOE_VERSION_TEXT; 24 | 25 | const char * getVersionText(){ 26 | return kVersionText; 27 | } 28 | } // namespace oboe 29 | -------------------------------------------------------------------------------- /src/fifo/FifoController.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include <stdint.h> 18 | 19 | #include "FifoController.h" 20 | 21 | namespace oboe { 22 | 23 | FifoController::FifoController(uint32_t numFrames) 24 | : FifoControllerBase(numFrames) 25 | { 26 | setReadCounter(0); 27 | setWriteCounter(0); 28 | } 29 | 30 | } // namespace oboe 31 | -------------------------------------------------------------------------------- /src/fifo/FifoControllerIndirect.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include <stdint.h> 18 | 19 | #include "FifoControllerIndirect.h" 20 | 21 | namespace oboe { 22 | 23 | FifoControllerIndirect::FifoControllerIndirect(uint32_t numFrames, 24 | std::atomic<uint64_t> *readCounterAddress, 25 | std::atomic<uint64_t> *writeCounterAddress) 26 | : FifoControllerBase(numFrames) 27 | , mReadCounterAddress(readCounterAddress) 28 | , mWriteCounterAddress(writeCounterAddress) 29 | { 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/flowgraph/resampler/ResamplerDefinitions.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | // Set flag RESAMPLER_OUTER_NAMESPACE based on whether compiler flag 18 | // __ANDROID_NDK__ is defined. __ANDROID_NDK__ should be defined in oboe 19 | // but not in android. 20 | 21 | #ifndef RESAMPLER_OUTER_NAMESPACE 22 | #ifdef __ANDROID_NDK__ 23 | #define RESAMPLER_OUTER_NAMESPACE oboe 24 | #else 25 | #define RESAMPLER_OUTER_NAMESPACE aaudio 26 | #endif // __ANDROID_NDK__ 27 | #endif // RESAMPLER_OUTER_NAMESPACE 28 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches/build_file_checksums.ser 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | .DS_Store 9 | /build 10 | /captures 11 | .externalNativeBuild 12 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 34 5 | defaultConfig { 6 | applicationId "com.google.oboe.tests.unittestrunner" 7 | minSdkVersion 21 8 | targetSdkVersion 34 9 | versionCode 1 10 | versionName "1.0" 11 | } 12 | buildTypes { 13 | release { 14 | minifyEnabled false 15 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 16 | } 17 | } 18 | externalNativeBuild { 19 | cmake { 20 | path file('../../CMakeLists.txt') 21 | } 22 | } 23 | namespace 'com.google.oboe.tests.unittestrunner' 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | implementation 'androidx.appcompat:appcompat:1.1.0' 29 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 30 | } 31 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/.gitignore: -------------------------------------------------------------------------------- 1 | /assets 2 | /jniLibs 3 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <uses-permission android:name="android.permission.RECORD_AUDIO" /> 5 | <application 6 | android:allowBackup="true" 7 | android:icon="@mipmap/ic_launcher" 8 | android:label="@string/app_name" 9 | android:roundIcon="@mipmap/ic_launcher_round" 10 | android:supportsRtl="true" 11 | android:theme="@style/AppTheme"> 12 | <activity android:name=".MainActivity" android:exported="true" android:screenOrientation="landscape"> 13 | <intent-filter> 14 | <action android:name="android.intent.action.MAIN" /> 15 | 16 | <category android:name="android.intent.category.LAUNCHER" /> 17 | </intent-filter> 18 | </activity> 19 | </application> 20 | 21 | </manifest> 22 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background" /> 4 | <foreground android:drawable="@drawable/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorPrimary">#008577</color> 4 | <color name="colorPrimaryDark">#00574B</color> 5 | <color name="colorAccent">#D81B60</color> 6 | </resources> 7 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="app_name">Unit Test Runner</string> 3 | <string name="need_record_audio_permission">"This app needs RECORD_AUDIO permission"</string> 4 | <string name="status_record_audio_denied">Error: Permission for RECORD_AUDIO was denied</string> 5 | <string name="status_record_audio_granted">RECORD_AUDIO permission granted. Running tests...</string> 6 | </resources> 7 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <!-- Base application theme. --> 4 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 5 | <!-- Customize your theme here. --> 6 | <item name="colorPrimary">@color/colorPrimary</item> 7 | <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 8 | <item name="colorAccent">@color/colorAccent</item> 9 | </style> 10 | 11 | </resources> 12 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | mavenCentral() 6 | maven { 7 | url 'https://maven.google.com/' 8 | name 'Google' 9 | } 10 | } 11 | 12 | dependencies { 13 | classpath 'com.android.tools.build:gradle:8.5.1' 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | mavenCentral() 20 | maven { 21 | url 'https://maven.google.com/' 22 | name 'Google' 23 | } 24 | } 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/oboe/8f02c49c9c310a30e3c452c598b816adc9397539/tests/UnitTestRunner/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /tests/UnitTestRunner/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Sep 27 15:12:10 BST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip 7 | -------------------------------------------------------------------------------- /tests/UnitTestRunner/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------