# SND_SetupChannelPcm

## 構文

      #include <nitro/snd.h>

      void SND_SetupChannelPcm(
              int chNo,
              SNDWaveFormat format,
              const void* dataAddr,
              SNDChannelLoop loop,
              int loopStart,
              int loopLen,
              int volume,
              SNDChannelDataShift shift,
              int timer,
              int pan );

## 引数

`chNo` | チャンネル番号です。値の範囲は、0〜15です。
`format` | 波形データのフォーマットです。
`dataAddr` | 波形データの先頭アドレスです。４バイトアライメントされている必要があります。
`loop` | ループ再生設定です。
`loopStart` | ループ開始位置です。ワード単位で、値の範囲は、0〜0xffffです。
`loopLen` | ループ長です。ワード単位で、値の範囲は、0〜0x3fffffです。
`volume` | ボリューム値です。値の範囲は、0〜127です。
`shift` | データシフト設定です。
`timer` | タイマー値です。値の範囲は、0x10〜0xffffです。
`pan` | パン値です。値の範囲は、0(左)〜64(中央)〜127(右)です。

## 返り値

なし。

## 説明

PCM再生用にチャンネルをセットアップします。

チャンネル番号`chNo`のチャンネルのパラメータを設定します。 あらかじめ、`SND_LockChannel()` で、 チャンネルをロックしておく必要があります。 パラメータ設定後、実際に再生を開始するためには、 `SND_StartTimer()` を呼びだします。

波形データのフォーマット`format`は、下記の値から選択します。

表 . SNDWaveFormat

ラベル | 説明
--- | ---
SND_WAVE_FORMAT_PCM8 | 8ビットPCM
SND_WAVE_FORMAT_PCM16 | 16ビットPCM
SND_WAVE_FORMAT_ADPCM | IMA-ADPCM

波形データの先頭アドレス`dataAddr`は、４バイトアライメントされている必要があります。

ループ再生設定`loop`は、以下の値から選択します。

表 . SNDChannelLoop

ラベル | 説明
--- | ---
SND_CHANNEL_LOOP_MANUAL | ループの設定と無関係に、再生し続けます。
SND_CHANNEL_LOOP_REPEAT | ループ終端`loopStart + loopLen`まで再生すると、 ループ開始位置`loopStart`の位置から続けて再生します。
SND_CHANNEL_LOOP_1SHOT | ループ終端`loopStart + loopLen`まで再生すると、 再生が自動的に停止します。

ループ開始位置`loopStart` 及びループ長`loopLen`は、 波形データのサイズをワード単位で指定します。 ループ再生設定`loop`がSND_CHANNEL_LOOP_MANUALの時、 値は無視されます。

データシフト設定`shift`は、以下の値から選択します。

表 . SNDChannelDataShift

ラベル | 説明
--- | ---
SND_CHANNEL_DATASHIFT_NONE | データシフトを行いません。
SND_CHANNEL_DATASHIFT_1BIT | 1ビット右シフトします。
SND_CHANNEL_DATASHIFT_2BIT | 2ビット右シフトします。
SND_CHANNEL_DATASHIFT_4BIT | 4ビット右シフトします。

タイマー`timer`は、１サンプルを出力するクロック数を指定します。 １秒あたりのクロック数は、SND_TIMER_CLOCKで、約16.757MHz です。 例えば、サンプリングレートが`rate`[Hz]の波形データを、そのままの音程で再生する場合は、

    timer = SND_TIMER_CLOCK / rate

のように計算します。

### 注意

この関数は、ARM7コマンド予約関数です。 この関数を呼びだした後、 `SND_FlushCommand()` で コマンドを発行して始めて、処理が行われます。

また、処理の完了と同期を取る必要がある場合は、 まず、この関数呼び出しの直後に、 `SND_GetCurrentCommandTag()` で、コマンドタグを取得しておきます。 そしてコマンド発行後に、取得したコマンドタグを使って `SND_IsFinishedCommandTag()` または、 `SND_WaitForCommandProc()` を呼びだして、 処理の完了をチェックしたり、待ったりします。

## 参照

SND_LockChannel, SND_StartTimer, SND_FlushCommand, SND_GetCurrentCommandTag, SND_IsFinishedCommandTag, SND_WaitForCommandProc

## 履歴

2008/11/19 「ループ長」を「データ長」として説明していた誤りを修正
2005/02/17 ARM7コマンド処理の注意書き追加
2004/10/07 SND_CHANNEL_LOOP_REPAET を SND_CHANNEL_LOOP_REPEAT に修正
2004/07/20 初版