mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-06-25 12:29:32 -04:00
92 lines
3.1 KiB
C++
92 lines
3.1 KiB
C++
/*
|
|
* Copyright 2022 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
|
|
static const char *TAG = "SimpleNoiseMaker";
|
|
|
|
#include <android/log.h>
|
|
|
|
#include <SimpleNoiseMaker.h>
|
|
|
|
using namespace oboe;
|
|
|
|
oboe::Result SimpleNoiseMaker::open() {
|
|
// Use shared_ptr to prevent use of a deleted callback.
|
|
mDataCallback = std::make_shared<MyDataCallback>();
|
|
mErrorCallback = std::make_shared<MyErrorCallback>(this);
|
|
|
|
AudioStreamBuilder builder;
|
|
oboe::Result result = builder.setSharingMode(oboe::SharingMode::Exclusive)
|
|
->setPerformanceMode(oboe::PerformanceMode::LowLatency)
|
|
->setFormat(oboe::AudioFormat::Float)
|
|
->setChannelCount(kChannelCount)
|
|
->setDataCallback(mDataCallback)
|
|
->setErrorCallback(mErrorCallback)
|
|
// Open using a shared_ptr.
|
|
->openStream(mStream);
|
|
return result;
|
|
}
|
|
|
|
oboe::Result SimpleNoiseMaker::start() {
|
|
return mStream->requestStart();
|
|
}
|
|
|
|
oboe::Result SimpleNoiseMaker::stop() {
|
|
return mStream->requestStop();
|
|
}
|
|
|
|
oboe::Result SimpleNoiseMaker::close() {
|
|
return mStream->close();
|
|
}
|
|
|
|
/**
|
|
* This callback method will be called from a high priority audio thread.
|
|
* It should only do math and not do any blocking operations like
|
|
* reading or writing files, memory allocation, or networking.
|
|
* @param audioStream
|
|
* @param audioData pointer to an array of samples to be filled
|
|
* @param numFrames number of frames needed
|
|
* @return
|
|
*/
|
|
DataCallbackResult SimpleNoiseMaker::MyDataCallback::onAudioReady(
|
|
AudioStream *audioStream,
|
|
void *audioData,
|
|
int32_t numFrames) {
|
|
// We requested float when we built the stream.
|
|
float *output = (float *) audioData;
|
|
// Fill buffer with random numbers to create "white noise".
|
|
int numSamples = numFrames * kChannelCount;
|
|
for (int i = 0; i < numSamples; i++) {
|
|
// drand48() returns a random number between 0.0 and 1.0.
|
|
// Center and scale it to a reasonable value.
|
|
*output++ = (float) ((drand48() - 0.5) * 0.6);
|
|
}
|
|
return oboe::DataCallbackResult::Continue;
|
|
}
|
|
|
|
void SimpleNoiseMaker::MyErrorCallback::onErrorAfterClose(oboe::AudioStream *oboeStream,
|
|
oboe::Result error) {
|
|
__android_log_print(ANDROID_LOG_INFO, TAG,
|
|
"%s() - error = %s",
|
|
__func__,
|
|
oboe::convertToText(error)
|
|
);
|
|
// Try to open and start a new stream after a disconnect.
|
|
if (mParent->open() == Result::OK) {
|
|
mParent->start();
|
|
}
|
|
}
|