1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: snd_SoundArchive.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: 27990 $ 14 *---------------------------------------------------------------------------*/ 15 16 /** 17 * :include nw/snd/snd_SoundArchive.h 18 * 19 * @file snd_SoundArchive.h 20 */ 21 22 #ifndef NW_SND_SOUND_ARCHIVE_H_ 23 #define NW_SND_SOUND_ARCHIVE_H_ 24 25 #include <nn/types.h> 26 #include <nw/snd/snd_Global.h> 27 #include <nw/snd/snd_Util.h> 28 #include <nw/snd/snd_ItemType.h> 29 30 namespace nw { 31 32 namespace io { 33 class FileStream; 34 } // namespace nw::io 35 36 namespace snd { 37 38 namespace internal { 39 class SoundArchiveFileReader; 40 } // namespace nw::snd::internal 41 42 43 //--------------------------------------------------------------------------- 44 //! @brief サウンドアーカイブを扱うクラスです。 45 //! 46 //! ユーザーがこのクラスを直接扱うことはできません。 47 //! このクラスを継承した @ref RomSoundArchive クラス、 48 //! または @ref MemorySoundArchive クラスを使用してください。 49 //! 50 //! @see RomSoundArchive 51 //! @see MemorySoundArchive 52 //! 53 //! @date 2010/02/23 ヘッダーを追記 54 //! @date 2010/01/29 「参照」追加 55 //! @date 2010/01/15 初版 56 //--------------------------------------------------------------------------- 57 class SoundArchive 58 { 59 public: 60 //--------------------------------------------------------------------------- 61 //! @brief サウンドアーカイブの中でのアイテム ID を示す型です。 62 //! 63 //! サウンド、バンク、プレイヤー、グループ、波形アーカイブに、 64 //! 重複しないアイテム ID が割り振られています。 65 //! 66 //! @see GetItemLabel 67 //! @see GetItemId 68 //! 69 //! @date 2010/01/15 初版 70 //--------------------------------------------------------------------------- 71 typedef u32 ItemId; 72 73 //--------------------------------------------------------------------------- 74 //! @brief 無効な ID を表す値です。 75 //! 76 //! @date 2010/01/15 初版 77 //--------------------------------------------------------------------------- 78 static const ItemId INVALID_ID = 0xffffffff; 79 80 //--------------------------------------------------------------------------- 81 //! @brief サウンドの種類を表す型です。 82 //! 83 //! @see GetSoundType 84 //! 85 //! @date 2010/01/15 初版 86 //--------------------------------------------------------------------------- 87 enum SoundType 88 { 89 SOUND_TYPE_INVALID = 0, //!< 不正な種類のサウンドです。 90 91 SOUND_TYPE_SEQ, //!< シーケンスサウンドです。 92 SOUND_TYPE_STRM, //!< ストリームサウンドです。 93 SOUND_TYPE_WAVE //!< ウェーブサウンドです。 94 }; 95 96 //--------------------------------------------------------------------------- 97 //! @brief サウンドアーカイブの中でのファイル ID を示す型です。 98 //! 99 //! @date 2010/01/15 初版 100 //--------------------------------------------------------------------------- 101 typedef ItemId FileId; 102 103 //--------------------------------------------------------------------------- 104 //! @brief サウンドアーカイブの中での文字列 ID を示す型です。 105 //! 106 //! @date 2010/01/15 初版 107 //--------------------------------------------------------------------------- 108 typedef ItemId StringId; 109 110 //--------------------------------------------------------------------------- 111 //! @brief サウンドの設定情報の構造体です。 112 //! 113 //! isFrontBypass が true で、@ref SoundSystem::SetOutputMode 114 //! で設定する出力モードが OUTPUT_MODE_SURROUND の場合、 115 //! 当該サウンドはフロントチャンネルをバイパスします。 116 //! 117 //! @see ReadSoundInfo 118 //! @see FileId 119 //! @see ItemId 120 //! @see PanMode 121 //! @see PanCurve 122 //! @see nn::snd::Voice::SetFrontBypassFlag 123 //! 124 //! @date 2010/07/14 isFrontBypass 追加 125 //! @date 2010/01/15 初版 126 //--------------------------------------------------------------------------- 127 struct SoundInfo 128 { 129 FileId fileId; //!< サウンドアーカイブ内でのファイル ID です。 130 ItemId playerId; //!< サウンドを再生するときに使用されるプレイヤーの ID です。 131 132 //! アクターでサウンドを再生するときに使用されるアクタープレイヤーの番号です。 133 int actorPlayerId; 134 135 int playerPriority; //!< サウンドを再生するときのプレイヤープライオリティの値です。 136 int volume; //!< サウンドを再生するときの音量です。 137 PanMode panMode; //!< パンモードの種類です。 138 PanCurve panCurve; //!< パンのカーブの種類です。 139 140 bool isFrontBypass; //!< フロントバイパスするか否かを示すフラグです。 141 }; 142 143 //--------------------------------------------------------------------------- 144 //! @brief サウンドの 3D サウンド設定情報の構造体です。 145 //! 146 //! @see ReadSound3DInfo 147 //! 148 //! @date 2010/11/30 FLAG_CTRL_*** を static const u32 から enum に変更 149 //! @date 2010/03/05 初版 150 //--------------------------------------------------------------------------- 151 struct Sound3DInfo 152 { 153 //--------------------------------------------------------------------------- 154 //! @brief 3D 減衰カーブの形状を示す列挙体です。 155 //! 156 //! @date 2010/03/05 初版 157 //--------------------------------------------------------------------------- 158 enum DecayCurve 159 { 160 DECAY_CURVE_LOG = 1, //!< 対数カーブです。 161 DECAY_CURVE_LINEAR = 2 //!< リニア (直線) です。 162 }; 163 164 //--------------------------------------------------------------------------- 165 //! @brief 3D サウンドで各パラメータを計算するかどうかを示すフラグです。 166 //! 167 //! @date 2010/11/30 初版 168 //--------------------------------------------------------------------------- 169 enum FlagCtrl 170 { 171 FLAG_CTRL_VOLUME = (1 << 0), //!< 音量を計算するかどうかを示すフラグです。 172 FLAG_CTRL_PRIORITY = (1 << 1), //!< プライオリティを計算するかどうかを示すフラグです。 173 FLAG_CTRL_PAN = (1 << 2), //!< パンを計算するかどうかを示すフラグです。 174 FLAG_CTRL_SPAN = (1 << 3), //!< サラウンドパンを計算するかどうかを示すフラグです。 175 FLAG_CTRL_FILTER = (1 << 4) //!< biquad フィルタを計算するかどうかを示すフラグです。 176 }; 177 178 //--------------------------------------------------------------------------- 179 //! @brief 3D 計算で処理するパラメータを表現するビットフラグです。 180 //! FLAG_CTRL_*** の論理和で表現されます。 181 //--------------------------------------------------------------------------- 182 u32 flags; 183 f32 decayRatio; //!< 3D 減衰率です。 184 u8 decayCurve; //!< 3D 減衰カーブの形状です。@ref DecayCurve が格納されます。 185 u8 dopplerFactor; //!< 3D ドップラーファクターです。 186 }; 187 188 //--------------------------------------------------------------------------- 189 //! @brief シーケンスサウンドに関連付けられるバンクの最大数です。 190 //! 191 //! @date 2010/01/15 初版 192 //--------------------------------------------------------------------------- 193 static const u32 SEQ_BANK_MAX = 4; 194 195 //--------------------------------------------------------------------------- 196 //! @brief シーケンスサウンドの設定情報の構造体です。 197 //! 198 //! サウンドアーカイブで定義されている、 199 //! シーケンスサウンドの情報を取得するための構造体です。 200 //! 201 //! @see ReadSequenceSoundInfo 202 //! 203 //! @date 2010/01/15 初版 204 //--------------------------------------------------------------------------- 205 struct SequenceSoundInfo 206 { 207 u32 startOffset; //!< 非公開です。ライブラリ内部で使用されています。 208 u32 bankIds[ SEQ_BANK_MAX ]; //!< シーケンスサウンドで使用されるバンク ID です。 209 210 //--------------------------------------------------------------------------- 211 //! @brief シーケンスサウンドに含まれるトラックのビットフラグです。 212 //! 下位ビットから順にトラック 0, トラック 1, トラック 2,... を表します。 213 //--------------------------------------------------------------------------- 214 u32 allocateTrackFlags; 215 216 //! シーケンスサウンドで発音される音のチャンネルプライオリティの値です。 217 u8 channelPriority; 218 219 //--------------------------------------------------------------------------- 220 //! @brief シーケンスサウンドで発音される音が、 221 //! リリース時にプライオリティを固定されるかどうかのフラグです。 222 //! 固定しない場合はリリース時にプライオリティが下がります。 223 //--------------------------------------------------------------------------- 224 bool isReleasePriorityFix; 225 226 //! コンストラクタです。 SequenceSoundInfoSequenceSoundInfo227 SequenceSoundInfo() 228 : startOffset( 0 ), 229 allocateTrackFlags( 0 ), 230 channelPriority( 0 ), 231 isReleasePriorityFix( false ) 232 { 233 for ( u32 i = 0; i < SEQ_BANK_MAX; i++ ) 234 { 235 bankIds[ i ] = INVALID_ID; 236 } 237 } 238 }; 239 240 //--------------------------------------------------------------------------- 241 //! :private 242 //! 243 //! @brief ストリームサウンドの設定情報の構造体です。 244 //! 245 //! サウンドアーカイブで定義されている、 246 //! ストリームサウンドの情報を取得するための構造体です。 247 //! 248 //! @see detail_ReadStreamSoundInfo 249 //! 250 //! @date 2010/01/15 初版 251 //--------------------------------------------------------------------------- 252 struct StreamSoundInfo 253 { 254 u16 allocTrackCount; 255 u16 allocChannelCount; 256 257 //! コンストラクタです。 StreamSoundInfoStreamSoundInfo258 StreamSoundInfo() 259 : allocTrackCount( 0 ), 260 allocChannelCount( 0 ) 261 {} 262 }; 263 264 //--------------------------------------------------------------------------- 265 //! :private 266 //! 267 //! @brief ウェーブサウンドの設定情報の構造体です。 268 //! 269 //! サウンドアーカイブで定義されている、 270 //! ウェーブサウンドの情報を取得するための構造体です。 271 //! 272 //! @see detail_ReadWaveSoundInfo 273 //! 274 //! @date 2010/01/15 初版 275 //--------------------------------------------------------------------------- 276 struct WaveSoundInfo 277 { 278 u32 index; // ウェーブサウンドセットファイル (bcwsd) 内で何番目か 279 u32 allocTrackCount; // 現状は 1。今後マルチトラック化した場合、ほかの値が入る 280 u8 channelPriority; 281 bool isReleasePriorityFix; 282 283 //! コンストラクタです。 WaveSoundInfoWaveSoundInfo284 WaveSoundInfo() 285 : allocTrackCount( 0 ), 286 channelPriority( 0 ), 287 isReleasePriorityFix( false ) {} 288 }; 289 290 //--------------------------------------------------------------------------- 291 //! @brief バンクの設定情報の構造体です。 292 //! 293 //! サウンドアーカイブで定義されている、 294 //! バンクの情報を取得するための構造体です。 295 //! 296 //! @see ReadBankInfo 297 //! @see FileId 298 //! 299 //! @date 2010/01/15 初版 300 //--------------------------------------------------------------------------- 301 struct BankInfo 302 { 303 FileId fileId; //!< サウンドアーカイブ内でのファイル ID です。 304 305 //! コンストラクタです。 BankInfoBankInfo306 BankInfo() : fileId( INVALID_ID ) {} 307 }; 308 309 //--------------------------------------------------------------------------- 310 //! :private 311 //! 312 //! @brief 波形アーカイブの設定情報の構造体です。 313 //! 314 //! サウンドアーカイブで定義されている、 315 //! 波形アーカイブの情報を取得するための構造体です。 316 //! 317 //! @see ReadWaveArchiveInfo 318 //! 319 //! @date 2010/01/15 初版 320 //--------------------------------------------------------------------------- 321 struct WaveArchiveInfo 322 { 323 u32 fileId; 324 u32 waveCount; 325 bool isLoadIndividual; 326 u8 padding1; 327 u16 padding2; 328 329 //! コンストラクタです。 WaveArchiveInfoWaveArchiveInfo330 WaveArchiveInfo() : fileId( INVALID_ID ), isLoadIndividual( false ) {} 331 }; 332 333 //--------------------------------------------------------------------------- 334 //! @brief プレイヤーの設定情報の構造体です。 335 //! 336 //! サウンドアーカイブで定義されている、 337 //! プレイヤーの情報を取得するための構造体です。 338 //! 339 //! @see ReadPlayerInfo 340 //! 341 //! @date 2010/01/15 初版 342 //--------------------------------------------------------------------------- 343 struct PlayerInfo 344 { 345 int playableSoundMax; //!< プレイヤーで同時に再生できるサウンドの数です。 346 u32 playerHeapSize; //!< プレイヤーに割り当てられるプレイヤーヒープのサイズです。 347 348 //! コンストラクタです。 PlayerInfoPlayerInfo349 PlayerInfo() 350 : playableSoundMax( 0 ), 351 playerHeapSize( 0 ) {} 352 }; 353 354 //--------------------------------------------------------------------------- 355 //! :private 356 //! 357 //! @brief ウェーブサウンドセット・シーケンスサウンドセットの設定情報の構造体です。 358 //! 359 //! サウンドアーカイブで定義されている、 360 //! ウェーブサウンドセット・シーケンスサウンドセットの情報を 361 //! 取得するための構造体です。 362 //! 363 //! @see detail_ReadSoundGroupInfo 364 //! 365 //! @date 2010/01/15 初版 366 //--------------------------------------------------------------------------- 367 struct SoundGroupInfo 368 { 369 ItemId startId; 370 ItemId endId; 371 const internal::Util::Table<ut::ResU32>* fileIdTable; 372 373 //! コンストラクタです。 SoundGroupInfoSoundGroupInfo374 SoundGroupInfo() 375 : startId( INVALID_ID ), 376 endId( INVALID_ID ), 377 fileIdTable( NULL ) {} 378 }; 379 380 //--------------------------------------------------------------------------- 381 //! :private 382 //! 383 //! @brief グループの設定情報の構造体です。 384 //! 385 //! サウンドアーカイブで定義されている、 386 //! グループの情報を取得するための構造体です。 387 //! 388 //! @see detail_ReadGroupInfo 389 //! 390 //! @date 2010/01/15 初版 391 //--------------------------------------------------------------------------- 392 struct GroupInfo 393 { 394 FileId fileId; GroupInfoGroupInfo395 GroupInfo() : fileId( INVALID_ID ) {} 396 }; 397 398 //--------------------------------------------------------------------------- 399 //! @brief サウンドアーカイブプレイヤーの設定情報の構造体です。 400 //! 401 //! サウンドアーカイブで定義されている、 402 //! サウンドアーカイブプレイヤーの情報を取得するための構造体です。 403 //! 404 //! @see ReadSoundArchivePlayerInfo 405 //! 406 //! @date 2010/01/15 初版 407 //--------------------------------------------------------------------------- 408 struct SoundArchivePlayerInfo 409 { 410 int sequenceSoundMax; //!< 確保するシーケンスサウンドインスタンスの数です。 411 int sequenceTrackMax; //!< 確保するシーケンストラックインスタンスの数です。 412 int streamSoundMax; //!< 確保するストリームサウンドインスタンスの数です。 413 int streamTrackMax; //!< 確保するストリームトラックインスンスの数です。 414 int streamChannelMax; //!< 確保するストリームチャンネルインスタンスの数です。 415 int waveSoundMax; //!< 確保するウェーブサウンドインスタンスの数です。 416 int waveTrackMax; //!< 確保するウェーブサウンドトラックの数です。 417 }; 418 419 //--------------------------------------------------------------------------- 420 //! :private 421 //! 422 //! @brief ファイルの設定情報の構造体です。 423 //! 424 //! サウンドアーカイブで定義されている、 425 //! ファイルの情報を取得するための構造体です。 426 //! 427 //! @see detail_ReadFileInfo 428 //! 429 //! @date 2010/01/15 初版 430 //--------------------------------------------------------------------------- 431 struct FileInfo 432 { 433 u32 fileSize; 434 u32 offsetFromFileBlockHead; 435 const char* externalFilePath; 436 FileInfoFileInfo437 FileInfo() 438 : fileSize( 0xffffffff ), 439 offsetFromFileBlockHead( 0xffffffff ), 440 externalFilePath( NULL ) 441 {} 442 }; 443 444 //---------------------------------------- 445 //! @name コンストラクタ / デストラクタ 446 //@{ 447 protected: 448 //--------------------------------------------------------------------------- 449 //! @brief コンストラクタです。 450 //! 451 //! @date 2010/01/15 初版 452 //--------------------------------------------------------------------------- 453 SoundArchive(); 454 455 public: 456 //--------------------------------------------------------------------------- 457 //! @brief デストラクタです。 458 //! 459 //! @date 2010/01/15 初版 460 //--------------------------------------------------------------------------- 461 virtual ~SoundArchive(); 462 463 //@} 464 465 public: 466 //---------------------------------------- 467 //! @name 状態取得 468 //@{ 469 //--------------------------------------------------------------------------- 470 //! @brief サウンドアーカイブ中のデータが利用可能な状態か調べます。 471 //! 472 //! @return サウンドアーカイブ中のデータが利用可能な状態なら true を、 473 //! そうでなければ false を返します。 474 //! 475 //! @date 2010/11/12 誤植修正 (サウンドアーカイブ中のの→サウンドアーカイブ中の) 476 //! @date 2010/01/15 初版 477 //--------------------------------------------------------------------------- 478 bool IsAvailable() const; 479 //@} 480 481 //---------------------------------------- 482 //! @name ID / ラベル文字列 483 //@{ 484 //--------------------------------------------------------------------------- 485 //! @brief サウンドアーカイブ中のサウンドの個数を取得します。 486 //! 487 //! @return サウンドアーカイブ中のサウンドの個数を返します。 488 //! 489 //! @date 2010/01/15 初版 490 //--------------------------------------------------------------------------- 491 u32 GetSoundCount() const; 492 493 //--------------------------------------------------------------------------- 494 //! @brief サウンドアーカイブ中のグループの個数を取得します。 495 //! 496 //! @return サウンドアーカイブ中のグループの個数を返します。 497 //! 498 //! @date 2010/01/15 初版 499 //--------------------------------------------------------------------------- 500 u32 GetGroupCount() const; 501 502 //--------------------------------------------------------------------------- 503 //! @brief サウンドアーカイブ中のプレイヤーの個数を取得します。 504 //! 505 //! @return サウンドアーカイブ中のプレイヤーの個数を返します。 506 //! 507 //! @date 2010/01/15 初版 508 //--------------------------------------------------------------------------- 509 u32 GetPlayerCount() const; 510 511 //--------------------------------------------------------------------------- 512 //! :private 513 //! 514 //! @brief サウンドアーカイブ中のウェーブサウンドセット・ 515 //! シーケンスサウンドセットの個数を取得します。 516 //! 517 //! @return サウンドアーカイブ中のウェーブサウンドセット・ 518 //! シーケンスサウンドセットの個数を返します。 519 //! 520 //! @date 2010/01/15 初版 521 //--------------------------------------------------------------------------- 522 u32 GetSoundGroupCount() const; 523 524 //--------------------------------------------------------------------------- 525 //! @brief サウンドアーカイブ中のバンクの個数を取得します。 526 //! 527 //! @return サウンドアーカイブ中のバンクの個数を返します。 528 //! 529 //! @date 2010/01/15 初版 530 //--------------------------------------------------------------------------- 531 u32 GetBankCount() const; 532 533 //--------------------------------------------------------------------------- 534 //! @brief サウンドアーカイブ中の波形アーカイブの個数を取得します。 535 //! 536 //! @return サウンドアーカイブ中の波形アーカイブの個数を返します。 537 //! 538 //! @date 2010/01/15 初版 539 //--------------------------------------------------------------------------- 540 u32 GetWaveArchiveCount() const; 541 542 //--------------------------------------------------------------------------- 543 //! :private 544 //! 545 //! @brief サウンドアーカイブ中のファイルの個数を取得します。 546 //! 547 //! @return サウンドアーカイブ中のファイルの個数を返します。 548 //! 549 //! @date 2010/01/15 初版 550 //--------------------------------------------------------------------------- 551 u32 detail_GetFileCount() const; 552 553 //--------------------------------------------------------------------------- 554 //! @brief アイテム ID から、対応するラベル文字列を取得します。 555 //! 556 //! 指定したアイテム ID が存在しない場合は、NULL を返します。 557 //! 558 //! @ref MemorySoundArchive、@ref RomSoundArchive 問わず、 559 //! 文字列情報を利用する場合は、 560 //! サウンドアーカイブファイルに文字列テーブルが含まれている必要があります。 561 //! 562 //! サウンドアーカイブファイルに文字列テーブルを含めるには、 563 //! SoundMaker の [プロジェクト設定] - [サウンドアーカイブ] タブ - 564 //! [文字列テーブルを出力する] にチェックをつけておいてください。 565 //! 566 //! @ref RomSoundArchive 使用時は、あらかじめ 567 //! @ref RomSoundArchive::LoadLabelStringData でラベル文字列データを 568 //! ロードしておく必要があります。 569 //! 文字列データをロードしていない無い場合は、NULL を返します。 570 //! 571 //! @ref MemorySoundArchive に文字列テーブルが含まれていない場合は、 572 //! NULL を返します。 573 //! 574 //! @param[in] id サウンドアーカイブ内のアイテム ID です。 575 //! 576 //! @return 指定した ID に対応したラベル文字列を返します。 577 //! 578 //! @see ItemId 579 //! @see GetItemId 580 //! @see RomSoundArchive::LoadLabelStringData 581 //! 582 //! @date 2010/09/21 存在しない ID やラベル文字列が含まれていない場合など、NULL を返す旨追記 583 //! @date 2010/06/25 サウンドアーカイブの文字列テーブルに関する記述を追加 584 //! @date 2010/01/15 初版 585 //--------------------------------------------------------------------------- 586 const char* GetItemLabel( ItemId id ) const; 587 588 //--------------------------------------------------------------------------- 589 //! @brief ラベル文字列から、対応するアイテム ID に変換します。 590 //! 591 //! 指定したラベル文字列が存在しない場合は、 592 //! @ref INVALID_ID を返します。 593 //! 594 //! @ref MemorySoundArchive、@ref RomSoundArchive 問わず、 595 //! 文字列情報を利用する場合は、 596 //! サウンドアーカイブファイルに文字列テーブルが含まれている必要があります。 597 //! 598 //! サウンドアーカイブファイルに文字列テーブルを含めるには、 599 //! SoundMaker の [プロジェクト設定] - [サウンドアーカイブ] タブ - 600 //! [文字列テーブルを出力する] にチェックをつけておいてください。 601 //! 602 //! @ref RomSoundArchive 使用時は、あらかじめ 603 //! @ref RomSoundArchive::LoadLabelStringData でラベル文字列データを 604 //! ロードしておく必要があります。 605 //! 606 //! @param[in] pLabel ラベル文字列です。 607 //! 608 //! @return 指定したラベル文字列に対応したアイテム ID を返します。 609 //! 610 //! @see GetItemLabel 611 //! @see RomSoundArchive::LoadLabelStringData 612 //! 613 //! @date 2010/06/25 サウンドアーカイブの文字列テーブルに関する記述を追加 614 //! @date 2010/01/15 初版 615 //--------------------------------------------------------------------------- 616 ItemId GetItemId( const char* pLabel ) const; 617 618 //--------------------------------------------------------------------------- 619 //! @brief アイテム ID から、対応するファイル ID を取得します。 620 //! 621 //! @param[in] id サウンドアーカイブ内のアイテム ID です。 622 //! 623 //! @return 指定したアイテム ID に対応したファイル ID を返します。 624 //! 625 //! @see FileId 626 //! @see ItemId 627 //! 628 //! @date 2010/01/15 初版 629 //--------------------------------------------------------------------------- 630 FileId GetItemFileId( ItemId id ) const; 631 632 //--------------------------------------------------------------------------- 633 //! @brief サウンドの通し番号をサウンド ID に変換します。 634 //! 635 //! index に 0 以上 @ref GetSoundCount 未満の値を渡すと、 636 //! 全サウンドの ID を取得することができます。 637 //! 638 //! 最大値は範囲チェックされませんので、 639 //! 取得値を利用する場合は、アプリケーション側で注意してください。 640 //! 641 //! @param[in] index サウンドの通し番号です。 642 //! 643 //! @return 通し番号に対応したサウンド ID を返します。 644 //! 645 //! @see ItemId 646 //! 647 //! @date 2010/08/30 初版 648 //--------------------------------------------------------------------------- GetSoundIdFromIndex(u32 index)649 static ItemId GetSoundIdFromIndex( u32 index ) 650 { 651 return internal::Util::GetMaskedItemId( index, internal::ItemType_Sound ); 652 } 653 //--------------------------------------------------------------------------- 654 //! :private 655 //! 656 //! @brief サウンドグループ (ウェーブサウンドセット、シーケンスサウンドセット) 657 //! の通し番号をサウンド ID に変換します。 658 //! 659 //! index に 0 以上 @ref GetSoundGroupCount 未満の値を渡すと、 660 //! 全サウンドグループの ID を取得することができます。 661 //! 662 //! 最大値は範囲チェックされませんので、 663 //! 取得値を利用する場合は、アプリケーション側で注意してください。 664 //! 665 //! @param[in] index サウンドグループの通し番号です。 666 //! 667 //! @return 通し番号に対応したサウンドグループ ID を返します。 668 //! 669 //! @see ItemId 670 //! @see GetSoundGroupCount 671 //! 672 //! @date 2010/08/30 初版 673 //--------------------------------------------------------------------------- GetSoundGroupIdFromIndex(u32 index)674 static ItemId GetSoundGroupIdFromIndex( u32 index ) 675 { 676 return internal::Util::GetMaskedItemId( index, internal::ItemType_SoundGroup ); 677 } 678 //--------------------------------------------------------------------------- 679 //! @brief バンクの通し番号をバンク ID に変換します。 680 //! 681 //! index に 0 以上 @ref GetBankCount 未満の値を渡すと、 682 //! 全バンクの ID を取得することができます。 683 //! 684 //! 最大値は範囲チェックされませんので、 685 //! 取得値を利用する場合は、アプリケーション側で注意してください。 686 //! 687 //! @param[in] index バンクの通し番号です。 688 //! 689 //! @return 通し番号に対応したバンク ID を返します。 690 //! 691 //! @see ItemId 692 //! @see GetBankCount 693 //! 694 //! @date 2010/08/30 初版 695 //--------------------------------------------------------------------------- GetBankIdFromIndex(u32 index)696 static ItemId GetBankIdFromIndex( u32 index ) 697 { 698 return internal::Util::GetMaskedItemId( index, internal::ItemType_Bank ); 699 } 700 //--------------------------------------------------------------------------- 701 //! @brief プレイヤーの通し番号をプレイヤー ID に変換します。 702 //! 703 //! index に 0 以上 @ref GetPlayerCount 未満の値を渡すと、 704 //! 全プレイヤーの ID を取得することができます。 705 //! 706 //! 最大値は範囲チェックされませんので、 707 //! 取得値を利用する場合は、アプリケーション側で注意してください。 708 //! 709 //! @param[in] index プレイヤーの通し番号です。 710 //! 711 //! @return 通し番号に対応したプレイヤー ID を返します。 712 //! 713 //! @see ItemId 714 //! @see GetPlayerCount 715 //! 716 //! @date 2010/08/30 初版 717 //--------------------------------------------------------------------------- GetPlayerIdFromIndex(u32 index)718 static ItemId GetPlayerIdFromIndex( u32 index ) 719 { 720 return internal::Util::GetMaskedItemId( index, internal::ItemType_Player ); 721 } 722 //--------------------------------------------------------------------------- 723 //! @brief 波形アーカイブの通し番号を波形アーカイブ ID に変換します。 724 //! 725 //! index に 0 以上 @ref GetWaveArchiveCount 未満の値を渡すと、 726 //! 全波形アーカイブの ID を取得することができます。 727 //! 728 //! 最大値は範囲チェックされませんので、 729 //! 取得値を利用する場合は、アプリケーション側で注意してください。 730 //! 731 //! @param[in] index 波形アーカイブの通し番号です。 732 //! 733 //! @return 通し番号に対応した波形アーカイブ ID を返します。 734 //! 735 //! @see ItemId 736 //! @see GetWaveArchiveCount 737 //! 738 //! @date 2010/08/30 初版 739 //--------------------------------------------------------------------------- GetWaveArchiveIdFromIndex(u32 index)740 static ItemId GetWaveArchiveIdFromIndex( u32 index ) 741 { 742 return internal::Util::GetMaskedItemId( index, internal::ItemType_WaveArchive ); 743 } 744 //--------------------------------------------------------------------------- 745 //! @brief グループの通し番号をグループ ID に変換します。 746 //! 747 //! index に 0 以上 @ref GetGroupCount 未満の値を渡すと、 748 //! 全グループの ID を取得することができます。 749 //! 750 //! 最大値は範囲チェックされませんので、 751 //! 取得値を利用する場合は、アプリケーション側で注意してください。 752 //! 753 //! @param[in] index グループの通し番号です。 754 //! 755 //! @return 通し番号に対応したグループ ID を返します。 756 //! 757 //! @see ItemId 758 //! @see GetGroupCount 759 //! 760 //! @date 2010/08/30 初版 761 //--------------------------------------------------------------------------- GetGroupIdFromIndex(u32 index)762 static ItemId GetGroupIdFromIndex( u32 index ) 763 { 764 return internal::Util::GetMaskedItemId( index, internal::ItemType_Group ); 765 } 766 //@} 767 768 769 //---------------------------------------- 770 //! @name 情報取得 771 //@{ 772 //--------------------------------------------------------------------------- 773 //! @brief 指定した ID のサウンドのユーザーパラメータを取得します。 774 //! 775 //! 指定した ID のサウンドが存在しない場合は、 776 //! 0 を返します。 777 //! 778 //! @param[in] soundId サウンドアーカイブ内のサウンド ID です。 779 //! 780 //! @return サウンドのユーザーパラメータを返します。 781 //! 782 //! @see ItemId 783 //! 784 //! @date 2010/01/18 初版 785 //--------------------------------------------------------------------------- 786 u32 GetSoundUserParam( ItemId soundId ) const; 787 788 //--------------------------------------------------------------------------- 789 //! @brief 指定した ID のサウンドの種類を取得します。 790 //! 791 //! 指定した ID のサウンドが存在しない場合は、 792 //! @ref SOUND_TYPE_INVALID を返します。 793 //! 794 //! @param[in] soundId サウンドアーカイブ内のサウンド ID です。 795 //! 796 //! @return サウンドの種類を返します。 797 //! 798 //! @see SoundType 799 //! @see ItemId 800 //! 801 //! @date 2010/01/15 初版 802 //--------------------------------------------------------------------------- 803 SoundType GetSoundType( ItemId soundId ) const; 804 805 //--------------------------------------------------------------------------- 806 //! @brief 指定した ID のサウンドの情報を取得します。 807 //! 808 //! 指定した ID のサウンドが存在しない場合は読み取りは失敗します。 809 //! 810 //! @param[in] soundId サウンドアーカイブ内のサウンド ID です。 811 //! @param[out] info サウンド情報を取得するための構造体です。 812 //! 813 //! @return サウンド情報の取得に成功したら true を、失敗したら false を返します。 814 //! 815 //! @see ItemId 816 //! @see SoundInfo 817 //! 818 //! @date 2010/01/15 初版 819 //--------------------------------------------------------------------------- 820 bool ReadSoundInfo( ItemId soundId, SoundInfo* info ) const; 821 822 //--------------------------------------------------------------------------- 823 //! @brief 指定した ID のシーケンスサウンドの情報を取得します。 824 //! 825 //! 指定した ID のシーケンスサウンドが存在しない場合は読み取りは失敗します。 826 //! 827 //! @param[in] soundId サウンドアーカイブ内のサウンド ID です。 828 //! @param[out] info シーケンスサウンド情報を取得するための構造体です。 829 //! 830 //! @return シーケンスサウンド情報の取得に成功したら true を、失敗したら false を返します。 831 //! 832 //! @see ItemId 833 //! @see SequenceSoundInfo 834 //! 835 //! @date 2010/01/15 初版 836 //--------------------------------------------------------------------------- 837 bool ReadSequenceSoundInfo( ItemId soundId, SequenceSoundInfo* info ) const; 838 839 //--------------------------------------------------------------------------- 840 //! @brief 指定した ID のバンクの情報を取得します。 841 //! 842 //! 指定した ID のバンクが存在しない場合は読み取りは失敗します。 843 //! 844 //! @param[in] bankId サウンドアーカイブ内のバンク ID です。 845 //! @param[out] info バンク情報を取得するための構造体です。 846 //! 847 //! @return バンク情報の取得に成功したら true を、失敗したら false を返します。 848 //! 849 //! @see ItemId 850 //! @see PlayerInfo 851 //! 852 //! @date 2010/01/15 初版 853 //--------------------------------------------------------------------------- 854 bool ReadBankInfo( ItemId bankId, BankInfo* info ) const; 855 856 //--------------------------------------------------------------------------- 857 //! @brief 指定した ID のプレイヤーの情報を取得します。 858 //! 859 //! 指定した ID のプレイヤーが存在しない場合は読み取りは失敗します。 860 //! 861 //! @param[in] playerId サウンドアーカイブ内のプレイヤー ID です。 862 //! @param[out] info プレイヤー情報を取得するための構造体です。 863 //! 864 //! @return プレイヤー情報の取得に成功したら true を、失敗したら false を返します。 865 //! 866 //! @see ItemId 867 //! @see PlayerInfo 868 //! 869 //! @date 2010/01/15 初版 870 //--------------------------------------------------------------------------- 871 bool ReadPlayerInfo( ItemId playerId, PlayerInfo* info ) const; 872 873 //--------------------------------------------------------------------------- 874 //! @brief サウンドアーカイブプレイヤーの情報を取得します。 875 //! 876 //! @param[out] info サウンドアーカイブプレイヤー情報を取得するための構造体です。 877 //! 878 //! @return サウンドアーカイブプレイヤー情報の取得に成功したら true を、 879 //! 失敗したら false を返します。 880 //! 881 //! @see SoundArchivePlayerInfo 882 //! 883 //! @date 2010/01/15 初版 884 //--------------------------------------------------------------------------- 885 bool ReadSoundArchivePlayerInfo( SoundArchivePlayerInfo* info ) const; 886 887 //! @details :private 888 bool detail_ReadStreamSoundInfo( ItemId soundId, StreamSoundInfo* info ) const; 889 890 //! @details :private 891 bool detail_ReadWaveSoundInfo( ItemId soundId, WaveSoundInfo* info ) const; 892 893 //--------------------------------------------------------------------------- 894 //! @brief 指定した ID の 3D サウンド情報を取得します。 895 //! 896 //! 指定した ID のサウンドが存在しない場合は読み取りに失敗します。 897 //! 898 //! @param[in] soundId サウンドアーカイブ内のサウンド ID です。 899 //! @param[out] info サウンドアーカイブプレイヤー情報を取得するための構造体です。 900 //! 901 //! @return 3D サウンド情報の取得に成功したら true を、 902 //! 失敗したら false を返します。 903 //! 904 //! @see Sound3DInfo 905 //! 906 //! @date 2010/03/05 初版 907 //--------------------------------------------------------------------------- 908 bool ReadSound3DInfo( ItemId soundId, Sound3DInfo* info ) const; 909 910 //! @details :private 911 bool ReadWaveArchiveInfo( ItemId warcId, WaveArchiveInfo* info ) const; 912 913 //! @details :private 914 bool detail_ReadSoundGroupInfo( ItemId groupId, SoundGroupInfo* info ) const; 915 916 //! @details :private 917 bool detail_ReadGroupInfo( ItemId groupId, GroupInfo* info ) const; 918 919 //! @details :private 920 bool detail_ReadFileInfo( FileId fileId, FileInfo* info ) const; 921 922 //! @details :private 923 // TODO: bool detail_ReadGroupItemInfo( GroupId groupId, unsigned long index, GroupItemInfo* info ) const; 924 925 //! @details :private 926 // TODO: bool detail_ReadFilePos( FileId fileId, unsigned long index, FilePos* filePos ) const; 927 const internal::Util::Table<u32>* detail_GetWaveArchiveIdTable( ItemId id ) const; 928 929 // ファイルアクセス 930 //! @details :private 931 virtual const void* detail_GetFileAddress( FileId fileId ) const = 0; 932 //! @details :private 933 virtual size_t detail_GetRequiredStreamBufferSize() const = 0; 934 935 /* MEMO: NW4R では const がついていたが、CTR では nn::fs::FileReader を内部で使っているため 936 const をはずした */ 937 //! @details :private 938 io::FileStream* detail_OpenFileStream( FileId fileId, void* buffer, int size ); 939 #if 0 // たぶん不要 940 io::FileStream* detail_OpenFileWaveDataStream( FileId fileId, void* buffer, int size ) const; 941 io::FileStream* detail_OpenGroupStream( GroupId groupId, void* buffer, int size ) const; 942 io::FileStream* detail_OpenGroupWaveDataStream( GroupId groupId, void* buffer, int size ) const; 943 #endif 944 //@} 945 946 //---------------------------------------- 947 //! @name ファイルパス 948 //@{ 949 //--------------------------------------------------------------------------- 950 //! @brief 外部参照ファイルのルートディレクトリを設定します。 951 //! 952 //! サウンドアーカイブの外部参照ファイルのファイルパスが、 953 //! 相対パスで記述されている場合には、 954 //! この関数で設定したルートディレクトリからの相対パスとして解釈されます。 955 //! 956 //! 初期状態はルートディレクトリに設定されています。 957 //! 958 //! この関数は @ref nw::snd::RomSoundArchive::Open から呼び出されています。 959 //! 960 //! @param[in] extFileRoot ルートディレクトリに設定するディレクトリパスです。 961 //! 962 //! @see nw::snd::RomSoundArchive::Open 963 //! 964 //! @date 2010/01/29 初版 965 //--------------------------------------------------------------------------- 966 void SetExternalFileRoot( const char* extFileRoot ); 967 //@} 968 969 protected: 970 //! @details :private 971 static const int FILE_PATH_MAX = 256; 972 973 //! @details :private 974 void Initialize( internal::SoundArchiveFileReader* fileReader ); 975 976 //! @details :private 977 void Finalize(); 978 979 //! @details :private 980 virtual io::FileStream* OpenStream( 981 void* buffer, 982 int size, 983 u32 begin, 984 u32 length 985 ) = 0; 986 987 //! @details :private 988 virtual io::FileStream* OpenExtStream( 989 void* buffer, 990 int size, 991 const char* extFilePath, 992 // const wchar_t* extFilePath, 993 u32 begin, 994 u32 length 995 ) const = 0; 996 997 private: 998 io::FileStream* OpenExtStreamImpl( 999 void* buffer, 1000 int size, 1001 const char* extFilePath, 1002 // const wchar_t* extFilePath, 1003 u32 begin, 1004 u32 length 1005 ) const; 1006 1007 internal::SoundArchiveFileReader* m_pFileReader; 1008 char m_ExtFileRoot[ FILE_PATH_MAX ]; 1009 1010 // キャッシュ (頻繁にアクセスする) 1011 u32 m_FileBlockOffset; 1012 }; 1013 1014 } // namespace nw::snd 1015 } // namespace nw 1016 1017 1018 #endif /* NW_SND_SOUND_ARCHIVE_H_ */ 1019 1020