# DSPコンポーネントの利用方法 (overview)

このページでは DSP ライブラリで提供している各種コンポーネントの利用方法について説明します。

## 概要

TwlSDK では、DSP を用いて画像や音声データのデコード、エンコードといった処理を行うことができる DSP ライブラリを用意しています。

DSP ライブラリとして提供している機能は以下の通りです。

- G.711 エンコード/デコード
- グラフィックス
- コンポーネント共通機能（サウンド再生、マイクサンプリングなど）

## コンポーネント

DSP ライブラリの各機能は、ライブラリをリンクすればすぐに使えるわけではありません。
各機能は「コンポーネント」として分けられており、使いたいコンポーネントをアプリケーション側で DSP にロードしなければなりません。
各コンポーネントのロード関数(`DSP_Load*()`)を実行した時点で、DSP は動作状態になります。なお、何らかのコンポーネントがロードされた状態でスリープに入ることは禁止されています。

DSP は WRAM-B,C をそれぞれコード領域、データ領域として使用します（詳しくはワークRAMの概要を参照）。使用するサイズ（スロット数）は各コンポーネントによって異なります。
各コンポーネントのサイズを表すマクロを定義しており、それぞれのロード関数（`DSP_Load*()`）の説明に書いています。

## コンポーネントのロード

各コンポーネントは、`$TwlSDK/dspcomponents/`（コンポーネント名） 以下に入っている *.a ファイルです。
このコンポーネントファイルを展開する必要があるのですが、DSP ライブラリでは各コンポーネントファイルを静的メモリに配置してオープンする
`DSP_OpenStaticComponent*()` を用意しています（ただし、プログラムの常駐サイズは増加します）。

サイズを小さくしたい場合、圧縮したコンポーネントファイルをメモリに配置しておき、随時伸張して `FS_CreateFileFromMemory()` を使用してオープンする方法をとることができます。
（`DSP_OpenStaticComponent*()` の内部でも `FS_CreateFileFromMemory()`を使用しています）

コンポーネントのロードは、`DSP_Load*()` の引数に先ほどオープンしたコンポーネントファイルである `FSFile` 構造体を渡すことで行います。
また、WRAM-B, WRAM-C の中で DSP に使わせてもよいスロットを指定する必要があります。
このとき、ロードに必要な WRAM-B および WRAM-C の空きスロット数が不足している場合は失敗します。

DSP のロード関数は、必要に応じて WRAM のスロットを ARM9、DSP の両方に切り替えます。
`MI_ReserveWram*()` で予約されたスロットは切り替えが禁止されているため、このようなスロットを指定すると失敗してしまいます。
従って、DSP のために WRAM をあらかじめ予約する必要はありません。

ロードに必要な空き領域があるなら、それらのスロットの中から必要な領域だけを DSP が確保します。

なお、複数のコンポーネントを同時にロードして使用することはできません。

### 例

> `// G.711 コンポーネントを使った例
> FSFile *file;
> // G.711 コンポーネントファイルをオープン
> DSP_OpenStaticComponentG711(file);
> // ロード
> DSP_LoadG711(file, 0xff, 0xff);
> `

上の例の場合、DSP用に確保される WRAM-B, WRAM-C は各 WRAM の全スロットの中から必要な分だけ選択されます。

## コンポーネントのアンロード

WRAM を空けたいためにロードしたコンポーネントを削除したいとき、またはアプリケーションのスリープ時、終了時には、`DSP_Unload*()`を用いてコンポーネントをアンロードする必要があります。

アンロードによって、DSP のために確保されていた WRAM-B, WRAM-C のスロットが解放されます。

### 例

> `// G.711 コンポーネントのアンロード
> DSP_UnloadG711();
> `

## 参照

DSP 機能一覧

## 履歴

2008/11/04 コンポーネントロード時のスリープ禁止について追記
2008/10/21 コンポーネントのアンロードが必要となる場面を追加
2008/09/03 初版