Android 永远不会调用双簧管的onAudioReady回调方法

Android 永远不会调用双簧管的onAudioReady回调方法,android,c++,qt,oboe,Android,C++,Qt,Oboe,我正在使用双簧管库开发Qt中的音乐android应用程序 在我从AudioStreamCallback获得的声音处理类中,我使用构建器创建录音和播放流,效果很好,打开两个流时,我收到了AAUDIO_OK。我已将该类注册为两个流上的回调,但由于某些原因,从未为任何一个流调用onAudioReady回调方法。我简化了下面的代码,但这让我发疯,我一定是做错了什么,但我无法理解 #include <oboe/Oboe.h> #include <QDebug> class CSo

我正在使用双簧管库开发Qt中的音乐android应用程序

在我从AudioStreamCallback获得的声音处理类中,我使用构建器创建录音和播放流,效果很好,打开两个流时,我收到了AAUDIO_OK。我已将该类注册为两个流上的回调,但由于某些原因,从未为任何一个流调用onAudioReady回调方法。我简化了下面的代码,但这让我发疯,我一定是做错了什么,但我无法理解

#include <oboe/Oboe.h>
#include <QDebug>

class CSound : pulic QThread, public oboe::AudioStreamCallback
{
public:
   CSound() {    }

   void CSound::setupStreams() {
      mCallback = this;
      oboe::AudioStreamBuilder inBuilder, outBuilder;
      outBuilder->setCallback(mCallback)
           ->setDirection(oboe::Direction::Output)
           ->setChannelCount(oboe::ChannelCount::Stereo)
           ->setFormat(oboe::AudioFormat::Float)
           ->setSharingMode(oboe::SharingMode::Exclusive)
           ->setPerformanceMode(oboe::PerformanceMode::LowLatency);
       oboe::Result result = outBuilder.openManagedStream(mPlayStream);
       if (result != oboe::Result::OK) {
         return;
       }
       inBuilder->setCallback(mCallback)
            ->setDirection(oboe::Direction::Input)
            ->setBufferCapacityInFrames(256)
            ->setSampleRate(48000)
            ->setChannelCount(oboe::ChannelCount::Stereo)
            ->setFormat(oboe::AudioFormat::Float)
            ->setSharingMode(oboe::SharingMode::Exclusive)
            ->setPerformanceMode(oboe::PerformanceMode::LowLatency);
       result = inBuilder.openManagedStream(mRecordingStream);
       if (result != oboe::Result::OK) {
           qInfo() << "Error, stream closing";
           closeStream(mPlayStream);
           return;
       } 
   }

   virtual oboe::DataCallbackResult onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) {
       qInfo() << "Never called";
   }

private:
   AudioStreamCallback *mCallback;
   oboe::ManagedStream mRecordingStream;
   oboe::ManagedStream mPlayStream;
};

CSound::Start()

我已经弄明白了。指向回调的指针是错误的。我换了房间

inBuilder->setCallback(mCallback)

这导致了回调被触发。我需要弄清楚原因

AudioStreamCallback *mCallback

不是将点存储到此位置的正确类型

我已经弄明白了。指向回调的指针是错误的。我换了房间

inBuilder->setCallback(mCallback)

这导致了回调被触发。我需要弄清楚原因

AudioStreamCallback *mCallback
不是将点存储到此位置的正确类型

传递(此)是正确的,因为您的类实现了oboe::AudioStreamCallback

我注意到您对输入和输出都使用相同的回调方法。 通常我们只使用输出回调,然后从输出回调读取输入流中的()数据。

传递(这)是正确的,因为您的类实现了oboe::AudioStreamCallback

managedStream->requestStart();
我注意到您对输入和输出都使用相同的回调方法。 通常,我们只使用输出回调,然后从输出回调从输入流读取()数据

managedStream->requestStart();
OpenManage Stream
之后需要

例如:

Result result = builder.setDirection(Direction::Input)
        ->setPerformanceMode(PerformanceMode::PowerSaving)
        ->setSampleRate(sampleRate)
        ->setSharingMode(SharingMode::Exclusive)
        ->setFormat(AudioFormat::Float)
        ->setChannelCount(ChannelCount::Mono)
        ->setCallback(callback)
        ->openManagedStream(managedStream);

if (result == Result::OK) {
    managedStream->requestStart();
}
OpenManage Stream
之后需要

例如:

Result result = builder.setDirection(Direction::Input)
        ->setPerformanceMode(PerformanceMode::PowerSaving)
        ->setSampleRate(sampleRate)
        ->setSharingMode(SharingMode::Exclusive)
        ->setFormat(AudioFormat::Float)
        ->setChannelCount(ChannelCount::Mono)
        ->setCallback(callback)
        ->openManagedStream(managedStream);

if (result == Result::OK) {
    managedStream->requestStart();
}