# 簡単なPCMストリームのサンプル

1998. 5.28更新

## サンプルについて

このサンプルはワークメモリ既にある波形データをPCMストリームを利用して再生を行うプログラムです．

## サンプルの流れ

サウンドライブラリ・ドライバの初期化を行い，440Hzの音を再生する．
処理の流れとしては

1. サウンドライブラリ・サウンドドライバの初期化（サンプル関数の`SoundInit`を利用）
2. マルチユニットのダウンロード（サンプル関数の`MultiUnitDownload`を利用）
3. PCMストリームポートのハンドル取得（`sdPstmOpenPortPort`）
4. ワークメモリにある波形データの転送（サンプル関数の`OnMemoryPCMStream`を利用）
5. PCMストリームポートのハンドルの破棄（`sdPstmClosePort`）
6. 無限ループ．

となります．

## 注意点

本サンプルには下記の注意事項があります．

1. サウンドドライバファイルをあらかじめワークメモリ上にダウンロードしておく
   サウンドドライバをあらかじめワークメモリ上にダウンロードしておく．アドレスはプログラム内の`SNDDRV_ADR`と合わせておく．アドレスは32バイトアライメントされている必要があります．
2. マルチユニットファイルをあらかじめワークメモリ上にダウンロードしておく
   マルチユニットをあらかじめワークメモリ上にダウンロードしておく．アドレスはプログラム内の`SNDDRV_ADR`と合わせておく．アドレスは32バイトアライメントされている必要があります．
3. 波形データをあらかじめワークメモリ上にダウンロードしておく
   波形データをあらかじめダウンロードしておく．波形データの種類によって下記の項目を修正する．
   1. チャンネル数の修正
      モノラル・ステレオの設定を行う．プログラム内の`PSTM_CH`を使用するチャンネル数にする（モノラルの場合は１，ステレオの場合は２）
   2. サンプリング周波数数の修正
      サンプリング周波数の設定を行う．プログラム内の`WAVE_FREQ`を使用するサンプリング周波数にする．実際には44100等と直接サンプリング周波数を記述するわけではなく，`SDD_PSTM_FREQ_44100`等とマクロ定数を使用する．
   3. 波形データのアドレスの修正
      波形データの先頭アドレスはプログラム内の`WAVE_ADR1`と`WAVE_ADR2`とダウンロードしたアドレスと合わせておく．モノラルの場合は`WAVE_ADR1`のみの修正でも可能．アドレスは32バイトアライメントされている必要があります．
   4. 波形データのサイズの修正
      波形データのサイズはプログラム内の`WAVE_SZ`と合わせておく．サイズは32バイトバウンダリされている必要があります．
   5. 波形データの種類の修正
      波形データの種類はプログラム内の`WAVE_TYPE`と合わせておく．
4. `sdSysServer`の使用法について
   本来は`sdSysServer`はブランクなどの定期的なタイミングで呼び出する．

## 実際のコーディング

実際のコーディングを下記に提示する．なお，このサンプルはエラーチェックをかなり省いています．

簡単なワークメモリ上の波形データのPCMストリームのサンプル
``/********************************************************* * * Sound Library Sample * * ワークメモリ上の波形データをPCMストリームで再生する．
*
*********************************************************/`
#include <sd_sg.h>
`/* サウンドドライバがあるアドレス */`
#define SNDDRV_ADR ( 0x8c050000)
`/* マルチユニットの先頭アドレス */`
#define MLT_ADR ( 0x8c060000)
`/* 使用するチャンネル数（モノラルは１，ステレオは２） */`
#define PSTM_CH ( 2)
`/* 波形のサンプリング周波数（本当に周波数を記述するわけではない） */`
#define WAVE_FREQ ( `SDD_PSTM_FREQ_44100`)
`/* 波形データの種類 */`
#define WAVE_TYPE ( `SDE_PCM_TYPE_16BIT_PCM`)
`/* 波形データの先頭アドレス */`
#define WAVE_ADR1 ( ( Void*)0x8c100000)
`/* 波形データの先頭アドレス */`
#define WAVE_ADR2 ( ( Void*)0x8c800000)
`/* 波形データのサイズ（バイト単位） */`
#define WAVE_SZ ( 0x000100000)
int main( void)
{
``/*
* 初期化を行う
*/`
if ( SoundInit( SNDDRV_ADR) != `SDE_ERR_NOTHING`)
{`
`/* エラーが起こった */`
goto exit;
` }
`/*
* マルチユニットをサウンドメモリにダウンロードする
*/`
if ( MultiUnitDownload( MLT_ADR) != `SDE_ERR_NOTHING`)
{`
`/* エラーが起こった */`
goto exit;
` }
`/*
* PCMストリームを行う
*/`
if ( OnMemoryPCMStream( PSTM_CH, WAVE_TYPE, WAVE_FREQ, WAVE_ADR1, WAVE_ADR2, WAVE_SZ) != `SDE_ERR_NOTHING`)
{`
`/* エラーが起こった */`
goto exit;
` }
` exit:
``/* 無限ループ */`
while ( 1);
return ( 0);
` }
`/*EOF*/`
`

## サンプルの応用

このサンプルを元にGD-FSから逐次波形データを読み込み，OnMemoryPCMStreamを実行するようにするとGD-FSを利用したPCMストリームシステムになり，さらに長時間の音声の再生が可能になります．