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