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

1998. 9.29更新

サンプルについて

 このサンプルはワークメモリ既にある波形データを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を使用するチャンネル数にする(モノラルの場合は1,ステレオの場合は2)

    2. サンプリング周波数数の修正
       サンプリング周波数の設定を行う.プログラム内のWAVE_FREQを使用するサンプリング周波数にする.実際には44100等と直接サンプリング周波数を記述するわけではなく,SDD_PSTM_FREQ_44100等とマクロ定数を使用する.

    3. 波形データのアドレスの修正
       波形データの先頭アドレスはプログラム内のWAVE_ADR1WAVE_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)

/*  使用するチャンネル数(モノラルは1,ステレオは2)  */
#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ストリームシステムになり,さらに長時間の音声の再生が可能になります.