首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怎样才能让这门课成为单身呢?

怎样才能让这门课成为单身呢?
EN

Stack Overflow用户
提问于 2020-07-03 15:13:22
回答 2查看 108关注 0票数 0

我试着把这门课变成单身,但没有成功。你会怎么做?我在互联网上看到,我应该修改头文件和cpp文件。我只试过改变cpp文件..。我需要做的是能够从JNI调用中访问布尔值"isRecording“。

谢谢。

OboeAudioRecorder.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#ifndef OBOEAUDIORECORDER_OBOEAUDIORECORDER_H
#define OBOEAUDIORECORDER_OBOEAUDIORECORDER_H


#endif //OBOEAUDIORECORDER_OBOEAUDIORECORDER_H
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-03 19:30:51

由于以下链接(法语),我已经能够使这个类成为单例:https://h-deb.clg.qc.ca/Sujets/Divers--cplusplus/CPP--Singletons.html

下面是带有单例模式的类(注意最后一行被声明在" class“作用域之外):

代码语言:javascript
复制
#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;
票数 0
EN

Stack Overflow用户

发布于 2020-08-26 17:35:12

将类创建为单例的一个简单方法是添加一个getInstance()方法,该方法在方法中使用一个静态变量。

代码语言:javascript
复制
static OboeAudioRecorder &getInstance() {
    static EngineOpenSLES sInstance;
    return sInstance;
}

还可以通过将构造函数设置为私有并删除副本运算符来防止创建其他实例:

代码语言:javascript
复制
private:
    // Make this a safe Singleton
    OboeAudioRecorder()= default;
    ~OboeAudioRecorder()= default;
public:
    OboeAudioRecorder(const OboeAudioRecorder&)= delete;
    OboeAudioRecorder& operator=(const OboeAudioRecorder&)= delete;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62718266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档