Last active
July 3, 2020 21:03
-
-
Save reuniware/51da26f6a014d37e59b79fe24ee06c65 to your computer and use it in GitHub Desktop.
Android Google Oboe Audio Recording.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <jni.h> | |
| #include <string> | |
| #include <oboe/Oboe.h> | |
| #include "OboeAudioRecorder.h" | |
| #include "oboe/samples/debug-utils/logging_macros.h" | |
| class OboeAudioRecorder: public oboe::AudioStreamCallback { | |
| private: | |
| oboe::ManagedStream outStream; | |
| oboe::AudioStream *stream{}; | |
| oboe::DataCallbackResult | |
| onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) override { | |
| LOGE("onAudioReady"); | |
| } | |
| static OboeAudioRecorder *singleton; | |
| explicit OboeAudioRecorder() = default; | |
| public: | |
| static OboeAudioRecorder *get() { | |
| if (singleton == nullptr) | |
| singleton = new OboeAudioRecorder(); | |
| return singleton; | |
| } | |
| bool isRecording = true; | |
| void StopAudioRecorder() { | |
| this->isRecording = false; | |
| } | |
| void StartAudioRecorder() { | |
| this->isRecording = true; | |
| oboe::AudioStreamBuilder builder; | |
| builder.setDirection(oboe::Direction::Input); | |
| builder.setPerformanceMode(oboe::PerformanceMode::LowLatency); | |
| //builder.setFormat(oboe::AudioFormat::Float); | |
| builder.setFormat(oboe::AudioFormat::I16); | |
| builder.setChannelCount(oboe::ChannelCount::Mono); | |
| builder.setInputPreset(oboe::InputPreset::Unprocessed); | |
| builder.setSharingMode(oboe::SharingMode::Shared); | |
| builder.setSampleRate(48000); | |
| builder.setAudioApi(oboe::AudioApi::OpenSLES); | |
| //builder.setCallback(this); | |
| oboe::Result r = builder.openStream(&stream); | |
| if (r != oboe::Result::OK) { | |
| return; | |
| } | |
| r = stream->requestStart(); | |
| if (r != oboe::Result::OK) { | |
| return; | |
| } | |
| auto a = stream->getState(); | |
| if (a == oboe::StreamState::Started) { | |
| constexpr int kMillisecondsToRecord = 2; | |
| auto requestedFrames = (int32_t) (kMillisecondsToRecord * | |
| (stream->getSampleRate() / | |
| oboe::kMillisPerSecond)); | |
| __android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", "requestedFrames = %d", | |
| requestedFrames); | |
| int16_t mybuffer[requestedFrames]; | |
| constexpr int64_t kTimeoutValue = 3 * oboe::kNanosPerMillisecond; | |
| int framesRead = 0; | |
| do { | |
| auto result = stream->read(mybuffer, requestedFrames, 0); | |
| if (result != oboe::Result::OK) { | |
| break; | |
| } | |
| framesRead = result.value(); | |
| __android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", "framesRead = %d", | |
| framesRead); | |
| if (framesRead > 0) { | |
| break; | |
| } | |
| } while (framesRead != 0); | |
| while (isRecording) { | |
| auto result = stream->read(mybuffer, requestedFrames, kTimeoutValue * 1000); | |
| if (result == oboe::Result::OK) { | |
| auto nbFramesRead = result.value(); | |
| __android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", "nbFramesRead = %d", | |
| nbFramesRead); | |
| for (int i = 0; i < nbFramesRead; i++) { | |
| __android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", | |
| "nbFramesRead[%d] = %d", i, mybuffer[i]); | |
| } | |
| } else { | |
| auto error = convertToText(result.error()); | |
| __android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", "error = %s", error); | |
| } | |
| } | |
| stream->requestStop(); | |
| stream->close(); | |
| } | |
| } | |
| }; | |
| OboeAudioRecorder *OboeAudioRecorder::singleton = nullptr; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment