0
votes

La méthode de rappel onAudioReady pour Oboe n'est jamais appelée

J'utilise la bibliothèque Oboe pour une application Android de musique en développement dans Qt.

Dans ma classe de traitement du son qui dérive d'AudioStreamCallback, j'utilise le constructeur pour créer à la fois un flux d'enregistrement et de lecture et cela fonctionne bien et j'ai reçu AAUDIO_OK en conséquence pour ouvrir les deux flux. J'ai enregistré cette classe comme rappel sur les deux flux, mais pour une raison quelconque, ma méthode de rappel onAudioReady n'est jamais appelée pour aucun des flux. J'ai simplifié mon code ci-dessous, mais cela me rend fou, je dois faire quelque chose de vraiment mal, mais je ne peux pas le comprendre.

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) ----------------

Ainsi, lorsque j'exécute l'application dans l'émulateur Android, j'obtiens ce qui suit dans la console:

#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()


0 commentaires

3 Réponses :


0
votes

Je l'ai compris. C'était le pointé du rappel qui était erroné. J'ai changé le

AudioStreamCallback *mCallback

à

inBuilder->setCallback(this)

et cela a provoqué le déclenchement du rappel. J'aurai besoin de comprendre pourquoi

inBuilder->setCallback(mCallback)

n'est pas le bon type pour stocker le point à cela!


0 commentaires

1
votes

Passer (this) est correct car votre classe implémente oboe :: AudioStreamCallback.

Je remarque que vous utilisez la même méthode de rappel pour l'entrée et la sortie. Normalement, nous utilisons uniquement un rappel de sortie, puis les données read () du flux d'entrée du rappel de sortie.


0 commentaires

0
votes
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();
}

0 commentaires