通常,音声入出力の流れは次のようになります.
バッファーサイズの最適値は環境によって異なります. この値が短すぎると音飛びが起こりますし,長すぎると遅延が発生します. 単に再生したり録音したりするだけであれば,8192程度以上を推奨します. また,フルデュプレックスで動作させる場合は,バッファーサイズを短くしないとかなりの遅延が発生するので, 音飛びが発生しない限界まで短くする程度が良いようです.
現在は,16bit,24bit,32bitがサポートされています. 24bitと32bitの場合は16bitへ変換して再生します.
バッファーの型は,デバイスで使用するbits/sampleの値に応じて変えてください. 16bitまでの場合はshort型,32bitまではlong型のポインタ(メモリ確保したもの)もしくは配列を使用します.
デバイスで使用するbits/sampleの値によらず,データの振幅の範囲は-1.0〜1.0の範囲となります. spReadAudioDoubleWeightedでは,それをさらにweight倍したデータが得られます.
通常は,読み込みが指定した長さに到達するまでこの関数は返りません.
バッファーの型は,デバイスで使用するbits/sampleの値に応じて変えてください. 16bitまでの場合はshort型,32bitまではlong型のポインタ(メモリ確保したもの)もしくは配列を使用します.
デバイスで使用するbits/sampleの値によらず,データの振幅の範囲は-1.0〜1.0の範囲が想定されています. spWriteAudioDoubleWeightedでは,そのデータをさらにweight倍した後にデバイスに渡します.
書き込みは非同期で行われるため,指定した長さまで到達する前に関数から返ってきます. どの程度の速さで関数から返ってくるかは,環境によって異なります.
lengthが小さいときにこの関数を繰り返し呼ぶと,環境によってはデッドロックに陥ります(応答しなくなります). 繰り返し呼ぶ場合は,ある程度の長さになるようにプログラムを組む必要があります. 例えば,ループ再生を行う場合などは,ループ区間が短い場合には,lengthが極めて小さくなる場合があります. その場合には,ある程度の長さのバッファを用意しておき,バッファの中身が適当な長さに到達したらspWriteAudioを呼ぶ,といった実装にして下さい.
Last modified: "2024-06-20 14:53:42 hideki"