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