1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: snd_StreamSoundFileLoader.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: 13145 $
14 *---------------------------------------------------------------------------*/
15
16 #include "precompiled.h"
17
18 #include <nw/snd/snd_StreamSoundFileLoader.h>
19
20 namespace nw {
21 namespace snd {
22 namespace internal {
23
24 /* ========================================================================
25 StreamSoundFileLoader
26 ======================================================================== */
27
28 /*---------------------------------------------------------------------------*
29 Name: LoadFileHeader
30
31 Description: ストリームデータのファイルヘッダとHEADブロックをロードし、
32 StreamSoundFileReaderに渡す
33
34 Arguments: buffer - ロードに使用するバッファ
35 size - バッファサイズ
36
37 Returns: AdpcmInfo構造体
38 *---------------------------------------------------------------------------*/
LoadFileHeader(void * buffer,unsigned long size)39 bool StreamSoundFileLoader::LoadFileHeader( void* buffer, unsigned long size )
40 {
41 const size_t headerSize = NW_SND_ROUND_UP_32B( sizeof( StreamSoundFile::FileHeader ) );
42 u8 buffer2[ headerSize+32 ];
43 // RVL_SDK の DVDRead( DVDFileInfo*, void* addr, s32 len, s32 ofs ); の制限は、
44 // 「addr = 32 バイト境界, len = 32 バイトの倍数, ofs = 4 バイトの倍数」
45
46 // ファイルヘッダロード
47 m_Stream.Seek( 0, io::FILE_STREAM_SEEK_BEGIN );
48 s32 readSize = m_Stream.Read( ut::RoundUp( buffer2, 32 ), headerSize );
49 if ( readSize != headerSize )
50 {
51 return false;
52 }
53
54 StreamSoundFile::FileHeader* header =
55 reinterpret_cast<StreamSoundFile::FileHeader*>( ut::RoundUp( buffer2, 32 ) );
56
57 StreamSoundFileReader reader;
58 if ( ! reader.IsValidFileHeader( header ) )
59 {
60 return false;
61 }
62
63 // バッファサイズがファイルヘッダーと INFO ブロックをロードできるサイズかチェック
64 // (必ず、ヘッダーと INFO ブロックが並んで格納されているものとする)
65 u32 loadSize = header->GetInfoBlockOffset() + header->GetInfoBlockSize();
66 if ( loadSize > size )
67 {
68 return false;
69 }
70
71 // ファイルヘッダーと INFO ブロックをロード
72 m_Stream.Seek( 0, io::FILE_STREAM_SEEK_BEGIN );
73 readSize = m_Stream.Read( buffer, loadSize );
74 if ( readSize != loadSize )
75 {
76 return false;
77 }
78
79 m_Reader.Initialize( buffer );
80
81 return true;
82 }
83
84 /*---------------------------------------------------------------------------*
85 Name: GetTrackCount
86
87 Description: トラック数取得
88
89 Arguments: なし
90
91 Returns: トラック数
92 *---------------------------------------------------------------------------*/
GetTrackCount() const93 u32 StreamSoundFileLoader::GetTrackCount() const
94 {
95 if ( ! m_Reader.IsAvailable() ) return 0;
96 return m_Reader.GetTrackCount();
97 }
98
99 /*---------------------------------------------------------------------------*
100 Name: GetChannelCount
101
102 Description: チャンネル数取得
103
104 Arguments: なし
105
106 Returns: チャンネル数
107 *---------------------------------------------------------------------------*/
GetChannelCount() const108 u32 StreamSoundFileLoader::GetChannelCount() const
109 {
110 if ( ! m_Reader.IsAvailable() ) return 0;
111 return m_Reader.GetChannelCount();
112 }
113
114 /*---------------------------------------------------------------------------*
115 Name: ReadStrmInfo
116
117 Description:
118
119 Arguments: strmInfo -
120
121 Returns:
122 *---------------------------------------------------------------------------*/
ReadStreamInfo(StreamSoundFile::StreamSoundInfo * strmInfo) const123 bool StreamSoundFileLoader::ReadStreamInfo( StreamSoundFile::StreamSoundInfo* strmInfo ) const
124 {
125 if ( ! m_Reader.IsAvailable() ) return false;
126 m_Reader.ReadStreamSoundInfo( strmInfo );
127 return true;
128 }
129
130 /*---------------------------------------------------------------------------*
131 Name: ReadStrmTrackInfo
132
133 Description:
134
135 Arguments: trackInfo -
136 trackIndex -
137
138 Returns:
139 *---------------------------------------------------------------------------*/
ReadStreamTrackInfo(StreamSoundFileReader::TrackInfo * trackInfo,int trackIndex) const140 bool StreamSoundFileLoader::ReadStreamTrackInfo( StreamSoundFileReader::TrackInfo* trackInfo, int trackIndex ) const
141 {
142 if ( ! m_Reader.IsAvailable() ) return false;
143 m_Reader.ReadStreamTrackInfo( trackInfo, trackIndex );
144 return true;
145 }
146
147 /*---------------------------------------------------------------------------*
148 Name: ReadDspAdpcmChannelInfo
149
150 Description:
151
152 Arguments: adpcmInfo -
153 channelIndex -
154
155 Returns:
156 *---------------------------------------------------------------------------*/
ReadDspAdpcmChannelInfo(DspAdpcmParam * adpcmParam,DspAdpcmLoopParam * adpcmLoopParam,int channelIndex) const157 bool StreamSoundFileLoader::ReadDspAdpcmChannelInfo(
158 DspAdpcmParam* adpcmParam,
159 DspAdpcmLoopParam* adpcmLoopParam,
160 int channelIndex
161 ) const
162 {
163 if ( ! m_Reader.IsAvailable() ) return false;
164 m_Reader.ReadDspAdpcmChannelInfo( adpcmParam, adpcmLoopParam, channelIndex );
165 return true;
166 }
167
168 /*---------------------------------------------------------------------------*
169 Name: ReadAdpcBlockData
170
171 Description: ADPCブロックの指定されたデータを読み取る
172
173 Arguments: yn1, yn2 - 読み取ったデータを格納する配列
174 blockIndex - 読み取るデータのブロック番号
175 channelCount - チャンネル数(yn1,yn2の配列サイズ)
176
177 Returns: 読み取れたら true, 読み取れなかったら false
178 *---------------------------------------------------------------------------*/
ReadAdpcBlockData(u16 * yn1,u16 * yn2,int blockIndex,int channelCount)179 bool StreamSoundFileLoader::ReadAdpcBlockData( u16* yn1, u16* yn2, int blockIndex, int channelCount )
180 {
181 if ( ! m_Reader.IsAvailable() ) return false;
182
183 s32 readOffset = static_cast<s32>(
184 m_Reader.GetSeekBlockOffset() +
185 sizeof(ut::BinaryBlockHeader) +
186 sizeof(s16) * 2 * channelCount * blockIndex
187 );
188 m_Stream.Seek( readOffset, io::FILE_STREAM_SEEK_BEGIN );
189
190 // TODO: 以下は8チャンネル以上で動作できないコードなのでASSERT
191 u32 readDataSize = sizeof(s16) * 2 * channelCount;
192 NW_ASSERT( readDataSize <= 32 );
193
194 // DVDは32Byte単位でしかReadできないので32Byte読んでしまう
195 NN_ATTRIBUTE_ALIGN(32) static u16 buffer[16];
196 int readSize = m_Stream.Read( buffer, sizeof( buffer ) );
197 if ( readSize != sizeof(buffer) ) return false;
198
199 for ( int i=0; i< channelCount; i++ )
200 {
201 yn1[i] = buffer[i*2];
202 yn2[i] = buffer[i*2+1];
203 }
204
205 return true;
206 }
207
208 } // namespace nw::snd::internal
209 } // namespace nw::snd
210 } // namespace nw
211
212