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