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