2016-10-03 13 views
0

PortAudioを使用してオーディオWAVファイルを読み込んでいます。コールバック関数は正常に動作しており、ファイルはUbuntoで正常に再生されています。この問題は、Pa_GetStreamTimeを使用して時刻を取得しようとするときに0を返します。私はportaudioのドキュメントとサンプルを読んでいますが、トラブルシューティングの方法やその機能を使用する例は見つかりませんでした。私はAPIドキュメントhereを調べましたが、何も鐘が鳴りません。誰かがヒントを提供することができれば、それは非常に高く評価されるだろう。以下は、コールバック関数が実行されている実装部分です。最終目標はwavファイルのFTTを表示しているため、Qtを使用しています。前もって感謝します。Pa_GetStreamTimeが0時間を返す

int playAudio::patestCallback(const void *inputBuffer, void *outputBuffer, 
         unsigned long framesPerBuffer, 
         const PaStreamCallbackTimeInfo* timeInfo, 
         PaStreamCallbackFlags statusFlags, 
         void *userData) 
{ 

    /* Cast data passed through stream to our structure. */ 
    // data = (WAV*)userData; 
    float *out = (float*)outputBuffer; 
    (void) inputBuffer; /* Prevent unused variable warning. */ 

    /*terminates the stream flows and reset cursor.*/ 
    if (cursor == playAudio::SubChunk2Size/4) 
    { 
     cursor = 0; 
     return paComplete; 
    } 

    for (int i = 0; i < framesPerBuffer; i++) 
    { 
     if (cursor == playAudio::SubChunk2Size/4) break; // breaks if samples reached last. 
     *(out++) = pLeftChannel[cursor]; 
     *(out++) = pRightChannel[cursor]; 
     cursor++; 

    } 
    // qDebug()<<cursor; 
    playAudio::audioTime = Pa_GetStreamTime(stream); 
    qDebug() << playAudio::audioTime; 
    return paContinue; 
} 

答えて

0

PortAudioオーディオコールバックのthe documentationを引用すると:

始める前に、それはコールバックが 繊細な場所であることを認識することが重要です。これは、一部のシステムで 特殊スレッドまたは割り込みハンドラでコールバックを実行するため、残りのコードと同じように扱われることはほとんどありません。現代のシステムでは、 はコールバックで許可されない呼び出しを行うことでクラッシュする可能性がありますが、 では、コードにグリッチフリーのオーディオを生成したい場合は、 実行に無制限の量の をとります。これらはお使いのプラットフォームによって異なりますが、 には、メモリ 割り振り/割り当て解除、I/O (ファイルI/Oおよびprintf()などの I/Oを含む)コンテキスト切り替え(exec()やyield()など)、 mutex操作、またはOSに依存する可能性のあるもの。 の場合、短いクリティカルセクションが安全であると考える場合は、優先度 の逆転についてお読みください。 WindowsとMac OSのスケジューラには、リアルタイムの安全性がないので、 優先度逆転防止機能はありません。他のプラットフォームでは特別なmutex フラグが必要です。 さらに、ドキュメントで明示的に許可されている以外のコールバックでPortAudio API関数 を呼び出すことは安全ではありません。

強調鉱山。

つまり、コールバック内からPa_GetStreamTime()を呼び出すことは、未定義の動作です。しかし、最初にその関数を呼び出す必要はありません。どうして?コールバックの4番目のパラメータはPaStreamCallbackTimeInfo構造体なので、アクセスしようとしているのとまったく同じタイミング情報が含まれています。

また、qDebugコールでは、オーディオ再生がうまくいっていない可能性があります。 stdoutへの書き込みは、リアルタイムのオーディオコールバック内で完了するのに時間がかかりすぎるだけです。

+0

実際には、構造体PaStreamCallを試しました。なぜなら、私はコールバック関数を混乱させたくないからですが、currentTimeメンバでは0になっています。 outputBufferDACtimeを使ってデータの時刻を見ることはできましたが、それをどう扱うか分かりませんでした。しかし、結果は得られませんでしたので、currentTimeを使用したときに同じ結果を返すPa_getStreamTimeを試しました。 qDebugについてあなたが正しいです、私のケースでは、問題を与えていない、最終的に削除されます。 portaudioを使用して情報を共有し、時間を取得するか、timeInfo.OutputBufferDACTimeからそのデータを処理する方法を知っている場合。 – luffyKun

関連する問題