# NNSSndStrmCallback

## 構文

      #include <nnsys/snd.h>

      typedef void (*NNSSndStrmCallback)(
              NNSSndStrmCallbackStatus status,
              int numChannles,
              void* buffer[],
              u32 len,
              NNSSndStrmFormat format,
              void* arg );

## 引数

`status` | コールバックの状態です。
`numChannles` | チャンネル数です。
`buffer` | 各チャンネル毎のバッファの先頭アドレスの配列です。
`len` | 各チャンネル毎のバッファのバイト長です。
`format` | サンプルデータフォーマットです。
`arg` | ユーザー引数です。

## 返り値

なし。

## 説明

ストリーム再生時に、波形データの補充が必要になったとき呼びだされるコールバック関数です。

このコールバック関数は、 `NNS_SndStrmSetup`関数、 `NNS_SndArcStrmStartEx2`関数、 `NNS_SndArcStrmPrepareEx2`関数 で登録されます。

`NNS_SndStrmSetup`関数で登録したコールバック関数は、 渡されたバッファに対して、波形データを供給する義務があります。 `NNS_SndArcStrmStartEx2`関数または、 `NNS_SndArcStrmPrepareEx2`関数で登録したコールバック関数は、 サウンドアーカイブストリームライブラリによって、波形データが供給された後、呼びだされますので、 波形データ供給の義務はありません。 ただし、波形データを加工することは可能です。

コールバック関数は、２種類のタイミングで呼びだされます。 １つは、ストリーム再生を始める前に、あらかじめストリームバッファ全体に波形データを満たしておく必要があるために 呼びだされます。この時、コールバックの状態`status`に、 NNS_SND_STRM_CALLBACK_SETUPが渡されます。 もう１つのコールバック呼び出しのタイミングは、ストリーム再生中に呼びだされるものです。 これは、再生によって消費されたバッファに、続きの波形データを補充する必要があるために呼びだされます。 この時は、コールバックの状態`status`に、 NNS_SND_STRM_CALLBACK_INTERVALが渡されます。

チャンネル数`numChannles`には、ストリーム再生のために使用している チャンネル数が渡されます。 バッファの先頭アドレスの配列`buffer`の要素数は、 `numChannles`個になります。 各チャンネル毎のバッファサイズは、`len`バイトです。

サンプルデータフォーマット`format`は、下記の値のいずれかです。

表 . NNSSndStrmFormat

ラベル | 説明
--- | ---
NNS_SND_STRM_FORMAT_PCM8 | 8ビットPCM
NNS_SND_STRM_FORMAT_PCM16 | 16ビットPCM

### 注意

波形データを補充（加工）した後は、メインメモリに確実に書き込まれるように、 `DC_FlushRange`関数などを呼びだすようにしてください。

`NNS_SndStrmSetup`関数で登録したコールバック関数は、割り込み禁止状態で呼びだされることに注意してください。 一方、`NNS_SndArcStrmStartEx2`関数または、 `NNS_SndArcStrmPrepareEx2`関数 で登録したコールバック関数は、ストリームスレッドから呼びだされることに注意してください。

必ずしもコールバック関数で、波形データの補充を完了させる必要はありませんが、 次にその領域が再生されるまでに補充を完了しないと、 正常な音声が出力されなくなります。

## 参照

NNS_SndStrmSetup, NNS_SndArcStrmStartEx2, NNS_SndArcStrmPrepareEx2

## 履歴

2004/11/26 NNS_SndStrmSetup関数の説明から分離