Метод обратного вызова onAudioReady для Oboe никогда не вызывается - PullRequest
0 голосов
/ 18 апреля 2020

Я использую библиотеку Oboe для музыкального c android приложения, разрабатываемого на Qt.

В моем классе обработки звука, который происходит от 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()

Поэтому, когда я запускаю приложение в * Эмулятор 1010 *, я получаю в консоли следующее:

D AAudio  : AAudioStreamBuilder_openStream() called ----------------------------------------
D AudioStreamBuilder: build() EXCLUSIVE sharing mode not supported. Use SHARED.
D         : PlayerBase::PlayerBase()
I AAudioStream: open() rate   = 0, channels    = 2, format   = 2, sharing = SH, dir = OUTPUT
I AAudioStream: open() device = 0, sessionId   = 0, perfMode = 12, callback: ON with frames = 0
I AAudioStream: open() usage  = 1, contentType = 2, inputPreset = 6
D AudioStreamTrack: open(), request notificationFrames = -8, frameCount = 0
I AudioTrack: AUDIO_OUTPUT_FLAG_FAST successful; frameCount 0 -> 5760
W AudioStreamTrack: open() sampleRate changed from 0 to 48000
W AudioStreamTrack: open() flags changed from 0x00000104 to 0x00000004
D AAudio  : AAudioStreamBuilder_openStream() returns 0 = AAUDIO_OK for (0xd807c400) ----------------
D AAudio  : AAudioStreamBuilder_openStream() called ----------------------------------------
D AudioStreamBuilder: build() EXCLUSIVE sharing mode not supported. Use SHARED.
D         : PlayerBase::PlayerBase()
I AAudioStream: open() rate   = 48000, channels    = 2, format   = 2, sharing = SH, dir = INPUT
I AAudioStream: open() device = 0, sessionId   = 0, perfMode = 12, callback: ON with frames = 0
I AAudioStream: open() usage  = 1, contentType = 2, inputPreset = 6
D AudioStreamRecord: open() used a different device format but no FAST path, reopen
W AudioStreamRecord: open() flags changed from 0x00000005 to 0x00000000
W AudioStreamRecord: open() perfMode changed from 12 to 10
D AAudio  : AAudioStreamBuilder_openStream() returns 0 = AAUDIO_OK for (0xd71d7200) ----------------

1 Ответ

0 голосов
/ 18 апреля 2020

Я понял это. Это был указатель на обратный вызов, который был неправильным. Я изменил

inBuilder->setCallback(mCallback)

на

inBuilder->setCallback(this)

, и это вызвало срабатывание обратного вызова. Мне нужно выяснить, почему

AudioStreamCallback *mCallback

- неправильный тип, чтобы сохранить точку зрения на это!

...