我试着把这门课变成单身,但没有成功。你会怎么做?我在互联网上看到,我应该修改头文件和cpp文件。我只试过改变cpp文件..。我需要做的是能够从JNI调用中访问布尔值"isRecording“。
谢谢。
OboeAudioRecorder.cpp
#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 {
public:
bool isRecording = true;
explicit OboeAudioRecorder() { }
void StartAudioRecorder() {
oboe::AudioStreamBuilder builder;
builder.setDirection(oboe::Direction::Input);
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
builder.setFormat(oboe::AudioFormat::Float);
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;
const int32_t requestedFrames = (int32_t) (kMillisecondsToRecord * (stream->getSampleRate() / oboe::kMillisPerSecond));
__android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", "requestedFrames = %d", requestedFrames);
float_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] = %f", i, mybuffer[i]);
}
} else {
auto error = convertToText(result.error());
__android_log_print(ANDROID_LOG_INFO, "OboeAudioRecorder", "error = %s", error);
}
}
stream->requestStop();
stream->close();
}
}
oboe::DataCallbackResult onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
LOGE("onAudioReady");
}
private:
oboe::ManagedStream outStream;
oboe::AudioStream *stream{};
};OboeAudioRecorder.h
#ifndef OBOEAUDIORECORDER_OBOEAUDIORECORDER_H
#define OBOEAUDIORECORDER_OBOEAUDIORECORDER_H
#endif //OBOEAUDIORECORDER_OBOEAUDIORECORDER_H发布于 2020-07-03 19:30:51
由于以下链接(法语),我已经能够使这个类成为单例:https://h-deb.clg.qc.ca/Sujets/Divers--cplusplus/CPP--Singletons.html
下面是带有单例模式的类(注意最后一行被声明在" class“作用域之外):
#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)
singleton = new OboeAudioRecorder();
return singleton;
}
bool isRecording = true;
void StartAudioRecorder() {
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);
//const int32_t requestedFrames = 65536;
//int16_t mybuffer[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;发布于 2020-08-26 17:35:12
将类创建为单例的一个简单方法是添加一个getInstance()方法,该方法在方法中使用一个静态变量。
static OboeAudioRecorder &getInstance() {
static EngineOpenSLES sInstance;
return sInstance;
}还可以通过将构造函数设置为私有并删除副本运算符来防止创建其他实例:
private:
// Make this a safe Singleton
OboeAudioRecorder()= default;
~OboeAudioRecorder()= default;
public:
OboeAudioRecorder(const OboeAudioRecorder&)= delete;
OboeAudioRecorder& operator=(const OboeAudioRecorder&)= delete;https://stackoverflow.com/questions/62718266
复制相似问题