1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: snd_SoundStartable.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: 31311 $ 16 *---------------------------------------------------------------------------*/ 17 /** 18 * :include nw/snd/snd_SoundStartable.h 19 * 20 * @file snd_SoundStartable.h 21 */ 22 23 #ifndef NW_SND_SOUND_STARTABLE_H_ 24 #define NW_SND_SOUND_STARTABLE_H_ 25 26 #include <nw/snd/snd_SoundArchive.h> 27 28 namespace nw { 29 namespace snd { 30 31 class SoundHandle; 32 33 34 // 再生可能なことを表すインターフェイスです。 35 // 純粋仮想関数 detail_SetupSoundImpl() 及び detail_ConvertLabelStringToItemId() を 36 // 継承したクラスで実装することにより、そのクラスで 37 // StartSound(), HoldSound(), PrepareSound() 関数が使用できるようになります。 38 39 //--------------------------------------------------------------------------- 40 //! @brief サウンドの再生が可能なことを表す抽象クラスです。 41 //! 42 //! @date 2010/01/15 初版 43 //--------------------------------------------------------------------------- 44 class SoundStartable 45 { 46 public: 47 //--------------------------------------------------------------------------- 48 //! @brief サウンド再生処理結果を表すクラスです。 49 //! 50 //! START_ERR_NOT_ENOUGH_INSTANCE は、 51 //! 再生しようとしたサウンドに必要な数のインスタンスが 52 //! 作られていないことを表します。 53 //! サウンドアーカイブを使って再生している場合は、 54 //! サウンドアーカイブ中に設定されている 55 //! インスタンス数を増やす必要があります。 56 //! 57 //! @see SoundStartable::StartSound. 58 //! @see SoundStartable::HoldSound 59 //! @see SoundStartable::PrepareSound 60 //! 61 //! @date 2010/01/15 初版 62 //--------------------------------------------------------------------------- 63 class StartResult 64 { 65 public: 66 //--------------------------------------------------------------------------- 67 //! @brief サウンド再生処理結果を表すコードです。 68 //! 69 //! @date 2010/01/15 初版 70 //--------------------------------------------------------------------------- 71 enum ResultCode 72 { 73 //! 再生は成功しました。 74 START_SUCCESS = 0, 75 76 START_ERR_LOW_PRIORITY, 77 START_ERR_INVALID_LABEL_STRING, 78 START_ERR_INVALID_SOUNDID, 79 START_ERR_NOT_DATA_LOADED, 80 START_ERR_NOT_SEQ_LOADED, 81 START_ERR_NOT_BANK_LOADED, 82 START_ERR_NOT_WSD_LOADED, 83 START_ERR_NOT_WARC_LOADED, 84 START_ERR_NOT_ENOUGH_PLAYER_HEAP, 85 START_ERR_CANNOT_OPEN_FILE, 86 START_ERR_NOT_AVAILABLE, 87 START_ERR_CANNOT_ALLOCATE_TRACK, // 未使用 88 START_ERR_NOT_ENOUGH_INSTANCE, 89 START_ERR_INVALID_PARAMETER, 90 START_ERR_INVALID_SEQ_START_LOCATION_LABEL, 91 START_ERR_ACTOR_NOT_INITIALIZED, 92 START_ERR_USER = 128, 93 START_ERR_UNKNOWN = 255 94 }; 95 96 //! @details :private StartResult()97 StartResult() : m_Code( START_ERR_UNKNOWN ) {} 98 99 //! @details :private StartResult(ResultCode code)100 StartResult( ResultCode code ) : m_Code( code ) {} 101 102 //--------------------------------------------------------------------------- 103 //! @brief 再生成功したかどうかを取得します。 104 //! 105 //! @return 再生成功したら true, 失敗したら false を返します。 106 //! 107 //! @see SoundStartable::StartSound 108 //! @see SoundStartable::HoldSound 109 //! @see SoundStartable::PrepareSound 110 //! 111 //! @date 2010/01/15 初版 112 //--------------------------------------------------------------------------- IsSuccess()113 bool IsSuccess() const { return m_Code == START_SUCCESS; } 114 115 //--------------------------------------------------------------------------- 116 //! @brief 再生処理結果コードを取得します。 117 //! 118 //! @return 再生処理結果コードを返します。 119 //! 120 //! @date 2010/01/15 初版 121 //--------------------------------------------------------------------------- GetCode()122 ResultCode GetCode() const { return m_Code; } 123 124 private: 125 ResultCode m_Code; 126 }; 127 128 // static const char* detail_ConvertStartResultToString( StartResult startResult ); 129 130 //--------------------------------------------------------------------------- 131 //! @brief サウンド再生時に渡される、詳細な再生パラメータです。 132 //! 133 //! @ref SoundStartable::StartSound 等の関数に渡して使用します。 134 //! この構造体を使用しなくてもサウンドは再生出来ます。 135 //! 136 //! startOffsetType, startOffset を設定すると、 137 //! サウンドを途中から再生することが可能です。 138 //! この 2 つのパラメータは同時に設定する必要があります。 139 //! 設定した値を有効にするには、 140 //! enableFlag の ENABLE_START_OFFSET ビットを設定してください。 141 //! 142 //! オフセット値が同じでも、 143 //! データの種類によって途中再生のために必要な処理時間が異なります。 144 //! 大きな処理時間がかかる場合があることに注意してください。 145 //! 146 //! 【シーケンスサウンド】 @n 147 //! シーケンスを途中まで空回しするため、 148 //! 開始オフセットの大きさに応じた処理時間がかかります。 149 //! 150 //! 【ストリームサウンド】 @n 151 //! データが PCM の場合は、開始オフセットの大きさに関わらず、 152 //! 途中再生のための処理時間はほとんどかかりません。 153 //! データが ADPCM の場合は、最大 14336 サンプルのデータを 154 //! CPU でデコードするための処理がかかります。 155 //! 156 //! 【ウェーブサウンド】 @n 157 //! データが PCM の場合は、開始オフセットの大きさに関わらず、 158 //! 途中再生のための処理時間はほとんどかかりません。 159 //! データが ADPCM の場合は、 160 //! データ先頭から再生開始位置までの全てのサンプルを 161 //! CPU でデコードする必要があるため、 162 //! 開始オフセットの大きさに応じた処理時間がかかります。 163 //! 164 //! サウンドはサウンドアーカイブ中で設定された 165 //! ID のプレイヤーを使用して再生されますが、 166 //! これとは異なるプレイヤーを指定して再生したい場合、 167 //! playerId を設定します。設定した値を有効にするには、 168 //! enableFlag の ENABLE_PLAYER_ID ビットを設定してください。 169 //! 170 //! サウンドはサウンドアーカイブ中で設定された 171 //! プレイヤープライオリティを使用して再生されますが、 172 //! これとは異なるプライオリティ値を指定して再生したい場合、 173 //! playerPriority を設定します。設定した値を有効にするには、 174 //! enableFlag の ENABLE_PLAYER_PRIORITY ビットを設定してください。 175 //! 176 //! actorPlayerId は、@ref SoundActor 177 //! クラスで再生する際に使用するアクタープレイヤー番号を設定します。 178 //! 値の範囲は 0 ~ 3 です。設定した値を有効にするには、 179 //! enableFlag の ENABLE_ACTOR_PLAYER_ID ビットを設定してください。 180 //! (NW4C-0.4.1 現在、この値を設定しても効果はありません) 181 //! 182 //! seqSoundInfo は、シーケンスサウンドに関するパラメータです。 183 //! シーケンスサウンドを再生するときにのみ有効です。 184 //! サウンドアーカイブ中で設定されている、 185 //! シーケンスサウンドに関する情報を上書きすることができます。 186 //! 詳しくは SeqSoundInfo 構造体を参照してください。 187 //! 設定した値を有効にするには、 enableFlag の ENABLE_SEQ_SOUND_INFO 188 //! ビットを設定してください。 189 //! 190 //! @see SoundStartable::StartSound 191 //! 192 //! @date 2010/01/25 初版 193 //--------------------------------------------------------------------------- 194 struct StartInfo 195 { 196 //--------------------------------------------------------------------------- 197 //! @brief StartInfo 構造体のパラメータを有効にするためのビットフラグの定義です。 198 //! 199 //! それぞれの値の論理和をとって使用します。 200 //! 201 //! @see SoundStartable::StartInfo 202 //! 203 //! @date 2010/01/15 初版 204 //--------------------------------------------------------------------------- 205 enum EnableFlagBit 206 { 207 /*! 208 @brief startOffsetType, startOffset に設定された値を有効にします。 209 2 つのパラメータは同時に設定する必要があります。 210 */ 211 ENABLE_START_OFFSET = 0x00000001, 212 213 //! playerId に設定された値を有効にします。 214 ENABLE_PLAYER_ID = 0x00000002, 215 216 //! playerPriority に設定された値を有効にします。 217 ENABLE_PLAYER_PRIORITY = 0x00000004, 218 219 //! actorPlayerId に設定された値を有効にします。 220 ENABLE_ACTOR_PLAYER_ID = 0x00000008, 221 222 //! seqSoundInfo に設定された値を有効にします。 223 ENABLE_SEQ_SOUND_INFO = 0x00000010 224 }; 225 226 //--------------------------------------------------------------------------- 227 //! @brief サウンドの開始オフセット値の単位の定義です。 228 //! 229 //! @see SoundStartable::StartInfo 230 //! 231 //! @date 2010/01/15 初版 232 //--------------------------------------------------------------------------- 233 enum StartOffsetType 234 { 235 START_OFFSET_TYPE_MILLISEC, //!< オフセット値の単位はミリ秒です。 236 237 /*! 238 @brief オフセット値の単位は Tick です。 239 この指定はシーケンスサウンドに対してのみ有効です。 240 それ以外では、オフセット値の指定が無効になります。 241 */ 242 START_OFFSET_TYPE_TICK, 243 244 /*! 245 @brief オフセット値の単位は波形のサンプル数です。 246 この指定はストリームサウンドとウェーブサウンドに対して有効です。 247 それ以外では、オフセット値の指定が無効になります。 248 */ 249 START_OFFSET_TYPE_SAMPLE 250 }; 251 252 //--------------------------------------------------------------------------- 253 //! @brief シーケンスサウンドに関するパラメータ構造体です。 254 //! 255 //! シーケンスサウンド再生時に渡されるます。 256 //! 257 //! seqDataAddress にシーケンスデータのアドレスを指定すると、 258 //! サウンドアーカイブ中で設定されているシーケンスデータの代わりに、 259 //! メモリ上に置かれたシーケンスデータをアドレスで指定して再生することができます。 260 //! NULL を指定すると、 261 //! 元々サウンドアーカイブで設定されているシーケンスデータを再生します。 262 //! 263 //! startLocationLabel には、シーケンスデータ内の再生開始位置を指定します。 264 //! サウンドアーカイブ中で設定されているラベル文字列の代わりに、 265 //! ここで指定した文字列を使用するようになります。 266 //! NULL を指定すると、 267 //! 元々サウンドアーカイブで設定されている再生開始位置を使用して再生します。 268 //! 269 //! bankIds には、シーケンスデータと関連付けるバンク ID を指定します。 270 //! サウンドアーカイブ中で設定されているバンク ID の代わりに、 271 //! ここで指定した ID を仕様するようになります。 272 //! NULL を指定すると、 273 //! 元々サウンドアーカイブで設定されているバンク ID を仕様して再生します。 274 //! 275 //! @see SoundStartable::StartInfo 276 //! 277 //! @date 2010/01/15 初版 278 //--------------------------------------------------------------------------- 279 struct SeqSoundInfo 280 { 281 //! シーケンスデータのアドレスです。 282 const void* seqDataAddress; 283 284 //! シーケンスデータ内の再生開始位置を示すラベル文字列です。 285 const char* startLocationLabel; 286 287 //! シーケンスデータと関連付けるバンク ID です。 288 SoundArchive::ItemId bankIds[ SoundArchive::SEQ_BANK_MAX ]; 289 290 //! コンストラクタです。 SeqSoundInfoStartInfo::SeqSoundInfo291 SeqSoundInfo() : seqDataAddress( NULL ), startLocationLabel( NULL ) 292 { 293 for ( int i = 0; i < SoundArchive::SEQ_BANK_MAX; i++ ) 294 { 295 bankIds[ i ] = SoundArchive::INVALID_ID; 296 } 297 } 298 }; 299 300 /*! 301 @brief 構造体に設定された値を有効にするためのビットフラグです。 302 デフォルト値では全て無効になっています。 303 */ 304 u32 enableFlag; 305 306 //! サウンドの開始オフセット値の単位です。 307 StartOffsetType startOffsetType; 308 309 //! サウンドの開始オフセット値です。 310 int startOffset; 311 312 //! サウンドの再生に使用するプレイヤーの ID です。 313 SoundArchive::ItemId playerId; 314 315 //! サウンドに設定するプレイヤープライオリティです。 316 int playerPriority; 317 318 /*! 319 @brief SoundActorで再生する場合に使用するアクタープレイヤーの番号です。 320 (NW4C-0.4.1 現在、設定しても効果はありません) 321 */ 322 int actorPlayerId; 323 324 //! シーケンスサウンドに関するパラメータです。 325 SeqSoundInfo seqSoundInfo; 326 327 //! コンストラクタです StartInfoStartInfo328 StartInfo() : enableFlag( 0 ) {} 329 }; 330 331 /* ------------------------------------------------------------------------ 332 member definition 333 ------------------------------------------------------------------------ */ 334 // デストラクタ 335 //! @details :private ~SoundStartable()336 virtual ~SoundStartable() {}; 337 338 //---------------------------------------- 339 //! @name 再生 340 //@{ 341 // 再生関数 342 //--------------------------------------------------------------------------- 343 //! @brief 指定した ID のサウンドを再生します。 344 //! 345 //! 第一引数には、サウンドハンドルを指定します。 346 //! 再生に成功したサウンドは、このサウンドハンドルと関連付けられます。 347 //! 348 //! 第二引数には、再生するサウンドの識別子としてサウンド ID を指定します。 349 //! 350 //! pStartInfo は、再生時に設定できる詳細なパラメータです。 351 //! このパラメータは、設定せずに再生を開始することが可能です。 352 //! 353 //! この関数を呼び出すことは、@ref PrepareSound を呼び出した後、 354 //! すぐにハンドルクラスの @ref SoundHandle::StartPrepared 355 //! を呼び出すことと同じです。 356 //! 357 //! 現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。 358 //! 359 //! @param[in] pHandle 再生されるサウンドと関連付けられるハンドルです。 360 //! @param[in] soundId 再生するサウンドの ID です。 361 //! @param[in] pStartInfo 詳細な再生パラメータです。 362 //! 363 //! @return 再生処理結果を @ref StartResult 型で返します。 364 //! 365 //! @see SoundHandle クラス 366 //! @see StartResult 367 //! @see PrepareSound 368 //! @see StartInfo 369 //! 370 //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記 371 //! @date 2010/01/15 初版 372 //--------------------------------------------------------------------------- 373 StartResult StartSound( 374 SoundHandle* pHandle, 375 SoundArchive::ItemId soundId, 376 const StartInfo* pStartInfo = NULL ); 377 378 //--------------------------------------------------------------------------- 379 //! @brief 指定したラベル文字列のサウンドを再生します。 380 //! 381 //! 第一引数には、サウンドハンドルを指定します。 382 //! 再生に成功したサウンドは、このサウンドハンドルと関連付けられます。 383 //! 384 //! 第二引数には、再生するサウンドの識別子として、 385 //! サウンドのラベル文字列を指定します。 386 //! 387 //! pStartInfo は、再生時に設定できる詳細なパラメータです。 388 //! このパラメータは、設定せずに再生を開始することが可能です。 389 //! 390 //! この関数を呼び出すことは、@ref PrepareSound を呼び出した後、 391 //! すぐにハンドルクラスの @ref SoundHandle::StartPrepared 392 //! を呼び出すことと同じです。 393 //! 394 //! 現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。 395 //! 396 //! @param[in] pHandle 再生されるサウンドと関連付けられるハンドルです。 397 //! @param[in] pSoundName 再生するサウンドのラベル文字列です。 398 //! @param[in] pStartInfo 詳細な再生パラメータです。 399 //! 400 //! @return 再生処理結果を @ref StartResult 型で返します。 401 //! 402 //! @see SoundHandle クラス 403 //! @see StartResult 404 //! @see PrepareSound 405 //! @see StartInfo 406 //! 407 //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記 408 //! @date 2010/01/15 初版 409 //--------------------------------------------------------------------------- 410 StartResult StartSound( 411 SoundHandle* pHandle, 412 const char* pSoundName, 413 const StartInfo* pStartInfo = NULL ); 414 415 //--------------------------------------------------------------------------- 416 //! @brief 指定した ID のサウンドを再生または継続します。 417 //! 418 //! 同じ ID で毎フレームこの関数を呼び続けている間、 419 //! サウンドを再生することができます。 420 //! 呼び出しが途切れた時はサウンドが停止します。 421 //! 422 //! 第一引数には、サウンドハンドルを指定します。 423 //! 424 //! 第二引数には、再生するサウンドの識別子としてサウンド ID を指定します。 425 //! 426 //! pHoldInfo は、再生時に設定できる詳細なパラメータです。 427 //! このパラメータは、設定せずに再生を開始することが可能です。 428 //! 429 //! 現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。 430 //! 431 //! @param[in] pHandle 再生されるサウンドと関連付けられるハンドルです。 432 //! @param[in] soundId 再生するサウンドの ID です。 433 //! @param[in] pHoldInfo 詳細な再生パラメータです。 434 //! 435 //! @return 再生処理結果を @ref StartResult 型で返します。 436 //! 437 //! @see SoundHandle クラス 438 //! @see StartResult 439 //! @see StartInfo 440 //! 441 //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記 442 //! @date 2010/01/15 初版 443 //--------------------------------------------------------------------------- 444 StartResult HoldSound( 445 SoundHandle* pHandle, 446 SoundArchive::ItemId soundId, 447 const StartInfo* pHoldInfo = NULL ); 448 449 //--------------------------------------------------------------------------- 450 //! @brief 指定したラベル文字列のサウンドを再生または継続します。 451 //! 452 //! 同じ ID で毎フレームこの関数を呼び続けている間、 453 //! サウンドを再生することができます。 454 //! 呼び出しが途切れた時はサウンドが停止します。 455 //! 456 //! 第一引数には、サウンドハンドルを指定します。 457 //! 458 //! 第二引数には、再生するサウンドの識別子として、 459 //! サウンドのラベル文字列を指定します。 460 //! 461 //! pHoldInfo は、再生時に設定できる詳細なパラメータです。 462 //! このパラメータは、設定せずに再生を開始することが可能です。 463 //! 464 //! 現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。 465 //! 466 //! @param[in] pHandle 再生されるサウンドと関連付けられるハンドルです。 467 //! @param[in] pSoundName 再生するサウンドのラベル文字列です。 468 //! @param[in] pHoldInfo 詳細な再生パラメータです。 469 //! 470 //! @return 再生処理結果を @ref StartResult 型で返します。 471 //! 472 //! @see SoundHandle クラス 473 //! @see StartResult 474 //! @see StartInfo 475 //! 476 //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記 477 //! @date 2010/01/15 初版 478 //--------------------------------------------------------------------------- 479 StartResult HoldSound( 480 SoundHandle* pHandle, 481 const char* pSoundName, 482 const StartInfo* pHoldInfo = NULL ); 483 484 //--------------------------------------------------------------------------- 485 //! @brief 指定した ID のサウンドを再生する準備をします。 486 //! 487 //! 準備が完了したサウンドは、ハンドルクラスの 488 //! @ref SoundHandle::StartPrepared 489 //! を呼び出して再生を開始することができます。 490 //! 491 //! 第一引数には、サウンドハンドルを指定します。 492 //! 再生に成功したサウンドは、このサウンドハンドルと関連付けられます。 493 //! 494 //! 第二引数には、再生するサウンドの識別子としてサウンド ID を指定します。 495 //! 496 //! pStartInfo は、再生時に設定できる詳細なパラメータです。 497 //! このパラメータは、設定せずに再生を開始することが可能です。 498 //! 499 //! 現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。 500 //! 501 //! @param[in] pHandle 再生されるサウンドと関連付けられるハンドルです。 502 //! @param[in] soundId 再生するサウンドの ID です。 503 //! @param[in] pStartInfo 詳細な再生パラメータです。 504 //! 505 //! @return 再生準備処理結果を @ref StartResult 型で返します。 506 //! 507 //! @see SoundHandle クラス 508 //! @see StartResult 509 //! @see StartSound 510 //! @see StartInfo 511 //! 512 //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記 513 //! @date 2010/01/15 初版 514 //--------------------------------------------------------------------------- 515 StartResult PrepareSound( 516 SoundHandle* pHandle, 517 SoundArchive::ItemId soundId, 518 const StartInfo* pStartInfo = NULL ); 519 520 //--------------------------------------------------------------------------- 521 //! @brief 指定したラベル文字列のサウンドを再生する準備をします。 522 //! 523 //! 準備が完了したサウンドは、ハンドルクラスの 524 //! @ref SoundHandle::StartPrepared 525 //! を呼び出して再生を開始することができます。 526 //! 527 //! 第一引数には、サウンドハンドルを指定します。 528 //! 再生に成功したサウンドは、このサウンドハンドルと関連付けられます。 529 //! 530 //! 第二引数には、再生するサウンドの識別子として、 531 //! サウンドのラベル文字列を指定します。 532 //! 533 //! pStartInfo は、再生時に設定できる詳細なパラメータです。 534 //! このパラメータは、設定せずに再生を開始することが可能です。 535 //! 536 //! 現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。 537 //! 538 //! @param[in] pHandle 再生されるサウンドと関連付けられるハンドルです。 539 //! @param[in] pSoundName 再生するサウンドのラベル文字列です。 540 //! @param[in] pStartInfo 詳細な再生パラメータです。 541 //! 542 //! @return 再生準備処理結果を @ref StartResult 型で返します。 543 //! 544 //! @see SoundHandle クラス 545 //! @see StartResult 546 //! @see StartSound 547 //! @see StartInfo 548 //! 549 //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記 550 //! @date 2010/01/15 初版 551 //--------------------------------------------------------------------------- 552 StartResult PrepareSound( 553 SoundHandle* pHandle, 554 const char* pSoundName, 555 const StartInfo* pStartInfo = NULL ); 556 //@} 557 558 protected: 559 //! @details :private 560 virtual StartResult detail_SetupSound( 561 SoundHandle* handle, 562 u32 soundId, 563 bool holdFlag, 564 const StartInfo* startInfo 565 ) = 0; 566 //! @details :private 567 virtual SoundArchive::ItemId detail_GetItemId( const char* pString ) = 0; 568 }; 569 570 } // namespace nw::snd 571 } // namespace nw 572 573 #endif /* NW_SND_SOUND_STARTABLE_H_ */ 574 575