1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_MemorySoundArchive.cpp
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 #include "precompiled.h"
17 
18 #include <nw/snd/snd_MemorySoundArchive.h>
19 
20 namespace nw {
21 namespace snd {
22 
23 /*---------------------------------------------------------------------------*
24   Name:         MemorySoundArchive
25 
26   Description:  コンストラクタ
27 
28   Arguments:    None.
29 
30   Returns:      None.
31  *---------------------------------------------------------------------------*/
MemorySoundArchive()32 MemorySoundArchive::MemorySoundArchive()
33 : m_pData( NULL )
34 {
35 }
36 
37 /*---------------------------------------------------------------------------*
38   Name:         ~MemorySoundArchive
39 
40   Description:  デストラクタ
41 
42   Arguments:    None.
43 
44   Returns:      None.
45  *---------------------------------------------------------------------------*/
~MemorySoundArchive()46 MemorySoundArchive::~MemorySoundArchive()
47 {
48 }
49 
50 /*---------------------------------------------------------------------------*
51   Name:         Initialize
52 
53   Description:  サウンドアーカイブを初期化する
54 
55   Arguments:    soundArchiveData - サウンドアーカイブデータ
56 
57   Returns:      成功したかどうか
58  *---------------------------------------------------------------------------*/
Initialize(const void * soundArchiveData)59 bool MemorySoundArchive::Initialize( const void* soundArchiveData )
60 {
61     NW_NULL_ASSERT( soundArchiveData );
62     NW_ALIGN4_ASSERT( soundArchiveData );
63 
64     m_FileReader.Initialize( soundArchiveData );
65     SoundArchive::Initialize( &m_FileReader );
66 
67     const unsigned long infoBlockOffset = m_FileReader.GetInfoBlockOffset();
68     const unsigned long infoBlockSize = m_FileReader.GetInfoBlockSize();
69 
70     m_FileReader.SetInfoBlock(
71         ut::AddOffsetToPtr( soundArchiveData, infoBlockOffset )
72     );
73 
74     const unsigned long stringBlockOffset = m_FileReader.GetStringBlockOffset();
75     const unsigned long stringBlockSize = m_FileReader.GetStringBlockSize();
76 
77     // 文字列ブロックへのリファレンスは必ず含まれるが、
78     // ブロック自体が含まれない場合、stringBlockOffset/stringBlockSize の両方共、
79     // 0xffffffff が入っている。
80     if ( stringBlockOffset == 0xffffffff || stringBlockSize == 0xffffffff )
81     {
82         // なにもしない
83     }
84     else
85     {
86         m_FileReader.SetStringBlock(
87                 ut::AddOffsetToPtr( soundArchiveData, stringBlockOffset ));
88     }
89 
90     m_pData = soundArchiveData;
91 
92     return true;
93 }
94 
95 /*---------------------------------------------------------------------------*
96   Name:         Finalize
97 
98   Description:  サウンドアーカイブを閉じる
99 
100   Arguments:    None.
101 
102   Returns:      None.
103  *---------------------------------------------------------------------------*/
Finalize()104 void MemorySoundArchive::Finalize()
105 {
106     m_pData = NULL;
107     m_FileReader.Finalize();
108     SoundArchive::Finalize();
109 }
110 
detail_GetFileAddress(FileId fileId) const111 const void* MemorySoundArchive::detail_GetFileAddress( FileId fileId ) const
112 {
113 #if 0
114     // ファイル位置情報取得
115     FilePos filePos;
116     if ( ! detail_ReadFilePos( fileId, 0, &filePos ) )
117     {
118         return NULL;
119     }
120 
121     // グループ情報取得
122     GroupInfo groupInfo;
123     if ( ! detail_ReadGroupInfo( filePos.groupId, &groupInfo ) )
124     {
125         return NULL;
126     }
127     GroupItemInfo itemInfo;
128     if ( ! detail_ReadGroupItemInfo( filePos.groupId, filePos.index, &itemInfo ) )
129     {
130         return NULL;
131     }
132     if ( groupInfo.extFilePath != NULL )
133     {
134         // 外部参照グループ
135         return NULL;
136     }
137 
138     const u32 itemOffset = groupInfo.offset + itemInfo.offset;
139 
140     return ut::AddOffsetToPtr( m_pData, itemOffset );
141 #else
142     FileInfo fileInfo;
143     if ( ! detail_ReadFileInfo( fileId, &fileInfo ) )
144     {
145         return NULL;
146     }
147 
148     // 外部参照ファイルは対応しない (?)
149 
150     return ut::AddOffsetToPtr( m_pData,
151             fileInfo.offsetFromFileBlockHead +
152             m_FileReader.GetFileBlockOffset() );
153 #endif
154 }
155 
OpenStream(void * buffer,int size,u32 begin,u32 length)156 io::FileStream* MemorySoundArchive::OpenStream( void* buffer, int size, u32 begin, u32 length )
157 {
158     if ( m_pData == NULL ) return NULL;
159     if ( size < sizeof( MemoryFileStream ) ) return NULL;
160     MemoryFileStream* stream = new( buffer ) MemoryFileStream(
161         ut::AddOffsetToPtr( m_pData, begin ), length );
162     return stream;
163 }
164 
OpenExtStream(void * buffer,int size,const char * extFilePath,u32 begin,u32 length) const165 io::FileStream* MemorySoundArchive::OpenExtStream(
166         void* buffer,
167         int size,
168         const char* extFilePath,
169         // const wchar_t* extFilePath,
170         u32 begin,
171         u32 length ) const
172 {
173     (void)buffer;
174     (void)size;
175     (void)extFilePath;
176     (void)begin;
177     (void)length;
178 
179     NW_WARNING( false, "Cannot OpenExtStream for MemorySoundArchive\n");
180 
181     return NULL;
182 }
183 
detail_GetRequiredStreamBufferSize() const184 size_t MemorySoundArchive::detail_GetRequiredStreamBufferSize() const
185 {
186     return sizeof( MemoryFileStream );
187 }
188 
MemoryFileStream(const void * buffer,u32 size)189 MemorySoundArchive::MemoryFileStream::MemoryFileStream( const void* buffer, u32 size )
190 : m_pBuffer( buffer ),
191   m_Size( size ),
192   m_Position( 0 )
193 {
194 }
195 
Close()196 void MemorySoundArchive::MemoryFileStream::Close()
197 {
198     m_pBuffer = NULL;
199     m_Size = 0;
200     m_Position = 0;
201 }
202 
Read(void * buf,u32 length)203 s32 MemorySoundArchive::MemoryFileStream::Read( void* buf, u32 length )
204 {
205     u32 readLen = ut::Min( length, m_Size - m_Position );
206     std::memcpy( buf, ut::AddOffsetToPtr( m_pBuffer, m_Position ), readLen );
207     return static_cast<s32>(readLen);
208 }
209 
Seek(s32 offset,u32 origin)210 void MemorySoundArchive::MemoryFileStream::Seek( s32 offset, u32 origin )
211 {
212     switch( origin ) {
213     case io::FILE_STREAM_SEEK_BEGIN:
214         m_Position = static_cast<u32>(offset);
215         break;
216 
217     case io::FILE_STREAM_SEEK_CURRENT:
218         m_Position += offset;
219         break;
220 
221     case io::FILE_STREAM_SEEK_END:
222         m_Position = m_Size - offset;
223         break;
224 
225     default:
226         NW_ASSERTMSG( false, "Unsupported Seek origin" );
227         return;
228     }
229 }
230 
231 } // namespace nw::snd
232 } // namespace nw
233 
234