1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_MemorySoundArchive.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:$
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * :include nw/snd/snd_MemorySoundArchive.h
18  *
19  * @file snd_MemorySoundArchive.h
20  */
21 
22 #ifndef NW_SND_MEMORY_SOUND_ARCHIVE_H_
23 #define NW_SND_MEMORY_SOUND_ARCHIVE_H_
24 
25 #include <nw/snd/snd_SoundArchiveFileReader.h>
26 #include <nw/io/io_FileStream.h>
27 
28 namespace nw {
29 namespace snd {
30 
31 //---------------------------------------------------------------------------
32 //! @brief        メモリ上にあるサウンドアーカイブを扱うクラスです。
33 //!
34 //!               MemorySoundArchive クラスでは、
35 //!               サウンドアーカイブから外部参照されているデータを扱うことができません。
36 //!               外部参照データの再生は必ず失敗します。
37 //!
38 //!               サウンドアーカイブ内に波形データ (波形アーカイブ) が含まれている場合、
39 //!               そのサウンドアーカイブはデバイスメモリ上にロードしておく必要があります。
40 //!
41 //! @date 2010/04/30 サウンドアーカイブをデバイスメモリ上にロードしておく必要がある旨、追記
42 //! @date 2010/01/15 初版
43 //---------------------------------------------------------------------------
44 class MemorySoundArchive : public SoundArchive
45 {
46   private:
47     class MemoryFileStream;
48 
49   public:
50     //----------------------------------------
51     //! @name コンストラクタ / デストラクタ
52     //@{
53     //! コンストラクタです。
54     MemorySoundArchive();
55     //! デストラクタです。
56     virtual ~MemorySoundArchive();
57     //@}
58 
59     //----------------------------------------
60     //! @name セットアップ
61     //@{
62 
63     //---------------------------------------------------------------------------
64     //! @brief    メモリ上のサウンドアーカイブデータを初期化します。
65     //!
66     //!           サウンドアーカイブ内に波形データ (波形アーカイブ) が含まれている場合、
67     //!           そのサウンドアーカイブはデバイスメモリ上にロードしておく必要があります。
68     //!
69     //! @param[in]    soundArchiveData    サウンドアーカイブデータのアドレス。
70     //!
71     //! @see Finalize
72     //!
73     //! @date 2010/04/30 サウンドアーカイブをデバイスメモリ上にロードしておく必要がある旨、追記
74     //! @date 2010/02/01 関数名変更 (Setup → Initialize)
75     //! @date 2010/01/15 初版
76     //---------------------------------------------------------------------------
77     bool Initialize( const void* soundArchiveData );
78 
79     //---------------------------------------------------------------------------
80     //! @brief    メモリ上のサウンドアーカイブデータを破棄します。
81     //!
82     //! @see Initialize
83     //!
84     //! @date 2010/02/01 関数名変更 (Shutdown → Finalize)
85     //! @date 2010/01/15 初版
86     //---------------------------------------------------------------------------
87     void Finalize();
88     //@}
89 
90     //! @details :private
91     virtual size_t detail_GetRequiredStreamBufferSize() const;
92 
93     //! @details :private
94     virtual const void* detail_GetFileAddress( FileId fileId ) const;
95 
96   protected:
97 
98     //! @details :private
99     virtual io::FileStream* OpenStream( void* buffer, int size, u32 begin, u32 length );
100 
101     //! @details :private
102     virtual io::FileStream* OpenExtStream(
103             void* buffer,
104             int size,
105             const char* extFilePath,
106             // const wchar_t* extFilePath,
107             u32 begin,
108             u32 length ) const;
109 
110   private:
111     const void* m_pData;
112     internal::SoundArchiveFileReader m_FileReader;
113 };
114 
115 //! @details :private
116 class MemorySoundArchive::MemoryFileStream : public io::FileStream
117 {
118   public:
119     MemoryFileStream( const void* buffer, u32 size );
120 
CanSeek()121     virtual bool CanSeek() const { return true; }
CanCancel()122     virtual bool CanCancel() const { return true; }
CanAsync()123     virtual bool CanAsync() const { return false; }
CanRead()124     virtual bool CanRead() const { return true; }
CanWrite()125     virtual bool CanWrite() const { return false; }
126 
127     virtual void Close();
128     virtual s32  Read( void* buf, u32 length );
129     virtual void Seek( s32 offset, u32 origin );
Tell()130     virtual u32  Tell()    const { return m_Position; }
GetSize()131     virtual u32  GetSize() const { return m_Size; }
132 
133   private:
134     const void* m_pBuffer;
135     u32 m_Size;
136     u32 m_Position;
137 };
138 
139 } // namespace nw::snd
140 } // namespace nw
141 
142 
143 #endif /* NW_SND_MEMORY_SOUND_ARCHIVE_H_ */
144 
145