/*---------------------------------------------------------------------------* Project: NintendoWare File: snd_SoundDataManager.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 22506 $ *---------------------------------------------------------------------------*/ /** * :include nw/snd/snd_SoundDataManager.h * * @file snd_SoundDataManager.h */ #ifndef NW_SND_SOUND_DATA_MANAGER_H_ #define NW_SND_SOUND_DATA_MANAGER_H_ #include #include #include namespace nw { namespace snd { class SoundMemoryAllocatable; namespace internal { //! @details :private class SoundFileManager { public: virtual const void* GetFileAddress( SoundArchive::FileId fileId ) const = 0; virtual const void* GetFileWaveDataAddress( SoundArchive::FileId fileId ) const = 0; }; } // namespace nw::snd::internal //--------------------------------------------------------------------------- //! @brief サウンドアーカイブのデータをロードするためのクラスです。 //! //! @see SoundArchivePlayer クラス //! //! @date 2010/04/09 IsDataLoaded 関数を追加 //! @date 2010/02/01 「参照」に SoundArchivePlayer クラス追加 //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- class SoundDataManager : public internal::driver::DisposeCallback { public: //! @details :private static const u32 SIGNATURE_INDIVIDUAL_WAVE = NW_UT_MAKE_SIGWORD( 'C', 'I', 'W', 'V' ); //--------------------------------------------------------------------------- //! @brief ロードフラグです。 //! //! @ref LoadData の loadFlag に論理和を渡すと、関連するデータのうち、 //! ロードしたいデータのみロードすることができます。 //! //! @see LoadData //! //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- enum LoadFlag { // サウンド LOAD_SEQ = ( 1 << 0 ), //!< シーケンスサウンドをロードします LOAD_WSD = ( 1 << 1 ), //!< ウェーブサウンドをロードします // バンク LOAD_BANK = ( 1 << 2 ), //!< バンクをロードします // 波形アーカイブ LOAD_WARC = ( 1 << 3 ), //!< 波形アーカイブをロードします LOAD_ALL = 0xffffffff //!< 関連するファイルをすべてロードします }; //---------------------------------------- //! @name コンストラクタ / デストラクタ //@{ //--------------------------------------------------------------------------- //! @brief コンストラクタです。 //! //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- SoundDataManager(); //--------------------------------------------------------------------------- //! @brief デストラクタです。 //! //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- virtual ~SoundDataManager(); //@} //---------------------------------------- //! @name 初期化 //@{ //--------------------------------------------------------------------------- //! @brief 初期化に必要なメモリのサイズを取得します。 //! //! @param[in] arc このサウンドデータマネージャを登録するプレイヤーで //! 使用するサウンドアーカイブです。 //! //! @return 初期化に必要なメモリのサイズを返します。 //! //! @see Initialize //! @see SoundArchivePlayer::Initialize //! //! @date 2010/02/01 関数名変更 (Setup → Initialize) にともなう文言の調整 //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- size_t GetRequiredMemSize( const SoundArchive* arc ) const; //--------------------------------------------------------------------------- //! @brief サウンドデータマネージャの初期化を行います。 //! //! サウンドデータマネージャを使用する前に初期化を行う必要があります。 //! 初期化を行うことにより、 //! サウンドデータマネージャがサウンドアーカイブと関連付けられ、 //! サウンドアーカイブプレイヤーに登録することができます。 //! //! サウンドデータマネージャが必要とするメモリのサイズは //! @ref GetRequiredMemSize で取得することができます。 //! //! @param[in] arc このサウンドデータマネージャを登録するプレイヤーで //! 使用するサウンドアーカイブです。 //! @param[out] buffer バッファへのポインタです。 //! 4 バイトアライメントされている必要があります。 //! @param[in] size バッファサイズです。 //! //! @return 初期化に成功したら true を、失敗したら false を返します。 //! //! @see GetRequiredMemSize //! @see Finalize //! @see IsAvailable //! //! @date 2010/02/01 関数名変更 (Setup → Initialize) //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- bool Initialize( const SoundArchive* arc, void* buffer, u32 size ); //--------------------------------------------------------------------------- //! @brief サウンドデータマネージャが利用可能な状態かどうかを調べます。 //! //! サウンドデータマネージャを利用するためには @ref Initialize //! を呼び出して初期化を完了させる必要があります。 //! また、@ref Finalize を呼び出すと、 //! サウンドデータマネージャの終了処理が行われ、利用できない状態になります。 //! //! @return サウンドデータマネージャが利用可能な状態なら true を、 //! そうでなければ false を返します。 //! //! @see Initialize //! @see Finalize //! //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- bool IsAvailable() const; //--------------------------------------------------------------------------- //! @brief サウンドデータマネージャを破棄します。 //! //! @see Initialize //! @see IsAvailable //! //! @date 2010/02/01 関数名変更 (Shutdown → Finalize) //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- void Finalize(); //@} //---------------------------------------- //! @name ロード //@{ //--------------------------------------------------------------------------- //! @brief サウンドアーカイブ中のデータをロードします。 //! //! ロードに必要なメモリはアロケータ pAllocator から確保されます。 //! 十分なメモリが確保できない場合は false を返します。 //! //! この関数はサウンドデータの同期ロードを行います。 //! 非同期でサウンドデータをロードする場合は、 //! ロード用のスレッドでこの関数を呼び出してください。 //! 関連付けられているサウンドアーカイブや、 //! 引数で渡すサウンドヒープに対する操作をロード中に行わない限り、 //! この関数はスレッドセーフです。 //! //! @param[in] id ロードするデータのアイテム ID です。 //! @param[in] pAllocator ロードするメモリを確保するためのアロケータです。 //! @param[in] loadFlag 関連するデータをロードするためのフラグです。 //! @param[in] loadBlockSize データを分割ロードする際の分割サイズを、 //! バイト単位で指定します。 //! //! @return ロードに成功したら true を、失敗したら false を返します。 //! //! @see Initialize //! @see IsAvailable //! //! @date 2010/09/06 loadBlockSize 指定の対応にともない、引数の文言を調整 //! @date 2010/04/09 文言の修正 (グループ→サウンドデータ)、「参照」に IsDataLoaded 追加 //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- bool LoadData( SoundArchive::ItemId id, SoundMemoryAllocatable* pAllocator, u32 loadFlag = LOAD_ALL, // LoadFlag の論理和を渡す size_t loadBlockSize = 0 ); //--------------------------------------------------------------------------- //! @brief サウンドアーカイブ中のデータをロードします。 //! //! ロードに必要なメモリはアロケータ pAllocator から確保されます。 //! 十分なメモリが確保できない場合は false を返します。 //! //! この関数はサウンドデータの同期ロードを行います。 //! 非同期でサウンドデータをロードする場合は、 //! ロード用のスレッドでこの関数を呼び出してください。 //! 関連付けられているサウンドアーカイブや、 //! 引数で渡すサウンドヒープに対する操作をロード中に行わない限り、 //! この関数はスレッドセーフです。 //! //! @param[in] pItemName ロードするデータのラベル文字列です。 //! @param[in] pAllocator ロードするメモリを確保するためのアロケータです。 //! @param[in] loadFlag 関連するデータをロードするためのフラグです。 //! @param[in] loadBlockSize データを分割ロードする際の分割サイズを、 //! バイト単位で指定します。 //! //! @return ロードに成功したら true を、失敗したら false を返します。 //! //! @see Initialize //! @see IsAvailable //! @see IsDataLoaded //! //! @date 2010/09/06 loadBlockSize 指定の対応にともない、引数の文言を調整 //! @date 2010/04/09 文言の修正 (グループ→サウンドデータ)、「参照」に IsDataLoaded 追加 //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- bool LoadData( const char* pItemName, SoundMemoryAllocatable* pAllocator, u32 loadFlag = LOAD_ALL, // LoadFlag の論理和を渡す size_t loadBlockSize = 0 ); //--------------------------------------------------------------------------- //! @brief 指定したデータがロードされているか調べます。 //! //! loadFlag を利用することで、確認するデータを制限することができます。 //! デフォルトはすべての関連アイテムがロードされているかを確認します。 //! //! @param[in] itemId ロードされているか確認するサウンドデータのアイテム ID です。 //! @param[in] loadFlag 関連するデータを確認するかを示すフラグです。 //! //! @return ロードされていれば true を、されていなければ false を返します。 //! //! @see LoadData //! //! @date 2010/04/09 初版 //--------------------------------------------------------------------------- bool IsDataLoaded( SoundArchive::ItemId itemId, u32 loadFlag = LOAD_ALL ) const; //--------------------------------------------------------------------------- //! @brief 指定したデータがロードされているか調べます。 //! //! loadFlag を利用することで、確認するデータを制限することができます。 //! デフォルトはすべての関連アイテムがロードされているかを確認します。 //! //! @param[in] pItemName ロードされているか確認するデータのラベル文字列です。 //! @param[in] loadFlag 関連するデータを確認するかを示すフラグです。 //! //! @return ロードされていれば true を、されていなければ false を返します。 //! //! @see LoadData //! //! @date 2010/04/09 初版 //--------------------------------------------------------------------------- bool IsDataLoaded( const char* pItemName, u32 loadFlag = LOAD_ALL ) const; // TODO: u32 GetDataSize( SoundArchive::ItemId ) const; // TODO: u32 GetDataSize( const char* pItemName ) const; // TODO: itemId の型が int/unsinged int/long 版も必要? //@} //! @details :private void detail_SetFileManager( internal::SoundFileManager* fileManager ) { m_pFileManager = fileManager; } //! @details :private const void* SetFileAddress( SoundArchive::FileId fileId, const void* address ); //! @details :private const void* detail_GetFileAddress( SoundArchive::FileId fileId ) const; //! @details :private u32 detail_GetFileId( const void* address ) const; //! @details :private bool SetGroupItem( const void* pGroupFile, SoundMemoryAllocatable* pAllocator = NULL, size_t loadBlockSize = 0 ); // 外部ロードしたサウンドデータを破棄する直前に呼び、データ・インスタンスを無効化する //! @details :private void InvalidateSoundData( void* mem, size_t size ); protected: //! @details :private virtual void InvalidateData( const void* start, const void* end ); private: struct FileAddress { const void* address; }; typedef internal::Util::Table FileTable; //! @details :private bool LoadSequenceSound( SoundArchive::ItemId soundId, SoundMemoryAllocatable* pAllocator, u32 loadFlag, size_t loadBlockSize ); //! @details :private bool LoadWaveSound( SoundArchive::ItemId soundId, SoundMemoryAllocatable* pAllocator, u32 loadFlag, size_t loadBlockSize, SoundArchive::ItemId waveSoundSetId = SoundArchive::INVALID_ID ); //! @details :private bool LoadBank( SoundArchive::ItemId bankId, SoundMemoryAllocatable* pAllocator, u32 loadFlag, size_t loadBlockSize ); //! @details :private bool LoadWaveArchive( SoundArchive::ItemId warcId, SoundMemoryAllocatable* pAllocator, u32 loadFlag, size_t loadBlockSize ); //! @details :private const void* LoadWaveArchiveTable( SoundArchive::ItemId warcId, SoundMemoryAllocatable* pAllocator, size_t loadBlockSize ); //! @details :private bool LoadIndividualWave( SoundArchive::ItemId warcId, u32 waveIndex, SoundMemoryAllocatable* pAllocator, size_t loadBlockSize ); //! @details :private bool LoadGroup( SoundArchive::ItemId groupId, SoundMemoryAllocatable* pAllocator, size_t loadBlockSize ); //! @details :private bool LoadSoundGroup( SoundArchive::ItemId soundGroupId, SoundMemoryAllocatable* pAllocator, u32 loadFlag, size_t loadBlockSize ); //! @details :private const void* LoadImpl( SoundArchive::FileId fileId, SoundMemoryAllocatable* pAllocator, size_t loadBlockSize, bool needDeviceMemory = false ); //! @details :private bool LoadWaveArchiveImpl( SoundArchive::ItemId warcId, u32 waveIndex, SoundMemoryAllocatable* pAllocator, u32 loadFlag, size_t loadBlockSize ); //! @details :private bool IsSequenceSoundDataLoaded( SoundArchive::ItemId itemId, u32 loadFlag ) const; //! @details :private bool IsWaveSoundDataLoaded( SoundArchive::ItemId itemId, u32 loadFlag ) const; //! @details :private bool IsBankDataLoaded( SoundArchive::ItemId itemId, u32 loadFlag ) const; //! @details :private bool IsWaveArchiveDataLoaded( SoundArchive::ItemId itemId, u32 waveIndex ) const; //! @details :private bool IsGroupDataLoaded( SoundArchive::ItemId itemId ) const; //! @details :private bool IsSoundGroupDataLoaded( SoundArchive::ItemId itemId, u32 loadFlag ) const; //! @details :private const void* GetFileAddress( SoundArchive::FileId fileId ) const; //! @details :private bool CreateFileAddressTable( const SoundArchive* arc, void** buffer, void* endp ); private: FileTable* m_pFileTable; const SoundArchive* m_pSoundArchive; internal::SoundFileManager* m_pFileManager; }; } // namespace nw::snd } // namespace nw #endif /* NW_SND_SOUND_DATA_MANAGER_H_ */