情報
コールバック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
...
補遺:コードのこの同じ部分は
ALSAバックエンドで正しい時刻情報を取得する方法はありますか? – Jovito