連続転送¶
連続転送を開始すると、SDK内部でデバイスから画像取得を繰り返すようになります。 SDK内部には画像を溜め込むリングバッファが存在し、取得した画像は順次バッファに格納されます。
SDKの内部で1枚画像を取得すると、あらかじめ指定した関数(以下、コールバック関数)が呼び出されるため、その関数内で保存処理等を実行してください。
コールバック関数の実行中は、バッファがロックされ上書きされないようになっています。 コールバック関数の処理に時間をかけると、SDK内部の画像取得が追い付いてしまい、画像取得は待機状態に入ります。 その状況になると、フレーム抜けが発生する可能性が高まります。 回避するには、出来る限りリングバッファ数を多く設定しておく必要があります。
注釈
1つのバッファはおよそ0.4MBのメモリを消費します。
警告
リングバッファ数を増やせばフレーム抜けが防げることを保証するわけではありません。OS上の別ソフトの割込み等によりフレーム抜けが発生する場合があります。
リングバッファ数の設定¶
リングバッファ数は下記関数で設定します。
result = PUC_SetRingBufferCount(hDevice, 1024);
if (PUC_CHK_FAILED(result))
{
return;
}
注釈
設定可能な最大リングバッファ数はPUC_MAX_RING_BUF_COUNTで定義されています。
連続転送の開始¶
FILE* fp; _tfopen_s(&fp, _T("test.dat"), _T("wb")); result = PUC_BeginXferData(hDevice, RecieveProc, fp); if (PUC_CHK_FAILED(result)) return; }
PUC_BeginXferData
の引数には、画像の取得毎に呼ばれるコールバック関数へのポインタと、コールバック関数に渡す引数を指定します。
上記の例では、あらかじめオープンしていたファイルポインタを渡しています。
void RecieveProc(PPUC_XFER_DATA_INFO pXferData, void* arg) { FILE* fp = (FILE*)arg; fwrite(pXferData->pData, pXferData->nDataSize, 1, fp); }
コールバック関数では画像をファイルに書き込んでいます。 コールバック関数に時間がかかるとフレーム抜けに繋がるため、出来る限り処理は少なくしてください。
連続転送の終了¶
result = PUC_EndXferData(hDevice); if (PUC_CHK_FAILED(result)) { return; }