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