# DSP_PlayShutterSound

## 構文

    BOOL DSP_PlayShutterSound(const void *src, u32 len);

## 引数

src | WAVE 形式のシャッター音データ $TwlSDK/data/shutter_sound 以下と $TwlSDK/data/videorec_sound 以下にある 32730Hz,47610Hz のデータのみ指定可能で、サンプリングレートは `SNDEX_GetI2SFrequency()` で得られるI2S動作周波数と一致している必要があります。 指定するバッファには16ビットDMA転送と同様の制限があります。詳細は後述の「注意」をご参照ください。
len | WAVE データのバイトサイズ

## 返り値

I2S動作周波数と一致しないシャッター音が指定された場合、不正なデータを指定した場合にFALSEを返します。

## 説明

シャッター音を DSP から再生させます。
この関数で指定された音声はあらゆるサウンド出力に優先して再生され、内部で以下のように排他制御されます。

- 再生前に `SNDEX_GetI2SFrequency()` を呼び出し、I2S動作周波数と シャッター音のサンプリングレートが一致しているか確認した後に、スピーカーから強制的にDSPサウンドのみが再生されるように設定し、 再生完了後に元の設定に戻します。
- 再生中に `DSP_PlaySound()` が呼び出されても無視します。
- 再生処理中は SNDEX 関数を実行しても SNDEX_RESULT_EXCLUSIVE を返して何も行わずに終了します（一部例外があります）。

この関数は、いずれかの DSP コンポーネントをロードしていれば、使用することができます。

本関数は SNDEX ライブラリを用いた前処理を行っています。
従って、プログラムの組み方によっては SNDEX ライブラリの持つ排他制御のためにこの前処理が失敗する可能性があります。
前処理が失敗した場合は、関数内部で成功するまでリトライし続けます。
リトライ処理のなかで `OS_Sleep()` を呼び出しています。
内部でリトライ処理を行わずシャッター音を確実に鳴らすためには、以下の方法で前処理が失敗する可能性を消しておく必要があります。

- 他の SNDEX 関数の処理と重ならないように、`OS_LockMutex()` を用いるなどして本関数を排他的に実行させる。

## 注意

- 指定するバッファはいずれも16ビットDMA転送と同等の条件を満たしている必要があります。
  - アドレスは16bitの整数倍である必要があります。
  - バッファの内容は、事前にキャッシュストアしておく必要があります。
- `SNDEX_SetIirFilter[Async]` によって設定された IIR フィルタは、シャッター音再生中の期間無効化されます。
- 本関数で再生したシャッター音の再生完了を知るためには、`DSP_IsShutterSoundPlaying()`を使用してください。

## 参照

`DSP_IsShutterSoundPlaying DSP_LoadG711`

## 履歴

2009/09/02 他のコンポーネント機能と併用できない旨の注意事項を削除
2009/07/16 他のコンポーネント機能との併用についての説明追加
2009/01/07 シャッター音の再生が成功するまで関数内部でリトライするように変更
2008/11/26 ステレオ、モノラル指定の削除
2008/11/14 指定できるシャッター音の種類について追記
2008/11/07 シャッター音再生処理中は SNDEX 関数を使用できないこと、シャッター音を確実に再生するための情報を追記
2008/10/23 シャッター音再生完了待ちに使用する関数について追記
2008/09/26 シャッター音再生中に IIR フィルタが無効化される旨を追記
2008/09/25 サウンド出力が排他制御される旨を追記
2008/07/09 引数として受け取るサイズをハーフワードからバイト単位に変更
2008/06/24 初版