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