1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SoundSystem.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31341 $
16  *---------------------------------------------------------------------------*/
17 
18 /**
19  * :include nw/snd/snd_SoundSystem.h
20  *
21  * @file snd_SoundSystem.h
22  */
23 
24 #ifndef NW_SND_SOUND_SYSTEM_H_
25 #define NW_SND_SOUND_SYSTEM_H_
26 
27 #include <nn/os.h>
28 #include <nn/snd.h>
29 #include <nw/snd/snd_Config.h>
30 #include <nw/snd/snd_Global.h>
31 #include <nw/snd/snd_HardwareManager.h>
32 #include <nw/snd/snd_VoiceManager.h>
33 #include <nw/snd/snd_SoundThread.h>
34 #include <nw/snd/snd_MmlParser.h>
35 #include <nw/snd/snd_TaskThread.h>
36 #include <nw/snd/snd_ThreadStack.h>
37 
38 namespace nw {
39 namespace snd {
40 
41 //---------------------------------------------------------------------------
42 //! @brief  サウンドシステム全体に関わる設定を行います。
43 //!
44 //!         @n
45 //!
46 //!         【エフェクト処理の概要】
47 //!
48 //!         エフェクトは @ref AppendEffect 関数および @ref ClearEffect 関数で、
49 //!         登録と解除ができます。
50 //!
51 //!         エフェクトには大きく分けて NW4C が提供するエフェクト
52 //!         (@ref nw::snd::FxBase, @ref nw::snd::FxDelay, @ref nw::snd::FxReverb)
53 //!         と、CTR_SDK が提供するエフェクト (nn::snd::FxDelay, nn::snd::FxReverb)
54 //!         があります。いずれも @ref AppendEffect 関数で登録することができます。
55 //!
56 //!         NW4C が提供するエフェクトは、必ずアプリケーションコアで実行されます。
57 //!         アプリケーションコアに負荷がかかるデメリットがある一方、
58 //!         1 つの AUX バスに複数のエフェクトを設定したり、
59 //!         ユーザーが @ref FxBase を継承して実装したエフェクトを実行させることができます。
60 //!
61 //!         SDK が提供するエフェクトは、サウンドスレッドがシステムコアで動作している場合は、
62 //!         システムコアで実行されます。
63 //!         エフェクトの処理負荷をシステムコアに逃がせる一方、
64 //!         1 つの AUX バスにつき、nn::snd::FxDelay か nn::snd::FxReverb
65 //!         のどちらかしか設定できません。
66 //!         さらに、nn::snd::FxReverb はシステムコアの処理量を抑えるため、
67 //!         前方 2ch のリバーブ処理しかできないようになっています
68 //!         (詳しくは CTR_SDK の nn::snd::FxReverb
69 //!         クラスのリファレンスマニュアルをご覧ください)。
70 //!         NW4C が提供するエフェクトと異なり、
71 //!         ユーザーが自分で実装したエフェクトを実行させることもできません。
72 //!         また、サウンドスレッドがアプリケーションコアで動作している場合は、
73 //!         SDK が提供するエフェクトもアプリケーションコアで動作します。
74 //!
75 //!         NW4C が提供するエフェクトと SDK が提供するエフェクトは、
76 //!         各 AUX バスに、それぞれ独立して登録することができます。
77 //!         たとえば、AUX_BUS_A に「NW4C の FxDelay」および
78 //!         「ユーザーが実装した NW4C エフェクト」、
79 //!         さらに「SDK の FxReverb」を、AUX_BUS_B に「NW4C の FxReverb」と
80 //!         「SDK の FxDelay」を登録する、といったことが可能です。
81 //!
82 //!         また、エフェクト処理は「NW4C 提供のエフェクト」→「SDK 提供のエフェクト」
83 //!         の順に実行されます。
84 //!
85 //!
86 //! @date 2010/20/21 【エフェクト処理の概要】を追記
87 //! @date 2010/01/15 初版
88 //---------------------------------------------------------------------------
89 class SoundSystem
90 {
91 public:
92 
93     //---------------------------------------------------------------------------
94     //! @brief  サウンドシステムの初期化に使用する構造体です。
95     //!
96     //!         soundThreadCoreNo を 1 にすると、サウンドスレッドをシステムコア
97     //!         (コア 1) で処理させることができます。
98     //!
99     //!         autoCreateSoundThread を false にすると、
100     //!         ユーザーは自前でサウンドスレッド用のスレッドをつくる必要があります。
101     //!         ユーザーにはシステムコアで動作するスレッドを作ることは許可されていないため、
102     //!         この場合はアプリケーションコア (コア 0)
103     //!         でサウンドスレッドを動作させることになります。
104     //!
105     //! @see SoundSystem クラス
106     //!
107     //! @date 2010/12/02 autoCreateSoundThread の説明で、soundThreadCoreNo が無視される旨追記
108     //! @date 2010/09/24 soundThreadCoreNo, enableGetSoundThreadTick メンバの追加
109     //! @date 2010/01/29 メンバ変数の型 (u32 → size_t)、および、
110     //!                  名前 (romThread*** → taskThread***) を変更
111     //! @date 2010/01/15 初版
112     //---------------------------------------------------------------------------
113     struct SoundSystemParam
114     {
115         //---------------------------------------------------------------------------
116         //! @brief    サウンドスレッドのプライオリティです。初期値は 4 です。
117         //---------------------------------------------------------------------------
118         s32 soundThreadPriority;
119 
120         //---------------------------------------------------------------------------
121         //! @brief  サウンドスレッドのコア番号です。初期値は 0 です。
122         //          0 はアプリケーションコア、1 はシステムコアを意味します。
123         //---------------------------------------------------------------------------
124         s32 soundThreadCoreNo;
125 
126         //---------------------------------------------------------------------------
127         //! @brief    サウンドスレッドのスタックサイズです。8 の倍数で指定してください。
128         //!           初期値は 16KB です。
129         //---------------------------------------------------------------------------
130         size_t soundThreadStackSize;
131 
132         //---------------------------------------------------------------------------
133         //! :private
134         //!
135         //! @brief    サウンドスレッドのコマンドバッファサイズです。4 の倍数で指定してください。
136         //!           初期値は 128KB です。
137         //---------------------------------------------------------------------------
138         size_t soundThreadCommandBufferSize;
139 
140         //---------------------------------------------------------------------------
141         //! @brief    サウンドデータロードスレッドのプライオリティです。初期値は 3 です。
142         //---------------------------------------------------------------------------
143         s32 taskThreadPriority;
144 
145         //---------------------------------------------------------------------------
146         //! @brief    サウンドデータロードスレッドのスタックサイズです。
147         //!           8 の倍数で指定してください。初期値は 16KB です。
148         //---------------------------------------------------------------------------
149         size_t taskThreadStackSize;
150 
151         //---------------------------------------------------------------------------
152         //! :private
153         //!
154         //! @brief    サウンドデータロードスレッドのコマンドバッファサイズです。
155         //!           4 の倍数で指定してください。初期値は 8KB です。
156         //---------------------------------------------------------------------------
157         size_t taskThreadCommandBufferSize;
158 
159         //---------------------------------------------------------------------------
160         //! @brief    @ref Initialize でサウンドスレッドを自動生成するかどうかを示すフラグです。
161         //!           初期値は true です。
162         //!           false の場合は、soundThreadStackSize および soundThreadPriority、
163         //!           soundThreadCoreNo は無視されます。
164         //---------------------------------------------------------------------------
165         bool autoCreateSoundThread;
166 
167         //---------------------------------------------------------------------------
168         //! @brief    サウンドスレッド処理負荷計測するかどうかを示すフラグです。
169         //!           初期値は true です。
170         //!           false の場合は、@ref GetSoundThreadTickCount は正常に動作しません。
171         //---------------------------------------------------------------------------
172         bool enableGetSoundThreadTick;
173 
174         //! サウンドスレッドプライオリティのデフォルト値です。
175         static const s32 DEFAULT_SOUND_THREAD_PRIORITY = 4;
176 
177         //! サウンドデータロードスレッドプライオリティのデフォルト値です。
178         static const s32 DEFAULT_TASK_THREAD_PRIORITY = 3;
179 
180         //! サウンドスレッドスタックサイズのデフォルト値です。
181         static const u32 DEFAULT_SOUND_THREAD_STACK_SIZE = 16 * 1024;
182 
183         //! サウンドデータロードスレッドスタックサイズのデフォルト値です。
184         static const u32 DEFAULT_TASK_THREAD_STACK_SIZE = 16 * 1024;
185 
186         //---------------------------------------------------------------------------
187         //! :private
188         //!
189         //! @brief    サウンドスレッドのコマンドバッファサイズのデフォルト値です。
190         //---------------------------------------------------------------------------
191         static const u32 DEFAULT_SOUND_THREAD_COMMAND_BUFFER_SIZE = 128 * 1024;
192 
193         //---------------------------------------------------------------------------
194         //! :private
195         //!
196         //! @brief    サウンドデータロードスレッドのコマンドバッファサイズのデフォルト値です。
197         //---------------------------------------------------------------------------
198         static const u32 DEFAULT_TASK_THREAD_COMMAND_BUFFER_SIZE = 8 * 1024;
199 
200 
201         //---------------------------------------------------------------------------
202         //! @brief    コンストラクタです。
203         //!
204         //! @date 2010/01/15 初版
205         //---------------------------------------------------------------------------
SoundSystemParamSoundSystemParam206         SoundSystemParam()
207         : soundThreadPriority( DEFAULT_SOUND_THREAD_PRIORITY ),
208           soundThreadCoreNo(0),
209           soundThreadStackSize( DEFAULT_SOUND_THREAD_STACK_SIZE ),
210           soundThreadCommandBufferSize( DEFAULT_SOUND_THREAD_COMMAND_BUFFER_SIZE ),
211           taskThreadPriority( DEFAULT_TASK_THREAD_PRIORITY ),
212           taskThreadStackSize( DEFAULT_TASK_THREAD_STACK_SIZE ),
213           taskThreadCommandBufferSize( DEFAULT_TASK_THREAD_COMMAND_BUFFER_SIZE ),
214           autoCreateSoundThread( true ),
215           enableGetSoundThreadTick( true )
216         {}
217     };
218 
219     //----------------------------------------
220     //! @name システム
221     //@{
222     //---------------------------------------------------------------------------
223     //! @brief  サウンドライブラリの初期化を行います。
224     //!
225     //!         サウンドシステムが使用するワークメモリをユーザが渡します。
226     //!         @ref SoundSystemParam 構造体に、初期化に必要なパラメータを設定し、
227     //!         @ref nw::snd::SoundSystem::GetRequiredMemSize で、
228     //!         必要なメモリサイズを取得してください。
229     //!
230     //!         @ref SoundSystemParam 構造体で指定した優先度・スタックサイズで、
231     //!         サウンド処理を行うスレッドと、
232     //!         ROM からサウンドデータをロードするためのスレッドの初期化、実行します。
233     //!
234     //!         nw::snd ライブラリ内部でサウンドスレッドを起動せずに初期化を行いたい場合は
235     //!         @ref SoundSystemParam 構造体の autoCreateSoundThread を
236     //!         false にして呼び出してください。
237     //!         詳しくは demos/snd/createSoundThreadManually デモをご覧ください。
238     //!
239     //!         また、 nw::snd ライブラリ内部でサウンドスレッドを起動しない場合は、
240     //!         @ref GetSoundThreadTickCount は正しく動作しません。
241     //!
242     //!         nw::snd ライブラリ内部で起動するサウンドスレッドをシステムコア (コア 1)
243     //!         で動作させるには、@ref SoundSystemParam 構造体の soundThreadCoreNo を
244     //!         1 に設定します。詳しくは、サウンドプログラマーズガイドの
245     //!         「8 システムコアでの動作」の章をご覧ください。
246     //!
247     //! @param[in]    param           初期化パラメータです。
248     //! @param[in]    workMem         サウンドシステムのワークメモリへのポインタです。
249     //! @param[in]    workMemSize     ワークメモリのサイズです。
250     //!
251     //! @see Finalize
252     //! @see GetRequiredMemSize
253     //! @see SoundSystemParam
254     //! @see IsInitialized
255     //!
256     //! @date 2010/09/27 システムコア動作について追記
257     //! @date 2010/06/14 サウンドスレッドを起動せずに初期化する方法を追記
258     //! @date 2010/03/30 workMem のアラインメント制限に関する記述を削除
259     //! @date 2010/01/29 関数名を変更 (InitSoundSystem → Initialize)、
260     //!                  スレッドプライオリティのみを指定する関数を削除、文言の調整
261     //! @date 2010/01/15 初版
262     //---------------------------------------------------------------------------
263     static void Initialize(
264         const SoundSystemParam& param,
265         uptr workMem,
266         size_t workMemSize
267     );
268 
269     //---------------------------------------------------------------------------
270     //! @brief        サウンドライブラリの初期化に必要なメモリサイズを取得します。
271     //!
272     //!               param に設定されている初期化パラメータに基づいて、
273     //!               サウンドシステムのセットアップに必要なメモリサイズを計算します。
274     //!
275     //!               この関数で取得したサイズのメモリ領域を
276     //!               @ref nw::snd::SoundSystem::Initialize に渡してください。
277     //!
278     //! @param[in]    param   初期化パラメータです。
279     //!
280     //! @return       サウンドシステムの初期化に必要なメモリサイズを返します。
281     //!
282     //! @see  Initialize
283     //! @see  SoundSystemParam
284     //!
285     //! @date 2010/06/14 文言の調整
286     //! @date 2010/01/29 返り値の型変更 (u32 → size_t)
287     //! @date 2010/01/15 初版
288     //---------------------------------------------------------------------------
289     static size_t GetRequiredMemSize( const SoundSystemParam& param );
290 
291 
292     //! @details :private
293     static size_t detail_GetRequiredDriverCommandManagerMemSize( const SoundSystemParam& param );
294 
295     //! @details :private
296     static void detail_InitializeDriverCommandManager(
297         const SoundSystemParam& param,
298         uptr workMem,
299         size_t workMemSize );
300 
301     //---------------------------------------------------------------------------
302     //! @brief  サウンドシステムの終了処理を行います。
303     //!
304     //!         @ref SoundSystem::Initialize で作成された、
305     //!         サウンド処理を行うスレッドと
306     //!         ROM からサウンドデータをロードするためのスレッドを終了させます。
307     //!
308     //!         終了処理を正常に実行するには、あらかじめ @ref SoundArchivePlayer
309     //!         インスタンスなどの nw::snd ライブラリのすべてのインスタンスについて、
310     //!         終了処理を呼び出しておく必要があります。
311     //!         詳しくは、demos/snd/withSdk デモをご覧ください。
312     //!
313     //! @see Initialize
314     //!
315     //! @date 2010/02/22 終了処理について、demos/snd/withSdk デモへの誘導文を追加
316     //! @date 2010/01/29 関数名を変更 (ShutdownSoundSystem → Finalize)
317     //! @date 2010/01/15 初版
318     //---------------------------------------------------------------------------
319     static void Finalize();
320 
321     //---------------------------------------------------------------------------
322     //! @brief        サウンドフレーム処理から呼び出されるコールバック関数を設定します。
323     //!
324     //!               たとえば、本関数で設定したユーザーコールバックから、
325     //!               nn::snd::GetMixedBusData 関数を呼び出すことで、
326     //!               ミックス済みのデータ (DSP が生成する最終段の波形データ)
327     //!               を得ることができます。
328     //!
329     //!               また、ユーザーが独自に取得した nn::snd::Voice に対して、
330     //!               パラメータ設定 (ボリューム設定など) タイミングを合わせるには、
331     //!               本関数内で設定関数を呼び出すことで実現することができます。
332     //!               demos/snd/withSdk サンプルデモもあわせてご覧ください。
333     //!
334     //!               @ref Initialize で、サウンドスレッドを起動しなかった場合は、
335     //!               本関数を呼び出しても機能しません。
336     //!
337     //! @param[in] callback   サウンドフレーム処理から呼び出されるコールバック関数です。
338     //! @param[in] arg        コールバック関数に渡されるユーザー引数です。
339     //!
340     //! @see Initialize
341     //! @see SoundFrameUserCallback
342     //! @see ClearSoundFrameUserCallback
343     //!
344     //! @date 2010/10/27 誤植修正 (dmoes→demos)
345     //! @date 2010/06/14 初版
346     //---------------------------------------------------------------------------
SetSoundFrameUserCallback(SoundFrameUserCallback callback,uptr arg)347     static void SetSoundFrameUserCallback( SoundFrameUserCallback callback, uptr arg )
348     {
349         internal::driver::SoundThread::GetInstance().RegisterSoundFrameUserCallback(
350                 callback, arg );
351     }
352 
353     //---------------------------------------------------------------------------
354     //! @brief        サウンドフレーム処理から呼び出されるコールバック関数を削除します。
355     //!
356     //! @see SetSoundFrameUserCallback
357     //!
358     //! @date 2010/06/14 初版
359     //---------------------------------------------------------------------------
ClearSoundFrameUserCallback()360     static void ClearSoundFrameUserCallback()
361     {
362         internal::driver::SoundThread::GetInstance().ClearSoundFrameUserCallback();
363     }
364 
365     //---------------------------------------------------------------------------
366     //! @brief        サウンドフレーム処理を行います。
367     //!
368     //!               @ref Initialize で、サウンドスレッドを起動しなかった場合、
369     //!               ユーザーアプリ内で呼び出す必要があります。
370     //!
371     //!               典型的には、ユーザーアプリ内で呼び出される
372     //!               nn::snd::WaitForDspSync と nn::snd::SendParameterToDsp の間に
373     //!               1 回呼び出します。
374     //!
375     //!               詳しくは demos/snd/createSoundThreadManually デモをご覧ください。
376     //!
377     //! @see  Initialize
378     //!
379     //! @date 2010/06/14 初版
380     //---------------------------------------------------------------------------
SoundFrameProcess()381     static void SoundFrameProcess()
382     {
383         internal::driver::SoundThread::GetInstance().FrameProcessForExternalThread();
384     }
385 
386     //---------------------------------------------------------------------------
387     //! @brief        サウンドシステムが初期化されているかどうかを取得します。
388     //!
389     //!               @ref Initialize が呼び出され、
390     //!               サウンドシステムの初期化が完了しているかどうかを調べます。
391     //!
392     //! @return       サウンドシステムの初期化が完了していれば true を、
393     //!               そうでなければ false を返します。
394     //!
395     //! @see  Initialize
396     //! @see  Finalize
397     //!
398     //! @date 2010/01/29 関数名変更 (IsInitializedSoundSystem → IsInitialized)
399     //! @date 2010/01/15 初版
400     //---------------------------------------------------------------------------
401     static bool IsInitialized();
402 
403 
404     //---------------------------------------------------------------------------
405     //! @brief      サウンドスレッドをロックします。
406     //!
407     //!             CTR_SDK の nn::snd::AllocVoice, nn::snd::FreeVoice,
408     //!             nn::snd::Voice の各関数を呼び出す場合は、
409     //!             必ず本関数でサウンドスレッドをロックするようにしてください。
410     //!
411     //!             ただし、サウンドスレッドをアプリケーションコアで動作させている状況で、
412     //!             @ref RegisterSoundFrameUserCallback 関数で登録したコールバック内で
413     //!             上記関数を呼び出す場合は、ロックは不要です。
414     //!
415     //!             コールバック以外から上記関数を呼び出す場合、あるいは、
416     //!             サウンドスレッドをシステムコアで動作させている場合は、
417     //!             本関数によるロックが必要です。
418     //!
419     //!             上記関数の使用後、@ref UnlockSoundThread
420     //!             でロックを解除するようにしてください。
421     //!
422     //!             長時間ロックし続けると、nw::snd のサウンド処理が滞り、
423     //!             音が途切れるなどの悪影響があります。
424     //!
425     //!             demos/snd/withSdk サンプルデモもあわせてご覧ください。
426     //!
427     //! @see  UnlockSoundThread
428     //!
429     //! @date 2010/10/27 初版
430     //---------------------------------------------------------------------------
LockSoundThread()431     static void LockSoundThread()
432     {
433     #ifdef NW_SND_CONFIG_USE_NN_SND_LOCKSOUNDTHREAD
434         if ( s_AutoCreateSoundThreadFlag ) {
435             nn::snd::LockSoundThread();
436         }
437         else {
438             internal::driver::SoundThread::GetInstance().Lock();
439         }
440     #else
441         internal::driver::SoundThread::GetInstance().Lock();
442     #endif
443     }
444 
445     //---------------------------------------------------------------------------
446     //! @brief      サウンドスレッドをアンロックします。
447     //!
448     //!             @ref LockSoundThread 関数の説明もあわせてご覧ください。
449     //!
450     //! @see  LockSoundThread
451     //!
452     //! @date 2010/10/27 初版
453     //---------------------------------------------------------------------------
UnlockSoundThread()454     static void UnlockSoundThread()
455     {
456     #ifdef NW_SND_CONFIG_USE_NN_SND_LOCKSOUNDTHREAD
457         if ( s_AutoCreateSoundThreadFlag ) {
458             nn::snd::UnlockSoundThread();
459         }
460         else {
461             internal::driver::SoundThread::GetInstance().Unlock();
462         }
463     #else
464         internal::driver::SoundThread::GetInstance().Unlock();
465     #endif
466     }
467 
468     //---------------------------------------------------------------------------
469     //! @brief      オブジェクトの生成時からオブジェクトの存在するスコープを抜けるまでの間、
470     //!             サウンドスレッドをロックします。
471     //!
472     //!             使用に関する注意点は、@ref LockSoundThread 関数と同じです。
473     //!
474     //! @see LockSoundThread
475     //! @see UnlockSoundThread
476     //!
477     //! @date 2010/10/27 初版
478     //---------------------------------------------------------------------------
479     class SoundThreadScopedLock
480     {
481     public:
482         //---------------------------------------------------------------------------
483         //! @brief  コンストラクタです。
484         //!
485         //!         内部で @ref LockSoundThread 関数を呼び出します。
486         //!
487         //! @see  LockSoundThread
488         //!
489         //! @date 2010/11/02 初版
490         //---------------------------------------------------------------------------
SoundThreadScopedLock()491         SoundThreadScopedLock()
492         {
493             LockSoundThread();
494         }
495         //---------------------------------------------------------------------------
496         //! @brief  デストラクタです。
497         //!
498         //!         内部で @ref UnlockSoundThread 関数を呼び出します。
499         //!
500         //! @see  UnlockSoundThread
501         //!
502         //! @date 2010/11/02 初版
503         //---------------------------------------------------------------------------
~SoundThreadScopedLock()504         ~SoundThreadScopedLock()
505         {
506             UnlockSoundThread();
507         }
508     private:
509         NW_DISALLOW_COPY_AND_ASSIGN( SoundThreadScopedLock );
510     };
511 
512 
513 
514     //---------------------------------------------------------------------------
515     //! @brief  サウンドライブラリのスリープ準備処理を実行します。
516     //!
517     //!         スリープに入る前に、本関数を必ず呼び出してください。
518     //!
519     //!         スリープの準備では、
520     //!         サウンドデータロードスレッドをロックします。
521     //!
522     //!         サウンドデータロードスレッドでロード中のデータがある場合は、
523     //!         ロードが終わるまで本関数内でブロックされます。
524     //!
525     //!         スリープを解除する場合は、@ref LeaveSleep 関数を呼び出してください。
526     //!
527     //! @see  LeaveSleep
528     //!
529     //! @date 2011/01/11 初版
530     //---------------------------------------------------------------------------
EnterSleep()531     static void EnterSleep()
532     {
533         if ( s_IsEnterSleep )
534         {
535             return;
536         }
537 
538         s_IsEnterSleep = true;
539         s_IsStreamLoadWait = true;
540         internal::TaskThread::GetInstance().Lock();
541 
542         // サウンドスレッドは SDK 側で止められる
543     }
544 
545     //---------------------------------------------------------------------------
546     //! @brief  サウンドライブラリのスリープ終了処理を実行します。
547     //!
548     //!         スリープを解除した後に、必ず呼び出してください。
549     //!
550     //! @see  EnterSleep
551     //!
552     //! @date 2011/01/11 初版
553     //---------------------------------------------------------------------------
LeaveSleep()554     static void LeaveSleep()
555     {
556         if ( ! s_IsEnterSleep )
557         {
558             return;
559         }
560 
561         // サウンドスレッドは SDK 側で復帰する
562         internal::TaskThread::GetInstance().Unlock();
563         s_IsStreamLoadWait = false;
564         s_IsEnterSleep = false;
565     }
566 
567     //! @details :private
detail_IsStreamLoadWait()568     static bool detail_IsStreamLoadWait()
569     {
570         return s_IsStreamLoadWait;
571     }
572     //@}
573 
574     //----------------------------------------
575     //! @name 出力モード
576     //@{
577     //---------------------------------------------------------------------------
578     //! @brief  サウンドの出力モードを設定します。
579     //!
580     //!         内部で nn::snd::SetSoundOutputMode を呼び出し、
581     //!         対応する出力モードを設定します。
582     //!
583     //!         以下に、@ref nw::snd::OutputMode と nn::snd::OutputMode の対応関係を示します。
584     //!
585     //!         ・OUTPUT_MODE_MONO → nn::snd::OUTPUT_MODE_MONO @n
586     //!         ・OUTPUT_MODE_STEREO → nn::snd::OUTPUT_MODE_STEREO @n
587     //!         ・OUTPUT_MODE_SURROUND → nn::snd::OUTPUT_MODE_3DSURROUND
588     //!
589     //! @param[in]    mode    サウンドの出力モードです。
590     //!
591     //! @see  nw::snd::OutputMode
592     //! @see  GetOutputMode
593     //!
594     //! @date 2010/07/07 nn::snd::SetSoundOutputMode を呼び出す旨、追記
595     //! @date 2010/01/26 文言の調整
596     //! @date 2010/01/15 初版
597     //---------------------------------------------------------------------------
SetOutputMode(OutputMode mode)598     static void SetOutputMode( OutputMode mode )
599     {
600         internal::driver::HardwareManager::GetInstance().SetOutputMode( mode );
601     }
602 
603     //---------------------------------------------------------------------------
604     //! @brief        現在のサウンド出力モードを取得します。
605     //!
606     //! @return       現在のサウンド出力モードを返します。
607     //!
608     //! @see  nw::snd::OutputMode
609     //! @see  SetOutputMode
610     //!
611     //! @date 2010/01/26 文言の調整
612     //! @date 2010/01/15 初版
613     //---------------------------------------------------------------------------
GetOutputMode()614     static OutputMode GetOutputMode()
615     {
616         return internal::driver::HardwareManager::GetInstance().GetOutputMode();
617     }
618     //@}
619 
620     //----------------------------------------
621     //! @name マスターボリューム
622     //@{
623     //---------------------------------------------------------------------------
624     //! @brief        マスターボリュームを設定します。
625     //!
626     //!               マスターボリュームは、
627     //!               サウンドライブラリで発音される音全てに対して影響を与えます。
628     //!               サウンドライブラリ以外で発音された音には影響を与えません。
629     //!
630     //!               この関数で指定する値は、他のどの音量パラメータとも独立して動作し、
631     //!               それらは全て重ね合わされます。
632     //!
633     //!               音量 volume は、0.0 以上の倍率で指定します。
634     //!               すなわち、1.0 を指定すると音量に影響を与えません。
635     //!               0.0 を指定すると発音されなくなります。
636     //!               デフォルト値は 1.0 です。
637     //!
638     //!               他の音量パラメータと重ね合わされたあと、最終的な音量は
639     //!               0.0 ~ 2.0 の範囲でクランプされます。
640     //!               この関数で 2.0 を設定したとしても、元サウンドの音量は 2
641     //!               倍にならない可能性があることに注意してください。
642     //!
643     //!               音量の変化は fadeTimes で指定した時間をかけて行われます。
644     //!               音量の変化途中にさらにこの関数を呼び出した場合は、
645     //!               その時点での変化途中の音量値を基点として、
646     //!               新しく指定した時間をかけて音量を変化させます。
647     //!
648     //! @param[in] volume     音量の倍率 ( 0.0 ~ ) です。
649     //! @param[in] fadeTimes  音量変化にかける時間 (ミリ秒) です。
650     //!
651     //! @see  GetMasterVolume
652     //!
653     //! @date 2010/01/26 文言の調整
654     //! @date 2010/01/25 引数の説明追加。
655     //! @date 2010/01/15 初版
656     //---------------------------------------------------------------------------
SetMasterVolume(float volume,int fadeTimes)657     static void SetMasterVolume( float volume, int fadeTimes )
658     {
659         internal::driver::HardwareManager::GetInstance().SetMasterVolume( volume, fadeTimes );
660     }
661     // TODO: ★ 「AUX に送られる前に反映されるので~」を書いていない
662 
663     //---------------------------------------------------------------------------
664     //! @brief        現在のマスターボリュームを取得します。
665     //!
666     //!               現在設定されている @ref SetMasterVolume で設定された
667     //!               マスターボリュームの値を取得します。
668     //!
669     //!               音量が時間変化している間に値を取得した場合は、
670     //!               その時点での変化途中の音量の値を返します。
671     //!
672     //! @return       現在のマスターボリュームの値を返します。
673     //!
674     //! @see          SetMasterVolume
675     //!
676     //! @date 2010/01/26 文言の調整
677     //! @date 2010/01/15 初版
678     //---------------------------------------------------------------------------
GetMasterVolume()679     static float GetMasterVolume()
680     {
681         return internal::driver::HardwareManager::GetInstance().GetMasterVolume();
682     }
683     //@}
684 
685     //----------------------------------------
686     //! @name エフェクト
687     //@{
688 
689     //---------------------------------------------------------------------------
690     //! @brief      指定したエフェクトを AUX バスに追加します。
691     //!
692     //!             エフェクトは、指定したバスそれぞれで独立して処理されます。
693     //!             nw::snd のエフェクト (nn::snd::FxBase を継承したエフェクト) は、
694     //!             1 つのバスに複数のエフェクトを登録することができます。
695     //!             エフェクトは、追加した順番で処理されます。
696     //!
697     //!             途中でエフェクトの接続順を変更したい場合は、
698     //!             @ref nw::snd::SoundSystem::ClearEffect
699     //!             を呼び出して一度すべてのエフェクトの登録を削除した後、
700     //!             改めて追加しなおしてください。
701     //!
702     //!             エフェクトを追加する際、内部で @ref nw::snd::FxBase::Initialize
703     //!             を呼び出しています。
704     //!
705     //!             エフェクト処理の概要については @ref SoundSystem クラスの説明をご覧ください。
706     //!
707     //! @param[in]  bus         エフェクトを追加するバスです。
708     //! @param[in]  effect      エフェクトです。
709     //!
710     //! @return     エフェクトの開始に成功したら true を、失敗したら false を返します。
711     //!
712     //! @see AuxBus
713     //! @see FxBase
714     //! @see ClearEffect
715     //!
716     //! @date 2010/10/22 参照に @ref ClearEffect を追加、微調整
717     //! @date 2010/06/16 初版
718     //---------------------------------------------------------------------------
719     static bool AppendEffect( AuxBus bus, FxBase* effect );
720 
721 #ifdef NW_SND_AVAILABLE_NN_EFFECT
722     //---------------------------------------------------------------------------
723     //! @brief      指定したエフェクトを AUX バスに追加します。
724     //!
725     //!             エフェクトは、指定したバスそれぞれで独立して処理されます。
726     //!             nn::snd のエフェクト (nn::snd::FxDelay および nn::snd::FxReverb) は、
727     //!             各バスにどちらかひとつしか設定することができません。
728     //!
729     //!             nn::snd エフェクトを解除したい場合は、@ref ClearEffect
730     //!             関数を呼び出します。@ref ClearEffect 関数を呼びだすと、
731     //!             内部で nn::snd::ClearEffect 関数が呼び出されます。
732     //!
733     //!             エフェクトを追加する際、内部で nn::snd::SetEffect
734     //!             関数を呼び出しています。
735     //!
736     //!             エフェクト処理の概要については @ref SoundSystem クラスの説明をご覧ください。
737     //!
738     //! @param[in]  bus         エフェクトを追加するバスです。
739     //! @param[in]  fxDelay     ディレイエフェクトです。
740     //!
741     //! @return     エフェクトの開始に成功したら true を、失敗したら false を返します。
742     //!
743     //! @see AuxBus
744     //! @see ClearEffect
745     //!
746     //! @date 2010/10/22 初版
747     //---------------------------------------------------------------------------
748     static bool AppendEffect( AuxBus bus, nn::snd::FxDelay* fxDelay );
749 
750     //---------------------------------------------------------------------------
751     //! @brief      指定したエフェクトを AUX バスに追加します。
752     //!
753     //!             エフェクトは、指定したバスそれぞれで独立して処理されます。
754     //!             nn::snd のエフェクト (nn::snd::FxDelay および nn::snd::FxReverb) は、
755     //!             各バスにどちらかひとつしか設定することができません。
756     //!
757     //!             nn::snd エフェクトを解除したい場合は、@ref ClearEffect
758     //!             関数を呼び出します。@ref ClearEffect 関数を呼びだすと、
759     //!             内部で nn::snd::ClearEffect 関数が呼び出されます。
760     //!
761     //!             エフェクトを追加する際、内部で nn::snd::SetEffect
762     //!             関数を呼び出しています。
763     //!
764     //!             エフェクト処理の概要については @ref SoundSystem クラスの説明をご覧ください。
765     //!
766     //! @param[in]  bus         エフェクトを追加するバスです。
767     //! @param[in]  fxReverb    リバーブエフェクトです。
768     //!
769     //! @return     エフェクトの開始に成功したら true を、失敗したら false を返します。
770     //!
771     //! @see AuxBus
772     //! @see ClearEffect
773     //!
774     //! @date 2010/10/22 初版
775     //---------------------------------------------------------------------------
776     static bool AppendEffect( AuxBus bus, nn::snd::FxReverb* fxReverb );
777 #endif
778 
779     //---------------------------------------------------------------------------
780     //! @brief        指定した AUX バスに登録されているエフェクトを全てバスから削除します。
781     //!
782     //!               エフェクトを終了させる際、 fadeTimes でフェードアウトをかけることができます。
783     //!               フェードアウトが完了するまでエフェクトは終了しません。
784     //!               フェードアウトが完了したかどうかを知るには
785     //!               @ref nw::snd::SoundSystem::IsFinishedClearEffect を呼び出してください。
786     //!
787     //!               エフェクトをバスから削除する際、内部で
788     //!               @ref nw::snd::FxBase::Finalize を呼び出しています。
789     //!
790     //! @param[in]    bus         エフェクトバスです。
791     //! @param[in]    fadeTimes   フェード時間 (ミリ秒) です。
792     //!
793     //! @see IsFinishedClearEffect
794     //! @see AuxBus
795     //! @see FxBase
796     //!
797     //! @date 2010/06/16 初版
798     //---------------------------------------------------------------------------
799     static void ClearEffect( AuxBus bus, int fadeTimes = 0 );
800 
801     //---------------------------------------------------------------------------
802     //! @brief        ClearEffect が完了したかどうかを調べます。
803     //!
804     //!               @ref ClearEffect が呼ばれる前の動作は不定です。
805     //!
806     //! @param[in]    bus エフェクトバスです。
807     //!
808     //! @return       @ref ClearEffect の処理が完了していれば true を、
809     //!               そうでなければ false を返します。
810     //!
811     //! @see ClearEffect
812     //! @see AuxBus
813     //!
814     //! @date 2010/06/16 初版
815     //---------------------------------------------------------------------------
IsFinishedClearEffect(AuxBus bus)816     static bool IsFinishedClearEffect( AuxBus bus )
817     {
818         return internal::driver::HardwareManager::GetInstance().IsFinishedClearEffect( bus );
819     }
820     //@}
821 
822     //----------------------------------------
823     //! @name SRC タイプ
824     //@{
825     //---------------------------------------------------------------------------
826     //! @brief      SRC タイプ (サンプリングレートコンバータの補間方法) を設定します。
827     //!
828     //!             デフォルトでは SRC_TYPE_4TAP が設定されています。
829     //!
830     //!             ウェーブサウンドおよびストリームサウンドに影響がありますが、
831     //!             シーケンスサウンドには影響がありません。
832     //!             シーケンスサウンドは、SoundMaker のインストリストおよび
833     //!             パーカッションリスト上で設定された「補間タイプ」が影響します。
834     //!
835     //! @param[in]    type    SRC タイプです。
836     //!
837     //! @see nw::snd::SrcType
838     //! @see GetSrcType
839     //!
840     //! @date 2010/10/15 シーケンスサウンドには影響のない旨、追記
841     //! @date 2010/08/18 実装されたため、未実装の旨、削除
842     //! @date 2010/07/27 未実装の旨、追記
843     //! @date 2010/01/26 文言の調整、誤記修正 (参照の SetSrcType → GetSrcType)
844     //! @date 2010/01/25 誤記修正 (SRC_4TAP_AUTO → SRC_TYPE_4TAP)
845     //! @date 2010/01/15 初版
846     //---------------------------------------------------------------------------
SetSrcType(SrcType type)847     static void SetSrcType( SrcType type )
848     {
849         internal::driver::HardwareManager::GetInstance().SetSrcType( type );
850     }
851 
852     //---------------------------------------------------------------------------
853     //! @brief        現在設定されている SRC タイプ
854     //!               (サンプリングレートコンバータの補間方法) を取得します。
855     //!
856     //!               デフォルトでは SRC_TYPE_4TAP が設定されています。
857     //!
858     //! @return       現在設定されている SRC タイプの値を返します。
859     //!
860     //! @see nw::snd::SrcType
861     //! @see SetSrcType
862     //!
863     //! @date 2010/01/26 文言の調整
864     //! @date 2010/01/25 誤記修正 (SRC_4TAP_AUTO → SRC_TYPE_4TAP)
865     //! @date 2010/01/15 初版
866     //---------------------------------------------------------------------------
GetSrcType()867     static SrcType GetSrcType()
868     {
869         return internal::driver::HardwareManager::GetInstance().GetSrcType();
870     }
871     //@}
872 
873     //----------------------------------------
874     //! name リセット準備
875     //{
876 
877     //---------------------------------------------------------------------------
878     //! :private
879     //!
880     //! @brief        リセット前に必要なサウンドの処理を行います。
881     //!
882     //!               この関数は、リセット時にノイズが発生しないように再生中の音を緩やかに消します。
883     //!               一度この関数が呼ばれた後は、再び発音することができません。
884     //!
885     //!               ノイズが発生しないようにリセットを行うためには、
886     //!               @ref WaitForResetReady を呼び出して、
887     //!               この関数の処理が完了するのを待つ必要があります。
888     //!
889     //! @see  WaitForResetReady
890     //!
891     //! @date 2010/01/15 初版
892     //---------------------------------------------------------------------------
PrepareReset()893     static void PrepareReset()
894     {
895         internal::driver::HardwareManager::GetInstance().PrepareReset();
896     }
897 
898     //---------------------------------------------------------------------------
899     //! :private
900     //!
901     //! @brief        サウンドのリセット準備処理が完了するのを待ちます。
902     //!
903     //!               この関数は、@ref PrepareReset が呼び出された後に、
904     //!               その処理が完了するのを待ちます。
905     //!
906     //! @see  PrepareReset
907     //!
908     //! @date 2010/01/15 初版
909     //---------------------------------------------------------------------------
910     static void WaitForResetReady();
911     //}
912 
913     //----------------------------------------
914     //! @name パフォーマンス計測
915     //@{
916     //---------------------------------------------------------------------------
917     //! @brief        サウンドスレッド処理にかかった累積時間および処理回数を取得します。
918     //!
919     //!               サウンドスレッドの処理は、定期的 (約 5ms ごと。正確には、
920     //!               @ref SOUND_THREAD_INTERVAL_USEC マイクロ秒ごと) に実行されるため、
921     //!               本関数を 1/60 秒 (約 16.67ms) ごとに呼び出した場合、
922     //!               処理回数は約 3~4 回になります。
923     //!               累積処理時間は、この約 3~4 回分のサウンドスレッド処理にかかった時間になります。
924     //!
925     //!               処理に要した時間は、
926     //!               サウンドスレッドを開始した時間と終了した時間の差分で計算します。
927     //!               したがって、サウンドスレッドの実行中に他のスレッドに切り替わった場合、
928     //!               それらの実行時間を含んだ値を返すことに注意してください。
929     //!
930     //!               処理時間には、NW4C サウンドライブラリ層の処理にかかった時間に加え、
931     //!               nn::snd::WaitForDspSync および nn::snd::SendParameterToDsp
932     //!               にかかった時間も含まれます。
933     //!
934     //!               累積時間及び処理回数は @ref ClearSoundThreadTickCount 関数によって、
935     //!               ゼロにクリアすることができます。
936     //!
937     //! @param[out]   tick    サウンドスレッド内部の累積処理時間です。
938     //! @param[out]   count   サウンドスレッド処理回数です。
939     //!
940     //! @see ClearSoundThreadTickCount
941     //! @see SOUND_THREAD_INTERVAL_USEC
942     //!
943     //! @date 2010/12/10 PC 版に関する記述を削除
944     //! @date 2010/05/08 GetSoundThreadProcessTick 関数を廃止し、本関数を追加
945     //---------------------------------------------------------------------------
GetSoundThreadTickCount(nn::os::Tick & tick,int & count)946     static void GetSoundThreadTickCount( nn::os::Tick& tick, int& count )
947     {
948       #ifdef NW_PLATFORM_CTR
949         internal::driver::SoundThread::GetInstance().GetTickCount( tick, count );
950       #else
951         NW_UNUSED_VARIABLE( tick );
952         NW_UNUSED_VARIABLE( count );
953       #endif
954     }
955 
956     //---------------------------------------------------------------------------
957     //! @brief      サウンドスレッド処理にかかった累積時間および処理回数を
958     //!             ゼロにリセットします。
959     //!
960     //! @see  GetSoundThreadTickCount
961     //!
962     //! @date 2010/05/08 初版
963     //---------------------------------------------------------------------------
ClearSoundThreadTickCount()964     static void ClearSoundThreadTickCount()
965     {
966       #ifdef NW_PLATFORM_CTR
967         internal::driver::SoundThread::GetInstance().ClearTickCount();
968       #endif
969     }
970 
971     //---------------------------------------------------------------------------
972     //! @brief        サウンドスレッド処理間隔をマイクロ秒換算した値です。
973     //!
974     //!               @ref GetSoundThreadTickCount で得られた count と tick に対し、
975     //!               ( tick.ToTimeSpan().GetMicroSeconds() * 100 ) /
976     //!               ( count * SOUND_THREAD_INTERVAL_USEC ) とすると、
977     //!               count 回のサウンドスレッド処理で、
978     //!               CPU を何 % 占有しているかが算出できます。
979     //!
980     //! @see GetSoundThreadTickCount
981     //!
982     //! @date 2010/05/08 初版
983     //---------------------------------------------------------------------------
984     static const int SOUND_THREAD_INTERVAL_USEC = NN_SND_USECS_PER_FRAME;
985     //@}
986 
987     //----------------------------------------
988     //! @name シーケンス変数出力設定
989     //@{
990     // シーケンス変数のプリント ON/OFF を設定する
991     //---------------------------------------------------------------------------
992     //! @brief        printvar シーケンスコマンドを有効にします。
993     //!
994     //!               デフォルトでは無効になっています。
995     //!               詳しくは、シーケンスデータマニュアルをご覧ください。
996     //!
997     //!               printvar シーケンスコマンドを有効にすると、
998     //!               無効のときと比べて printvar コマンド処理で余分に処理がかかるので、
999     //!               シーケンス変数デバッグをしない場合は無効にしておくことを推奨します。
1000     //!
1001     //! @see  DisableSeqPrintVar
1002     //! @see  IsEnabledSeqPrintVar
1003     //!
1004     //! @date 2010/01/15 初版
1005     //---------------------------------------------------------------------------
EnableSeqPrintVar()1006     static void EnableSeqPrintVar() { internal::driver::MmlParser::EnablePrintVar( true ); }
1007 
1008     //---------------------------------------------------------------------------
1009     //! @brief        printvar シーケンスコマンドを無効にします。
1010     //!
1011     //!               詳しくは、シーケンスデータマニュアルをご覧ください。
1012     //!
1013     //! @see  EnableSeqPrintVar
1014     //! @see  IsEnabledSeqPrintVar
1015     //!
1016     //! @date 2010/01/15 初版
1017     //---------------------------------------------------------------------------
DisableSeqPrintVar()1018     static void DisableSeqPrintVar() { internal::driver::MmlParser::EnablePrintVar( false ); }
1019 
1020     //---------------------------------------------------------------------------
1021     //! @brief        printvar シーケンスコマンドが有効かどうかを取得します。
1022     //!
1023     //!               true のときは有効、false のときは無効です。
1024     //!
1025     //!               printvar シーケンスコマンドを有効にすると、
1026     //!               無効のときと比べて printvar コマンド処理で余分に処理がかかるので、
1027     //!               シーケンス変数デバッグをしない場合は無効にしておくことを推奨します。
1028     //!
1029     //! @return       現在、printvar シーケンスコマンドが有効か無効かを取得します。
1030     //!
1031     //! @see  EnableSeqPrintVar
1032     //! @see  DisableSeqPrintVar
1033     //!
1034     //! @date 2010/01/15 初版
1035     //---------------------------------------------------------------------------
IsEnabledSeqPrintVar()1036     static bool IsEnabledSeqPrintVar()
1037     {
1038         return internal::driver::MmlParser::IsEnabledPrintVar();
1039     }
1040     //@}
1041 
1042     //----------------------------------------
1043     //! @name 使用ボイス数
1044     //@{
1045     //---------------------------------------------------------------------------
1046     //! @brief        サウンドライブラリで現在発音中のボイス数を取得します。
1047     //!
1048     //! @return       現在発音中のボイス数を返します。
1049     //!
1050     //! @see GetMaxVoiceCount
1051     //! @see SetMaxVoiceCount
1052     //!
1053     //! @date 2010/05/14 参照に SetMaxVoiceCount を追加
1054     //! @date 2010/01/26 文言の調整
1055     //! @date 2010/01/15 初版
1056     //---------------------------------------------------------------------------
GetVoiceCount()1057     static int GetVoiceCount()
1058     {
1059         return internal::driver::VoiceManager::GetInstance().GetVoiceCount();
1060     }
1061 
1062     //---------------------------------------------------------------------------
1063     //! @brief        サウンドライブラリで使用できる最大ボイス数を取得します。
1064     //!
1065     //!               デフォルトでは、NN_SND_VOICE_NUM を返します。
1066     //!
1067     //! @return       最大ボイス数を返します。
1068     //!
1069     //! @see GetVoiceCount
1070     //! @see SetMaxVoiceCount
1071     //!
1072     //! @date 2010/05/14 デフォルト値を追記、参照に SetMaxVoiceCount を追加
1073     //! @date 2010/01/26 文言の調整
1074     //! @date 2010/01/15 初版
1075     //---------------------------------------------------------------------------
GetMaxVoiceCount()1076     static int GetMaxVoiceCount()
1077     {
1078         return s_MaxVoiceCount;
1079     }
1080 
1081     //---------------------------------------------------------------------------
1082     //! @brief        サウンドライブラリで使用する最大ボイス数を設定します。
1083     //!
1084     //!               @ref Initialize より先に呼ぶ必要があります。
1085     //!
1086     //!               設定できる最大値は NN_SND_VOICE_NUM です。
1087     //!               これは、@ref GetMaxVoiceCount で取得できるデフォルト値と同じです。
1088     //!
1089     //!               最大ボイス数を削減することで、サウンドの処理量を抑えることができます。
1090     //!
1091     //!               最大ボイス数として、1 ~ NN_SND_VOICE_NUM を指定する必要があります。
1092     //!               範囲外の値を指定した場合は、Debug 版、Development 版ではアサートで停止し、
1093     //!               Release 版では 1 ~ NN_SND_VOICE_NUM の範囲に丸められます。
1094     //!
1095     //! @param[in] count  最大ボイス数です。
1096     //!
1097     //! @see Initialize
1098     //! @see GetVoiceCount
1099     //! @see GetMaxVoiceCount
1100     //!
1101     //! @date 2010/05/14 関数名を SetVoiceMaxCount → SetMaxVoiceCount に変更、アサート条件追記
1102     //! @date 2010/04/23 初版
1103     //---------------------------------------------------------------------------
SetMaxVoiceCount(int count)1104     static void SetMaxVoiceCount( int count )
1105     {
1106         NW_MINMAX_ASSERT( count, 1, NN_SND_VOICE_NUM );
1107         count = ut::Clamp( count, 1, NN_SND_VOICE_NUM );
1108         s_MaxVoiceCount = count;
1109     }
1110     //@}
1111 
1112     //----------------------------------------
1113     //! @name   biquad フィルタ
1114     //@{
1115     //---------------------------------------------------------------------------
1116     //! @brief  ユーザー定義の biquad フィルタを登録します。
1117     //!
1118     //!         @ref BiquadFilterCallback クラスを継承してユーザーが実装した
1119     //!         biquad フィルタを登録します。
1120     //!
1121     //!         type には、@ref BiquadFilterType で定義されている、
1122     //!         BIQUAD_FILTER_TYPE_USER_MIN ~ BIQUAD_FILTER_TYPE_USER_MAX
1123     //!         の値を指定します。
1124     //!         範囲外の値を設定すると、Debug 版 / Development 版ではアサートで停止します。
1125     //!         Release 版では無視されます。
1126     //!
1127     //!         ここで設定したコールバック関数はサウンドスレッドから呼び出されます。
1128     //!         排他制御が必要な場合は、
1129     //!         @ref SoundThreadScopedLock クラスあるいは、
1130     //!         @ref LockSoundThread / @ref UnlockSoundThread 関数を利用する必要があります。
1131     //!
1132     //!         コールバック関数はすみやかに処理を終える必要があります。
1133     //!         処理が長引くと、ノイズが発生する可能性が高くなります。
1134     //!         たとえば、コールバック関数内でブロックする可能性のある API
1135     //!         (クリティカルセクションなど) を呼び出すと、
1136     //!         処理を終えるのに時間がかかる可能性があります。
1137     //!
1138     //! @param[in] type     フィルタの種類です
1139     //!                     (BIQUAD_FILTER_TYPE_USER_MIN ~BIQUAD_FILTER_TYPE_USER_MAX)。
1140     //! @param[in] biquad   ユーザーが実装した biquad フィルタクラスです。
1141     //!
1142     //! @see BiquadFilterCallback クラス
1143     //! @see BiquadFilterType
1144     //!
1145     //! @date 2011/01/11 コールバック関数がサウンドスレッドから呼び出される旨、追記
1146     //! @date 2010/10/15 初版
1147     //---------------------------------------------------------------------------
SetBiquadFilterCallback(int type,const BiquadFilterCallback * biquad)1148     static void SetBiquadFilterCallback( int type, const BiquadFilterCallback* biquad )
1149     {
1150         NW_MINMAX_ASSERT( type, BIQUAD_FILTER_TYPE_USER_MIN, BIQUAD_FILTER_TYPE_USER_MAX );
1151         internal::driver::HardwareManager::GetInstance().SetBiquadFilterCallback( type, biquad );
1152     }
1153     //@}
1154 
1155 private:
1156     static int s_MaxVoiceCount;
1157     static internal::ThreadStack s_LoadThreadStack;
1158 #if defined( NW_SND_AVAILABLE_NN_SND_STARTSOUNDTHREAD )
1159 #else
1160     static internal::ThreadStack s_SoundThreadStack;
1161 #endif
1162     static bool s_AutoCreateSoundThreadFlag;
1163     static bool s_IsInitialized;
1164     static bool s_IsStreamLoadWait;
1165     static bool s_IsEnterSleep;
1166     static bool s_IsInitializedDriverCommandManager;
1167 };
1168 
1169 } // namespace nw::snd
1170 } // namespace nw
1171 
1172 
1173 #endif /* NW_SND_SOUND_SYSTEM_H_ */
1174 
1175