1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SoundDataManager.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: 29444 $
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * :include nw/snd/snd_SoundDataManager.h
18  *
19  * @file snd_SoundDataManager.h
20  */
21 
22 #ifndef NW_SND_SOUND_DATA_MANAGER_H_
23 #define NW_SND_SOUND_DATA_MANAGER_H_
24 
25 #include <nw/snd/snd_DisposeCallback.h>
26 #include <nw/snd/snd_SoundArchive.h>
27 #include <nw/snd/snd_SoundArchiveLoader.h>
28 #include <nw/snd/snd_Util.h>
29 
30 namespace nw {
31 namespace snd {
32 
33 class SoundMemoryAllocatable;
34 
35 namespace internal
36 {
37 
38 //! @details :private
39 class SoundFileManager
40 {
41 public:
42     virtual const void* GetFileAddress( SoundArchive::FileId fileId ) const = 0;
43     virtual const void* GetFileWaveDataAddress( SoundArchive::FileId fileId ) const = 0;
44 };
45 
46 } // namespace nw::snd::internal
47 
48 //---------------------------------------------------------------------------
49 //! @brief    サウンドアーカイブのデータをロードするためのクラスです。
50 //!
51 //! @see SoundArchivePlayer クラス
52 //!
53 //! @date 2010/12/28 NW4C-1.3.0 にて全体的にリファレンスがおかしかったのを修正
54 //! @date 2010/11/12 SetFileAddress 関数を追加
55 //! @date 2010/04/09 IsDataLoaded 関数を追加
56 //! @date 2010/02/01 「参照」に SoundArchivePlayer クラス追加
57 //! @date 2010/01/15 初版
58 //---------------------------------------------------------------------------
59 class SoundDataManager : public internal::driver::DisposeCallback,
60                          public internal::SoundArchiveLoader
61 {
62 public:
63 
64     //! @name コンストラクタ / デストラクタ
65     //@{
66     //---------------------------------------------------------------------------
67     //! @brief    コンストラクタです。
68     //!
69     //! @date 2010/01/15 初版
70     //---------------------------------------------------------------------------
71     SoundDataManager();
72 
73     //---------------------------------------------------------------------------
74     //! @brief    デストラクタです。
75     //!
76     //! @date 2010/01/15 初版
77     //---------------------------------------------------------------------------
78     virtual ~SoundDataManager();
79     //@}
80 
81     //----------------------------------------
82     //! @name 初期化
83     //@{
84     //---------------------------------------------------------------------------
85     //! @brief    初期化に必要なメモリのサイズを取得します。
86     //!
87     //! @param[in]    arc     このサウンドデータマネージャを登録するプレイヤーで
88     //!                       使用するサウンドアーカイブです。
89     //!
90     //! @return   初期化に必要なメモリのサイズを返します。
91     //!
92     //! @see Initialize
93     //!
94     //! @date 参照から SoundArchivePlayer::Initialize を削除
95     //! @date 2010/02/01 関数名変更 (Setup → Initialize) にともなう文言の調整
96     //! @date 2010/01/15 初版
97     //---------------------------------------------------------------------------
98     size_t GetRequiredMemSize( const SoundArchive* arc ) const;
99 
100     //---------------------------------------------------------------------------
101     //! @brief    サウンドデータマネージャの初期化を行います。
102     //!
103     //!           サウンドデータマネージャを使用する前に初期化を行う必要があります。
104     //!           初期化を行うことにより、
105     //!           サウンドデータマネージャがサウンドアーカイブと関連付けられ、
106     //!           サウンドアーカイブプレイヤーに登録することができます。
107     //!
108     //!           サウンドデータマネージャが必要とするメモリのサイズは
109     //!           @ref GetRequiredMemSize で取得することができます。
110     //!
111     //! @param[in]    arc     このサウンドデータマネージャを登録するプレイヤーで
112     //!                       使用するサウンドアーカイブです。
113     //! @param[out]   buffer  バッファへのポインタです。
114     //!                       4 バイトアライメントされている必要があります。
115     //! @param[in]    size    バッファサイズです。
116     //!
117     //! @return   初期化に成功したら true を、失敗したら false を返します。
118     //!
119     //! @see GetRequiredMemSize
120     //! @see Finalize
121     //!
122     //! @date 2010/02/01 関数名変更 (Setup → Initialize)
123     //! @date 2010/01/15 初版
124     //---------------------------------------------------------------------------
125     bool Initialize( const SoundArchive* arc, void* buffer, u32 size );
126 
127     //---------------------------------------------------------------------------
128     //! @brief    サウンドデータマネージャを破棄します。
129     //!
130     //! @see Initialize
131     //!
132     //! @date 2010/02/01 関数名変更 (Shutdown → Finalize)
133     //! @date 2010/01/15 初版
134     //---------------------------------------------------------------------------
135     void Finalize();
136     //@}
137 
138     //----------------------------------------
139     //! @name ロード
140     //@{
141     //! @details :private
detail_SetFileManager(internal::SoundFileManager * fileManager)142     void detail_SetFileManager( internal::SoundFileManager* fileManager )
143     {
144         m_pFileManager = fileManager;
145     }
146 
147     //---------------------------------------------------------------------------
148     //! @brief  独自にロードしたデータを、ファイル管理テーブルに登録します。
149     //!
150     //!         あらかじめ別のアドレスが登録されている場合は、
151     //!         上書きされます。
152     //!
153     //!         引数として渡すファイル ID は、
154     //!         @ref SoundArchive::GetItemFileId 関数で、
155     //!         アイテム ID から変換することができます。
156     //!
157     //!         ファイル管理テーブルに登録することによって、
158     //!         当該データを使ったサウンド再生が可能になります。
159     //!         詳しくは demos/snd/externalFile デモ、
160     //!         および当該デモのドキュメントをご覧ください。
161     //!
162     //! @param[in] fileId   セットするデータのファイル ID です。
163     //! @param[in] address  関連するデータを確認するかを示すフラグです。
164     //!
165     //! @return   あらかじめ登録されていたアドレスを返します。
166     //!
167     //! @see SoundArchive::GetItemFileId
168     //!
169     //! @date 2010/12/28 fileId 引数の説明を修正
170     //! @date 2010/12/17 SoundArchive::GetItemFileId 関数との関係を追記
171     //! @date 2010/11/12 初版
172     //---------------------------------------------------------------------------
173     const void* SetFileAddress( SoundArchive::FileId fileId, const void* address );
174     //@}
175 
176     //! @details :private
177     const void* detail_GetFileAddress( SoundArchive::FileId fileId ) const;
178 
179     //! @details :private
180     u32 detail_GetFileIdFromTable( const void* address ) const;
181 
182 
183     // 外部ロードしたサウンドデータを破棄する直前に呼び、データ・インスタンスを無効化する
184     //! @details :private
185     // void InvalidateSoundData( void* mem, size_t size );
186 
187 protected:
188     //! @details :private
189     virtual void InvalidateData( const void* start, const void* end );
190 
191     //! @details :private
192     virtual const void* SetFileAddressToTable(
193             SoundArchive::FileId fileId, const void* address );
194     //! @details :private
195     virtual const void* GetFileAddressFromTable( SoundArchive::FileId fileId ) const;
196 
197     //! @details :private
198     virtual const void* GetFileAddressImpl( SoundArchive::FileId fileId ) const;
199         // テーブルを含め、アクセス可能な箇所にデータが読み込まれているかを確認する
200 
201 private:
202     struct FileAddress
203     {
204         const void* address;
205     };
206 
207     typedef internal::Util::Table<FileAddress> FileTable;
208 
209     // const void* GetFileAddress( SoundArchive::FileId fileId ) const;
210     //! @details :private
211     bool CreateFileAddressTable( const SoundArchive* arc, void** buffer, void* endp );
212 
213     //! @details :private
214     FileTable* m_pFileTable;
215 
216     //! @details :private
217     internal::SoundFileManager* m_pFileManager;
218 };
219 
220 } // namespace nw::snd
221 } // namespace nw
222 
223 
224 #endif /* NW_SND_SOUND_DATA_MANAGER_H_ */
225 
226