1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_Global.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: 25184 $
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * :include nw/snd/snd_Global.h
18  *
19  * @file snd_Global.h
20  */
21 
22 #ifndef NW_SND_GLOBAL_H_
23 #define NW_SND_GLOBAL_H_
24 
25 #include <nn/snd.h>
26 #include <nw/config.h>  // for NW_PLATFORM_***
27 #include <nw/ut/ut_ResTypes.h>
28 
29 #include <nn/version.h>
30 
31 
32 namespace nw {
33 namespace snd {
34 
35 
36 /* ========================================================================
37         sndライブラリ共通のグローバル定義
38    ======================================================================== */
39 
40 //---------------------------------------------------------------------------
41 //! @brief    サウンドフレーム処理から呼ばれるユーザーコールバック関数の型定義です。
42 //!
43 //!           @ref SoundSystem::SetSoundFrameUserCallback で登録することができます。
44 //!
45 //! @param[in] arg    コールバック関数のユーザー引数です。
46 //!
47 //! @see SoundSystem::SetSoundFrameUserCallback
48 //!
49 //! @date 2010/06/14 初版
50 //---------------------------------------------------------------------------
51 typedef void(*SoundFrameUserCallback)( uptr arg );
52 
53 //---------------------------------------------------------------------------
54 //! @brief    サウンドの出力モードの定義です。
55 //!
56 //! @see      SoundSystem::SetOutputMode
57 //! @see      SoundSystem::GetOutputMode
58 //!
59 //! @date 2010/06/16 OUTPUT_MODE_NUM を追加
60 //! @date 2010/06/14 サラウンドモードを追加
61 //! @date 2010/01/15 初版
62 //---------------------------------------------------------------------------
63 enum OutputMode
64 {
65     OUTPUT_MODE_MONO,       //!< モノラルモードです。パンは効果がありません。
66     OUTPUT_MODE_STEREO,     //!< ステレオモードです。
67     OUTPUT_MODE_SURROUND,   //!< サラウンドモードです。
68     OUTPUT_MODE_NUM         //!< 出力モードの総数です。
69 };
70 
71 // ------------------------------------------------------------------------
72 // エフェクトバス
73 
74 //---------------------------------------------------------------------------
75 //! @brief    AUX バス ID の定義です。
76 //!
77 //!           AUX バスはバス A とバス B が存在します。
78 //!
79 //! @see SoundSystem::AppendEffect
80 //! @see SoundHandle::SetFxSend
81 //! @see SequenceSoundHandle::SetFxSend
82 //! @see StreamSoundHandle::SetFxSend
83 //! @see WaveSoundHandle::SetFxSend
84 //!
85 //! @date 2010/06/16 初版
86 //---------------------------------------------------------------------------
87 enum AuxBus
88 {
89     AUX_BUS_A   = nn::snd::AUX_BUS_A,   //!< AUX バス A です。
90     AUX_BUS_B   = nn::snd::AUX_BUS_B,   //!< AUX バス B です。
91     AUX_BUS_NUM = nn::snd::AUX_BUS_NUM  //!< AUX バスの本数です。
92 };
93 
94 // ------------------------------------------------------------------------
95 // サンプルフォーマット
96 
97 //---------------------------------------------------------------------------
98 //! @brief    サンプルフォーマットです。
99 //!
100 //!           @ref FxBase::UpdateBuffer では、
101 //!           つねに SAMPLE_FORMAT_PCM_S32 が入ります。
102 //!
103 //! @see FxBase::UpdateBuffer
104 //!
105 //! @date 2010/06/17 初版
106 //---------------------------------------------------------------------------
107 enum SampleFormat
108 {
109     SAMPLE_FORMAT_PCM_S8,    //!< signed 8bit です。
110     SAMPLE_FORMAT_PCM_S16,   //!< signed 16bit です。
111     SAMPLE_FORMAT_PCM_S32,   //!< signed 32bit です。
112     SAMPLE_FORMAT_DSP_ADPCM, //!< DSP ADPCM です。
113     SAMPLE_FORMAT_IMA_ADPCM  //!< IMA ADPCM です。
114 };
115 
116 // ------------------------------------------------------------------------
117 // シーケンスミュート
118 
119 //---------------------------------------------------------------------------
120 //! @brief    シーケンストラックのミュート、及びミュート解除の定義です。
121 //!
122 //! @see SequenceSoundHandle::SetTrackMute
123 //!
124 //! @date 2010/01/25 初版
125 //---------------------------------------------------------------------------
126 enum SeqMute
127 {
128     //---------------------------------------------------------------------------
129     //! @brief    ミュート状態を解除します。
130     //---------------------------------------------------------------------------
131     SEQ_MUTE_OFF,
132 
133     //---------------------------------------------------------------------------
134     //! @brief    シーケンストラックをミュート状態にします。
135     //!           そのトラックで発音中の音は変化しません。
136     //---------------------------------------------------------------------------
137     SEQ_MUTE_NO_STOP,
138 
139     //---------------------------------------------------------------------------
140     //! @brief    シーケンストラックをミュート状態にします。
141     //!           同時に、そのトラックで発音中の音をエンベロープのリリースを発音してから、
142     //!           緩やかに停止させます。
143     //---------------------------------------------------------------------------
144     SEQ_MUTE_RELEASE,
145 
146     //---------------------------------------------------------------------------
147     //! @brief    シーケンストラックをミュート状態にします。
148     //!           同時に、そのトラックで発音中の音を直ちに停止します。
149     //---------------------------------------------------------------------------
150     SEQ_MUTE_STOP
151 };
152 
153 
154 // ------------------------------------------------------------------------
155 // 波形データ
156 // 2ch [ステレオ] 波形までサポートします。
157 //! @details :private
158 static const int WAVE_CHANNEL_MAX = 2;
159 
160 // ------------------------------------------------------------------------
161 // ステレオ時のパン動作モード
162 //! @details :private
163 static const int PAN_MODE_NUM = 2;
164 
165 //---------------------------------------------------------------------------
166 //! @brief    パンの動作モードの定義です。
167 //!
168 //! @see      SoundArchive::SoundInfo
169 //!
170 //! @date 2010/01/15 初版
171 //---------------------------------------------------------------------------
172 enum PanMode
173 {
174     PAN_MODE_DUAL,      //!< ステレオを2本のモノラルとしてそれぞれに定位処理を行います。
175     PAN_MODE_BALANCE,   //!< 左右チャンネルの音量バランスを処理します。
176     PAN_MODE_INVALID    //!< 不正な種類のパンモードです。
177 };
178 
179 // ------------------------------------------------------------------------
180 // パン計算の曲線
181 
182 //! @details :private
183 static const int PAN_CURVE_NUM = 9;
184 
185 //---------------------------------------------------------------------------
186 //! @brief    パンカーブの定義です。
187 //!
188 //!           パンのカーブは以下の項目の組み合わせで定義されています。
189 //!
190 //!           ・曲線の種類(平方根、三角関数、線形)@n
191 //!           ・曲線のスケール(パンが中央のときに 0dB とするか、
192 //!           パンが両端に振るられたときに 0dB とするか)@n
193 //!           ・パンの曲線が 0dB を超えたときに、 0dB にクランプするかどうか
194 //!
195 //! @see      SoundArchive::SoundInfo
196 //!
197 //! @date 2010/01/15 初版
198 //---------------------------------------------------------------------------
199 enum PanCurve
200 {
201     PAN_CURVE_SQRT,             //!< 平方根のカーブ。中央で-3dB、両端に振り切ると0dBとなります。
202     PAN_CURVE_SQRT_0DB,         //!< 平方根のカーブ。中央で0dB、両端に振り切ると+3dBとなります。
203     PAN_CURVE_SQRT_0DB_CLAMP,   //!< 平方根のカーブ。中央で0dB、両端に振り切ると0dBとなります。
204     PAN_CURVE_SINCOS,           //!< 三角関数のカーブ。中央で-3dB、両端に振り切ると0dBとなります。
205     PAN_CURVE_SINCOS_0DB,       //!< 三角関数のカーブ。中央で0dB、両端に振り切ると+3dBとなります。
206     PAN_CURVE_SINCOS_0DB_CLAMP, //!< 三角関数のカーブ。中央で0dB、両端に振り切ると0dBとなります。
207     PAN_CURVE_LINEAR,           //!< 線形のカーブ。中央で-6dB、両端に振り切ると0dBとなります。
208     PAN_CURVE_LINEAR_0DB,       //!< 線形のカーブ。中央で0dB、両端に振り切ると+6dBとなります。
209     PAN_CURVE_LINEAR_0DB_CLAMP, //!< 線形のカーブ。中央で0dB、両端に振り切ると0dBとなります。
210     PAN_CURVE_INVALID           //!< 不正な種類のパンカーブです。
211 };
212 
213 //---------------------------------------------------------------------------
214 //! @brief    音量減衰カーブの列挙型です。
215 //!
216 //!           音量減衰のカーブは 3D サウンドで使用されています。
217 //!           @ref Sound3DParam  を参照してください。
218 //!
219 //! @see Sound3DParam 構造体
220 //!
221 //! @date 2010/03/12 初版
222 //---------------------------------------------------------------------------
223 enum DecayCurve
224 {
225     DECAY_CURVE_LOG    = 1, //!< 対数のカーブ。
226     DECAY_CURVE_LINEAR = 2  //!< 線形のカーブ。
227 };
228 
229 //! @details :private
230 struct DspAdpcmParam
231 {
232     ut::ResU16 coef[16];
233     ut::ResU16 predScale;
234     ut::ResU16 yn1;
235     ut::ResU16 yn2;
236 };
237 
238 #if 0
239 // 無効な ID を表現するのに利用する
240 typedef u32 IdType;
241 static const u32 INVALID_ID = 0xffffffff;
242 
243 typedef IdType SoundId;
244 typedef IdType GroupId;
245 typedef IdType PlayerId;
246 typedef IdType BankId;
247 typedef IdType FileId;
248 typedef IdType WaveArchiveId;
249 
250 typedef IdType StringId;
251 
252 // サウンドタイプ
253 enum SoundType
254 {
255     SOUND_TYPE_INVALID = 0,
256 
257     SOUND_TYPE_SEQ,
258     SOUND_TYPE_STRM,
259     SOUND_TYPE_WAVE
260 };
261 #endif
262 
263 // ADSHR カーブ
264 //! @details :private
265 struct AdshrCurve
266 {
267     u8 attack;
268     u8 decay;
269     u8 sustain;
270     u8 hold;
271     u8 release;
272     // u8 padding;
273     // u16 padding2;
274 
275     AdshrCurve( u8 a = 0, u8 d = 0, u8 s = 0, u8 h = 0, u8 r = 0 )
attackAdshrCurve276     : attack( a ),
277       decay( d ),
278       sustain( s ),
279       hold( h ),
280       release( r )
281     {}
282 };
283 
284 // ------------------------------------------------------------------------
285 // Biquadフィルタの種類
286 
287 //---------------------------------------------------------------------------
288 //! @brief  biquad フィルタの種類を示す列挙体です。
289 //!
290 //!         biquad フィルタでは、フィルタの係数を変更することにより
291 //!         様々な種類のフィルタを使用することができます。
292 //!
293 //!         ライブラリで用意されているプリセットの係数を利用するには、
294 //!         BIQUAD_FILTER_TYPE_LPF ~ BIQUAD_FILTER_TYPE_BPF2048 を指定してください。
295 //!
296 //!         biquad フィルタを使用しない場合は BIQUAD_FILTER_TYPE_NONE を指定してください。
297 //!
298 //!         また、ユーザーが設計したフィルタ係数を登録する際のタイプ番号として
299 //!         BIQUAD_FILTER_TYPE_USER_MIN ~ BIQUAD_FILTER_TYPE_USER_MAX
300 //!         までの値をご利用ください。
301 //!
302 //!         biquad フィルタは @ref SoundHandle::SetBiquadFilter
303 //!         関数から利用することができます。
304 //!
305 //! @see SoundHandle::SetBiquadFilter
306 //!
307 //! @date 2010/10/15 初版
308 //---------------------------------------------------------------------------
309 enum BiquadFilterType
310 {
311     BIQUAD_FILTER_TYPE_NONE    = 0,  //!< biquad フィルタを使用しません。
312     BIQUAD_FILTER_TYPE_LPF     = 1,  //!< プリセットのローパスフィルタを使用します。
313     BIQUAD_FILTER_TYPE_HPF     = 2,  //!< プリセットのハイパスフィルタを使用します。
314 
315     //! プリセットのバンドパスフィルタ (中心周波数 512Hz) を使用します。
316     BIQUAD_FILTER_TYPE_BPF512  = 3,
317 
318     //! プリセットのバンドパスフィルタ (中心周波数 1024Hz) を使用します。
319     BIQUAD_FILTER_TYPE_BPF1024 = 4,
320 
321     //! プリセットのバンドパスフィルタ (中心周波数 2048Hz) を使用します。
322     BIQUAD_FILTER_TYPE_BPF2048 = 5,
323 
324     //! ユーザーが登録できるフィルタ係数の種類の最小値です。
325     BIQUAD_FILTER_TYPE_USER_MIN = 64,
326 
327     //! ユーザーが登録できるフィルタ係数の種類の最大値です。
328     BIQUAD_FILTER_TYPE_USER_MAX = 127
329 };
330 
331 //---------------------------------------------------------------------------
332 //! @brief    SRC タイプ (サンプリングレートコンバータの補間方法) の定義です。
333 //!
334 //!           サンプリングレート変換時の補間方法を示します。
335 //!
336 //! @see      SoundSystem::SetSrcType
337 //! @see      SoundSystem::GetSrcType
338 //!
339 //! @date 2010/01/16 文言の調整
340 //! @date 2010/01/15 初版
341 //---------------------------------------------------------------------------
342 enum SrcType
343 {
344     SRC_TYPE_NONE,      //!< 補完しません。
345     SRC_TYPE_LINEAR,    //!< 線形補間します。
346     SRC_TYPE_4TAP       //!< 4点補間します。
347 };
348 
349 /* ========================================================================
350         非公開
351    ======================================================================== */
352 
353 namespace internal {
354 
355 // ------------------------------------------------------------------------
356 // 波形データ
357 static const int WAVE_CHANNEL_MAX = 2;
358 
359 struct DspAdpcmLoopParam
360 {
361     ut::ResU16 loopPredScale;
362     ut::ResU16 loopYn1;
363     ut::ResU16 loopYn2;
364 };
365 
366 struct WaveInfo
367 {
368     SampleFormat sampleFormat;
369     bool loopFlag;
370     int channelCount;
371     int sampleRate;
372     u32 loopStartFrame;
373     u32 loopEndFrame;
374 
375     struct ChannelParam
376     {
377         const void* dataAddress;
378         DspAdpcmParam adpcmParam;
379         DspAdpcmLoopParam adpcmLoopParam;
380     } channelParam[ WAVE_CHANNEL_MAX ];
381 };
382 
383 typedef nn::snd::MixParam MixParam;
384 
385 } // namespace nw::snd::internal
386 
387 } // namespace nw::snd
388 } // namespace nw
389 
390 #endif /* NW_SND_GLOBAL_H_ */
391 
392