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