オーディオパラメータチェッカ Ver.1.0 [背景] オーディオのプログラミングで最も気を使うことは、各種バッファのサイズです。 メモリ効率を考えるとできるだけ小さな値にしておきたいものですが、小さすぎると ノイズ発生の原因となります。また、実際にどれだけ利用されているかもオーディオ ライブラリを改造して調べるしかありませんでした。 [内容] このツールを用いることで、与えられたデータの各種パラメータについて必要値や影響を 知ることができます。また、普通に演奏しているわけではないため高速に計測できます。 ツールは、MUSライブラリ用とSGIオーディオライブラリ用に分かれています。 また、シーケンス用とサウンドエフェクト用にも分かれています。 さらに、それぞれタイプ1とタイプ2の2種類のツールで構成されています。 このツールでは、n_audioマイクロコードを前提としています。 このツールでは、オーディオマネージャとDMAルーティンにNuSystemのオーディオ ライブラリのものを流用しています。その他のプログラム(ライブラリ)を利用している 場合でもそれほど値は変わらないでしょう。 計測できるパラメータは以下の通りです。 (タイプ1) ・DMAバッファの最低必要サイズ - MUSライブラリではmusConfigのメンバsyn_dma_buf_sizeで指定するパラメータ - nualsgiライブラリでは、グローバル変数nuAuDmaBufSizeで指定するパラメータ ・普通に演奏したときの最大消費イベント数 (SGIオーディオライブラリのみ) - ALSeqpConfigまたはALSndpConfigのメンバmaxEventsで指定するパラメータ ・必要チャンネル数 (MUSライブラリのみ) - musConfigのメンバchannelsで指定するパラメータ ・普通に演奏したときの最大消費アップデート数 - MUSライブラリでは、musConfigのメンバsyn_updatesで指定するパラメータ - SGIオーディオライブラリでは、ALSynConfigのメンバmaxUpdatesで指定する パラメータ ・普通に演奏したときのACMD(コマンドリスト)の長さの最大長 - MUSライブラリでは、musConfigのメンバsyn_rsp_cmdsで指定するパラメータ - nualsgiライブラリでは、グローバル変数nuAuAcmdLenで指定するパラメータ (タイプ2) ・DMAバッファのサイズを指定して、その場合の最低必要バッファ数 - MUSライブラリでは、musConfigのメンバsyn_num_dma_bufsで指定するパラメータ - nualsgiライブラリでは、グローバル変数nuAuDmaBufNumで指定するパラメータ ・DMAバッファのサイズを指定して、1フレーム中のDMA回数の最大値 ・DMAバッファのサイズを指定して、1フレーム中のDMA回数の平均値 [考察] このツールで求められる各種パラメータについて簡単に解説します。 DMAバッファのサイズは、最低必要サイズを下回るとノイズが発生します。 ゲーム中で最大の最低必要サイズよりも大きな値を指定する必要があります。 (SGIオーディオライブラリのみ) イベント数は足りなくなると必要なパラメータ 変更がされないため演奏が正常に行われません。必ず必要最大数分は確保しま しょう。また、複数のシーケンスまたはサウンドエフェクトが同時に演奏される 場合、それらを合計しただけ必要になります。また、パンの設定などでも消費 されていくので十分な余裕を確保しなくてはいけません。 (MUSライブラリのみ) 必要チャンネル数は、フルリリースモードのon/offの 間違いなどに気付きやすいよう表示しています。また、データ演奏開始時から 終了時まで固定のチャンネル数を消費するため、最大チャンネル数を決して 超えないように注意しましょう。もちろん、同時に演奏されるデータの数だけ 合計した数が必要です。 アップデート数は、オーディオに関するあらゆる操作で消費されます。 足りなくなると演奏が正常に行われなくなるので、十分に余裕を持って 確保するようにしてください。 ACMD(コマンドリスト)は、グラフィックスでいうディスプレイリストにあたる ものです。その長さが足りなくなると構造上メモリを破壊してしまいます。 十分に余裕を持って確保するようにしてください。 DMAバッファ数やDMA回数はDMAバッファのサイズによりその値が変化します。 メモリ効率を最優先するならばDMAバッファのサイズをギリギリまで小さく するとよいのですが、その場合DMAの回数が増大します。DMAの回数が増大すると オーバヘッドの関係でDMAが間に合わなくなったり、グラフィックスなど別の 用途のDMAにも多大な影響を与えます。目安としては、DMAバッファ数が最大消費 チャンネル数よりも若干多い程度になるようにバッファサイズを調整した方が 良いでしょう。 DMA回数はデータの演奏開始時に最も消費される傾向があります。そのため、 サウンドエフェクトなど短いデータの場合平均値が高めになります。 DMAの最大回数ももちろん重要ですが、グラフィックスなどへの影響を考える 場合は平均値が重要になります。もちろん、演奏開始時とグラフィックスなどの 巨大なDMA転送が重ならないようにするということは良いことです。 前述の通りバッファのサイズを変更するとこれらの値も変化します。 [使い方] MUSライブラリ用はchk_stl以下、SGIオーディオライブラリ用はchk_sgi以下です。 サブディレクトリについては以下の通りです。 checkseq シーケンス用 checksfx サウンドエフェクト用 data サンプルデータ include 専用ライブラリのインクルードファイル lib 専用ライブラリの実体 デフォルトではデータをdataディレクトリに置いていますが、任意のディレクトリで 構いません。また、専用ライブラリは公開しているライブラリのソースに若干手を 加えたものです。 各サブディレクトリについては、以下の通りです。 Makefile makeするために利用します。 params.h パラメータの設定をします。再生周波数だけは必ず設定してください。 データの指定も行います。 params.c パラメータを代入するCソースです。 普通は編集する必要はありません。 spec スペックファイルです。 普通は編集する必要はありません。 check????.bin プログラム本体です。そのまま利用してください。 基本的には、params.hを編集後、makeを実行するとcheck????.n64が作成されますので、 それを実行してください。check???1.n64がツール1、check???2.n64がツール2です。 ツール1はすぐに計測を開始します。ツール2はDMAバッファのサイズを指定後に計測を 開始します。DMAバッファのサイズは16byteの倍数にする必要があります。 計測中は右上に残り時間が表示されています。この残り時間は計測に要する時間ではなく、 普通に演奏させた場合の残り時間です。データの種類により計測に要する時間は異なります。 基本的にデータ数は与えたデータから自動的に取得されます。 MUSライブラリ用のシーケンスのツールのみデータ数を10までに限定しています。 params.c、params.h、specを編集すればより多くのデータに対応させることもできます。 params.h 内の各種パラメータの説明は以下の通りです。 ONCE_CHECK_SEC 一つのデータをチェックする時間です。この時間が経過するまでに 演奏が停止する場合は、その時点で再スタートします。 少なくとも2、3回演奏する、またはループするだけの時間を 指定します。ここで指定する時間は実際に演奏させた場合の時間で あり、計測に要する時間はもっと短くなります。 OUTPUT_RATE 再生周波数を指定します。 MAX_DATA_SIZE (SGIオーディオライブラリのシーケンスのみ) データの1シーケンスの計測可能最大サイズを指定します。 恐らく変更する必要はないでしょう。 MAX_CHANNELS (SGIオーディオライブラリのサウンドエフェクト以外) チャンネル数の計測可能最大値を指定します。 恐らく変更する必要はないでしょう。 MAX_SOUNDS (SGIオーディオライブラリのサウンドエフェクトのみ) サウンド数の計測可能最大値を指定します。 MAX_UPDATES アップデート数の計測可能最大値を指定します。 恐らく変更する必要はないでしょう。 MAX_EVENTS (SGIオーディオライブラリのみ) イベント数数の計測可能最大値を指定します。 恐らく変更する必要はないでしょう。 MAX_ACMD_LENGTH ACMD(コマンドリスト)の計測可能最大値を指定します。 恐らく変更する必要はないでしょう。 AUDIO_HEAP_SIZE オーディオヒープのサイズを指定します。 恐らく変更する必要はないでしょう。 MAX_BUFFER_SIZE DMAバッファサイズの計測(指定)可能最大値を指定します。 恐らく変更する必要はないでしょう。 MAX_BUFFER_NUM DMAバッファ数の計測可能最大値を指定します。 恐らく変更する必要はないでしょう。 SBK_DATA CTL_DATA TBL_DATA BIN_DATA BFX_DATA PTR_DATA WBK_DATA 各種データを指定します。先頭3文字が拡張子を表しています。 パスやスペースを含む場合は「"」で囲みます。 [注意] このツールは、各種パラメータが具体的にどれだけ利用されているかを知るためのものです。 実際にゲーム中で確保するパラメータを決定する場合には、状況に応じて十分に余裕みる 必要があります。 高速に計測するため、パラメータを取得するための最低限の処理しかしていません。 そのため、計測中も無音です。