2017-03-01 20 views
0

です:PaStreamCallbackTimeInfoメンバーは<a href="http://portaudio.com/docs/v19-doxydocs/api_overview.html" rel="nofollow noreferrer">PortAudio docs</a>からすべて0

情報

コールバックI/O方式を使用する場合は、あなたのストリームのコールバック関数 が PaStreamCallbackTimeInfo構造体へのポインタを経由してタイミング情報を受け取るタイミングストリーム。この構造体には、現在の時刻と推定されたハードウェアのキャプチャと再生の間に、入力バッファと出力バッファの最初のサンプルの時刻が含まれています( )。 は、ストリーム固有のクロックを基準にして秒単位で測定されます。 現在のストリームの時計時刻は、Pa_GetStreamTime()を使用して取得できます。

したがって、PaStreamCallbackTimeInfo::currentTimeは現在の時刻を何らかの形で示し、PaStreamCallbackTimeInfo::outputBufferDacTimeはカレントバッファの最初のサンプルの出力時刻を示す必要があります。私は理由を知りませんが、Linuxではこれらの値はすべて私にとってゼロです。たぶん私は間違ったことをしているのかもしれないここでは、コードと出力です:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <math.h> 
#include "portaudio.h" 

#define PI 3.14159265359 
#define SRATE 44100 
#define FREQ 440 
#define DURATION 5000 

int 
audio_callback(
    const void* inbuf, 
    void* outbuf, 
    unsigned long bufsize, 
    const PaStreamCallbackTimeInfo* time_info, 
    PaStreamCallbackFlags status_flags, 
    void* user_data) 
{ 
    (void)inbuf; 
    (void)status_flags; 

    double* phase = (double*)user_data; 
    float* out = (float*)outbuf; 

    printf(
     "current time = %f; out time = %f\n", 
     time_info->currentTime, 
     time_info->outputBufferDacTime); 

    for (unsigned long i = 0; i < bufsize; i++) 
    { 
     *phase += 2 * PI * FREQ/SRATE; 
     out[i] = sin(*phase); 
    } 

    return 0; 
} 

int  
main(int argc, char** argv) 
{ 
    (void)argc; 
    (void)argv; 

    PaError pa_error; 
    PaStream* stream = NULL; 
    int error = 0;  
    double phase = 0; 

    pa_error = Pa_Initialize(); 
    if (pa_error != paNoError) 
    { 
     return 1; 
    } 

    pa_error = Pa_OpenDefaultStream(
     &stream, 
     0, 
     1, 
     paFloat32, 
     SRATE, 
     paFramesPerBufferUnspecified, 
     &audio_callback, 
     &phase); 
    if (pa_error != paNoError) 
    { 
     error = 1; 
     goto exit; 
    } 

    pa_error = Pa_StartStream(stream); 
    if (pa_error != paNoError) 
    { 
     error = 1; 
     goto exit; 
    } 

    Pa_Sleep(DURATION); 

    pa_error = Pa_CloseStream(stream); 
    if (pa_error != paNoError) 
    { 
     error = 1; 
     goto exit; 
    } 

    printf("Done.\n"); 

exit: 
    Pa_Terminate(); 

    if (pa_error != paNoError) 
    { 
     printf("PortAudio error: %s\n", Pa_GetErrorText(pa_error)); 
    } 

    return error; 
} 

出力:

current time = 0.000000; out time = 0.000000 
current time = 0.000000; out time = 0.000000 
current time = 0.000000; out time = 0.000000 
current time = 0.000000; out time = 0.000000 
... 

補遺:コードのこの同じ部分は

答えて

0

にWindowsの10でのVisual Studioを使用して例のコンパイルを正常に動作するようです私のMac上で問題なく、意味のある時刻情報を返すので、問題はあなたのコードに含まれていません。

あなたがLinux上で使用しているオーディオたバックエンド言っていないが、あなたはALSAPulseAudioはを使用している場合、それらとの時間情報を取得する問題(例えばthereを参照)がなされてきました。 ALSA/PulseAudioのこの具体的なケースでは、パルスが責任を負うものであり、PortAudioはそれとは関係ありません。

あなたが別のオーディオバックエンドを使用している場合は、対応するsrc/hostapi/<your_backend>PortAudioソースフォルダにGetStreamTime()機能の実装をチェックしたい場合があります。


実際の製品のオーディオコールバックでは、I/O操作をしないでください。 printfは(オーディオコールバックの視点から)実行にかなりの時間を要する膨大な機能です。

+0

ALSAバックエンドで正しい時刻情報を取得する方法はありますか? – Jovito

関連する問題

 関連する問題