juce-framework / JUCE

JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins.
https://juce.com
Other
6.54k stars 1.73k forks source link

Android app hangs when using Oboe #438

Open dturner opened 5 years ago

dturner commented 5 years ago

Test environment:

Steps to reproduce:

Expected result

Actual result

2018-11-13 17:32:20.465 31602-31602/com.yourcompany.helloaudio I/JUCE: JUCE v5.4.1 2018-11-13 17:32:20.504 31602-31602/com.yourcompany.helloaudio D/OpenGLRenderer: Skia GL Pipeline 2018-11-13 17:32:20.581 31602-31692/com.yourcompany.helloaudio D/NetworkSecurityConfig: No Network Security Config specified, using platform default 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: -----InputDevices: 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: name = Pixel XL built-in microphone 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: id = 15 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: sample rates size = 9 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: num channels = 3 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: name = Pixel XL built-in microphone 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: id = 16 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: sample rates size = 9 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: num channels = 3 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: name = Pixel XL telephony 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: id = 19 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: sample rates size = 3 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: num channels = 2 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: -----OutputDevices: 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: name = Pixel XL built-in earphone speaker 2018-11-13 17:32:20.792 31602-31602/com.yourcompany.helloaudio I/JUCE: id = 2 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: sample rates size = 0 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: num channels = -1 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: name = Pixel XL built-in speaker 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: id = 3 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: sample rates size = 0 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: num channels = -1 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: name = Pixel XL telephony 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: id = 10 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: sample rates size = 0 2018-11-13 17:32:20.793 31602-31602/com.yourcompany.helloaudio I/JUCE: num channels = -1 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio D/OboeAudio: AAudioLoader(): dlopen(libaaudio.so) returned 0x508ac3dd88d2480b 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setChannelCount) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setBufferCapacityInFrames) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setDeviceId) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setDirection) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setFormat) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setFramesPerDataCallback) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setSharingMode) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setPerformanceMode) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setSampleRate) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setUsage) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setContentType) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setInputPreset) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_setSessionId) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStreamBuilder_delete) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getChannelCount) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_close) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getBufferSizeInFrames) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getDeviceId) succeeded. 2018-11-13 17:32:20.800 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getDirection) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getBufferCapacityInFrames) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getFramesPerBurst) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getFramesRead) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getFramesWritten) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getPerformanceMode) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getSampleRate) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getSharingMode) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getState) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getXRunCount) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_requestStart) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_requestPause) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_requestFlush) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_requestStop) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_setBufferSizeInFrames) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudio_convertResultToText) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudio_convertStreamStateToText) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getUsage) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getContentType) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getInputPreset) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio V/OboeAudio: AAudioLoader(): dlsym(AAudioStream_getSessionId) succeeded. 2018-11-13 17:32:20.801 31602-31602/com.yourcompany.helloaudio I/JUCE: Preparing Oboe stream with params: AAudio supported = 1 API = Unspecified DeviceId = -1 Direction = Output SharingMode = Shared ChannelCount = 2 Format = Float SampleRate = 48000 PerformanceMode = LowLatency 2018-11-13 17:32:20.802 31602-31602/com.yourcompany.helloaudio D/OboeAudio: AudioStreamAAudio() call isSupported() 2018-11-13 17:32:20.802 31602-31602/com.yourcompany.helloaudio D/AAudio: AAudioStreamBuilder_openStream() called ---------------------------------------- 2018-11-13 17:32:20.803 31602-31602/com.yourcompany.helloaudio I/AAudioStream: open() rate = 48000, channels = 2, format = 2, sharing = SH, dir = OUTPUT 2018-11-13 17:32:20.803 31602-31602/com.yourcompany.helloaudio I/AAudioStream: open() device = 0, sessionId = 0, perfMode = 12, callback: OFF with frames = 0 2018-11-13 17:32:20.803 31602-31602/com.yourcompany.helloaudio I/AAudioStream: open() usage = 1, contentType = 2, inputPreset = 6

It looks like the AAudioStream is hanging on the call to openStream. This might be an Android, Oboe or Pixel bug so be good to know whether this works on other devices.

dturner commented 5 years ago

When I reboot the Pixel and re-run the app I am able to open the stream on first run (although the stream is immediately closed). This seems to leave a stream hanging, causing subsequent runs to fails in the same way as above.

lukaszkozakiewicz commented 5 years ago

For the record, the issue was due to missing recording permission. The app was requesting 2 input channels,but the permission was not granted and that made Oboe streams to fail. We need to check why the permission was not requested.

dturner commented 5 years ago

A few comments:

1) The default audio project template has setAudioChannels (2, 2); in the MainComponent constructor, which is requesting 2 input channels, however, in the Projucer settings for Android the Audio Input Required setting is set to Default (Disabled) so out of the box the app won't work as intended (even if it doesn't crash it won't be able to create the requested stereo input audio stream). My suggestion would be to change the project source to not request input since (I'm guessing) most apps play sound and don't record it.

2) Even when I set Audio Input Required to Enabled I still don't get the run time permissions dialog to allow me to permit the app to record audio - this is fairly serious because it means that you can't create Android apps which record.

3) The only log entry which indicates theres a problem is this line:

2018-11-15 09:50:21.307 4571-4571/com.yourcompany.helloaudio I/JUCE: JUCE Assertion failure in juce_android_Oboe.cpp:243

I would suggest changing the logging level to ERROR and gracefully exiting the app (closing any open output streams) rather than carrying on executing silently.

alexvoina commented 5 years ago

any updates on this ? I can confirm it's a pixel issue only(I've tried pixel, pixel 2 and pixel 3), and definitely caused by Oboe

dturner commented 5 years ago

I don't think Oboe is causing the issue - the sample apps all run fine on a multitude of Pixel and non-Pixel devices. IIRC there's an issue with JUCE which means that the recording permissions dialog isn't shown, and without the recording permission the app will crash when attempting to open a recording stream.