1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     snd_Types.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  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   $Rev: 26219 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_SND_TYPES_H_
17 #define NN_SND_TYPES_H_
18 
19 #include <nn/snd/CTR/Common/snd_Bcwav.h>
20 
21 /*! @file
22     @brief      サウンド(SND)に関する型や定数の定義。
23 */
24 
25 #ifdef __cplusplus
26 #include <nn/os.h>
27 namespace nn { namespace snd { namespace CTR {
28 
29 /*!
30   @brief 単極フィルタの係数を格納する構造体です。
31  */
32 typedef struct
33 {
34     s16 n0;                             //!< x[n] の係数を表します。
35     s16 d1;                             //!< y[n-1] の係数を表します。
36 } MonoFilterCoefficients;
37 
38 /*!
39   @brief 双極フィルタの係数を格納する構造体です。
40  */
41 typedef struct
42 {
43     s16 n0;                             //!< x[n] の係数を表します。
44     s16 n1;                             //!< x[n-1] の係数を表します。
45     s16 n2;                             //!< x[n-2] の係数を表します。
46     s16 d1;                             //!< y[n-1] の係数を表します。
47     s16 d2;                             //!< y[n-2] の係数を表します。
48 } BiquadFilterCoefficients;
49 
50 /*!
51   @brief    チャンネルの位置を表す列挙型です。
52 */
53 typedef enum
54 {
55     CHANNEL_INDEX_FRONT_LEFT  = 0,  //!< 左前チャンネルを表します。
56     CHANNEL_INDEX_FRONT_RIGHT = 1,  //!< 右前チャンネルを表します。
57     CHANNEL_INDEX_REAR_LEFT   = 2,  //!< 左後チャンネルを表します。
58     CHANNEL_INDEX_REAR_RIGHT  = 3,  //!< 右後チャンネルを表します。
59     CHANNEL_INDEX_NUM         = 4   //!< チャンネル数を表します。
60 }
61 ChannelIndex;
62 
63 /*!
64   @brief    ミキサーの出力モードを表す列挙型です。
65  */
66 typedef enum
67 {
68     OUTPUT_MODE_MONO          = 0,  //!< モノラル出力を表します。
69     OUTPUT_MODE_STEREO        = 1,  //!< ステレオ出力を表します。
70     OUTPUT_MODE_3DSURROUND    = 2   //!< サラウンド出力を表します。
71 } OutputMode;
72 
73 /*!
74   @brief    クリッピングモードを表す列挙型です。
75 */
76 typedef enum
77 {
78     CLIPPING_MODE_NORMAL      = 0,  //!< 通常のクリップを行います。
79     CLIPPING_MODE_SOFT        = 1   //!< ソフトクリップを行います。
80 } ClippingMode;
81 
82 /*!
83   @brief    3D サラウンドの仮想スピーカー位置を表す列挙型です。
84  */
85 typedef enum
86 {
87     SURROUND_SPEAKER_POSITION_SQUARE = 0,  //!< Square モード (45, 135) を表します。
88     SURROUND_SPEAKER_POSITION_WIDE   = 1   //!< Wide モード (60, 110) を表します。
89 } SurroundSpeakerPosition;
90 
91 /*!
92   @brief    補間方法を表す列挙型です。
93 */
94 enum InterpolationType
95 {
96     INTERPOLATION_TYPE_POLYPHASE, //!< 4 点補間を表します。
97     INTERPOLATION_TYPE_LINEAR,    //!< 線形補間を表します。
98     INTERPOLATION_TYPE_NONE       //!< 補間なしを表します。
99 };
100 
101 /*!
102   @brief    フィルタタイプを表す列挙型です。
103 */
104 typedef enum
105 {
106     FILTER_TYPE_NONE,               //!< フィルタなしを表します。
107     FILTER_TYPE_MONOPOLE,           //!< 単極フィルタを表します。
108     FILTER_TYPE_BIQUAD              //!< バイクワッドフィルタを表します。
109 }
110 FilterType;
111 
112 /*!
113   @brief    Aux バスのID 表す列挙型です。
114 */
115 typedef enum
116 {
117     AUX_BUS_NULL = -1,
118 
119     AUX_BUS_A    =  0, //!< Aux A バスを表します。
120     AUX_BUS_B    =  1, //!< Aux B バスを表します。
121     AUX_BUS_NUM  =  2  //!< Aux バスの数を表します。
122 }
123 AuxBusId;
124 
125 /*!
126     @brief  各チャンネルのゲインを格納する構造体です。
127 */
128 struct MixParam
129 {
130     f32 mainBus[CHANNEL_INDEX_NUM];  //!< メインバスの各チャンネルのゲイン(1.0 が等倍)
131     f32 auxBusA[CHANNEL_INDEX_NUM];  //!< エフェクトバス0 の各チャンネルのゲイン(1.0 が等倍)
132     f32 auxBusB[CHANNEL_INDEX_NUM];  //!< エフェクトバス1 の各チャンネルのゲイン(1.0 が等倍)
133 
134     /*!
135       @brief        コンストラクタです。
136      */
MixParamMixParam137     MixParam()
138     {
139         for (int i = 0; i < CHANNEL_INDEX_NUM; i++)
140         {
141             mainBus[i] = auxBusA[i] = auxBusB[i] = 0.0f;
142         }
143     }
144 }; // MixParam
145 
146 /*!
147     @brief  サンプルデータが格納されているバッファの情報を格納する構造体です。
148 */
149 struct WaveBuffer
150 {
151     /*!
152       @brief        バッファの状態を表す列挙型です。
153     */
154     enum Status
155     {
156         STATUS_FREE, //!< 初期状態(一度もAppendWaveBuffer で追加されていない状態)を表します。ボイスの管理外にあります。
157         STATUS_WAIT, //!< ボイスのバッファリストにリンクされ、再生待ちの状態を表します。ボイスが管理しています。
158         STATUS_PLAY, //!< 現在再生中の状態を表します。ボイスが管理しています。
159         STATUS_DONE  //!< 再生完了状態を表します。ボイスの管理外にあります。
160     };
161 
162     // ユーザ用
163     const void * bufferAddress;   //!< サンプルデータ格納先アドレス。必須です。ボイスに登録後は変更しないで下さい。
164     s32 sampleLength;             //!< バッファ内のサンプル長。必須です。ボイスに登録後は変更しないで下さい。
165 
166     const AdpcmContext * pAdpcmContext; //!< Adpcm コンテクストのアドレス。ボイスに登録後、バッファの再生が終了するまで変更しないで下さい。
167 
168     uptr userParam;               //!< ユーザーパラメータ。任意です。
169 
170     bool loopFlag;                //!< ループフラグ。任意です。
171     Status status;                //!< バッファの状態。ライブラリが使用するため、変更しないで下さい。
172     u16 bufferId;                 //!< バッファ管理用 ID。ライブラリが使用するため、変更しないでください。
173 
174     struct WaveBuffer * next;     //!< 次のバッファ構造体のアドレス。ライブラリが使用するため、変更しないで下さい。
175 
176     /*!
177         @brief      コンストラクタです。
178      */
WaveBufferWaveBuffer179     WaveBuffer()
180     {
181         status = STATUS_FREE;
182     }
183 }; // WaveBuffer
184 
185 /*!
186   @brief    サンプルの形式を表す列挙型です。
187 */
188 enum SampleFormat
189 {
190     SAMPLE_FORMAT_PCM8  = Bcwav::ENCODING_PCM8,      //!< PCM8 を表します。
191     SAMPLE_FORMAT_PCM16 = Bcwav::ENCODING_PCM16,     //!< PCM16 を表します。
192     SAMPLE_FORMAT_ADPCM = Bcwav::ENCODING_DSP_ADPCM  //!< ADPCM を表します。
193 };
194 
195 static const s32 VOICE_PRIORITY_NODROP = 0x7fff; //!< 優先順位の最大値、かつ特別に扱われる優先順位です。
196 
197 /*!
198   @brief      サウンドフレーム毎にAux バスデータに対して施す処理を記述する関数の型定義です。
199 */
200 typedef struct
201 {
202     s32* frontLeft;  //!< フロントL データのアドレス。
203     s32* frontRight; //!< フロントR データのアドレス。
204     s32* rearLeft;   //!< リアL データのアドレス。
205     s32* rearRight;  //!< リアR データのアドレス。
206 }
207 AuxBusData;
208 
209 /*!
210   @brief      Aux コールバック関数ポインタの型定義です。
211   @param[in]  data         データ構造体のアドレス。
212   @param[in]  sampleLength サンプル長。
213   @param[in]  userData     ユーザ定義データ。
214   @return     なし。
215 */
216 typedef void(*AuxCallback)( AuxBusData* data, s32 sampleLength, uptr userData );
217 
218 }}} // namespace nn::snd::CTR
219 
220 #endif // __cplusplus
221 
222 // 以下、C 用宣言
223 
224 typedef struct
225 {
226     s16 n0;                             //!< x[n] の係数を表します。
227     s16 d1;                             //!< y[n-1] の係数を表します。
228 } nnsndMonoFilterCoefficients;
229 
230 /*!
231   @brief 双極フィルタの係数を格納する構造体です。
232  */
233 typedef struct
234 {
235     s16 n0;                             //!< x[n] の係数を表します。
236     s16 n1;                             //!< x[n-1] の係数を表します。
237     s16 n2;                             //!< x[n-2] の係数を表します。
238     s16 d1;                             //!< y[n-1] の係数を表します。
239     s16 d2;                             //!< y[n-2] の係数を表します。
240 } nnsndBiquadFilterCoefficients;
241 
242 typedef enum
243 {
244     NN_SND_FILTER_TYPE_NONE,               //!< フィルタなしを表します。
245     NN_SND_FILTER_TYPE_MONOPOLE,           //!< 単極フィルタを表します。
246     NN_SND_FILTER_TYPE_BIQUAD              //!< バイクワッドフィルタを表します。
247 } nnsndFilterType;
248 
249 typedef enum
250 {
251     NN_SND_AUX_BUS_A   = 0, //!< Aux A バスを表します。
252     NN_SND_AUX_BUS_B   = 1, //!< Aux B バスを表します。
253     NN_SND_AUX_BUS_NUM = 2  //!< Aux バスの数を表します。
254 } nnsndAuxBusId;
255 
256 typedef enum nnsndSampleFormat
257 {
258     NN_SND_SAMPLE_FORMAT_PCM8  = NN_SND_BCWAV_ENCODING_PCM8,      //!< PCM8 を表します。
259     NN_SND_SAMPLE_FORMAT_PCM16 = NN_SND_BCWAV_ENCODING_PCM16,     //!< PCM16 を表します。
260     NN_SND_SAMPLE_FORMAT_ADPCM = NN_SND_BCWAV_ENCODING_DSP_ADPCM  //!< ADPCM を表します。
261 } nnsndSampleFormat;
262 
263 typedef enum nnsndChannelIndex
264 {
265     NN_SND_CHANNEL_INDEX_FRONT_LEFT  = 0,  //!< 左前チャンネルを表します。
266     NN_SND_CHANNEL_INDEX_FRONT_RIGHT = 1,  //!< 右前チャンネルを表します。
267     NN_SND_CHANNEL_INDEX_REAR_LEFT   = 2,  //!< 左後チャンネルを表します。
268     NN_SND_CHANNEL_INDEX_REAR_RIGHT  = 3,  //!< 右後チャンネルを表します。
269     NN_SND_CHANNEL_INDEX_NUM         = 4   //!< チャンネル数を表します。
270 } nnsndChannelIndex;
271 
272 typedef enum nnsndOutputMode
273 {
274     NN_SND_OUTPUT_MODE_MONO          = 0,  //!< モノラル出力を表します。
275     NN_SND_OUTPUT_MODE_STEREO        = 1,  //!< ステレオ出力を表します。
276     NN_SND_OUTPUT_MODE_3DSURROUND    = 2   //!< サラウンド出力を表します。
277 } nnsndOutputMode;
278 
279 typedef enum
280 {
281     NN_SND_CLIPPING_MODE_NORMAL      = 0,  //!< 通常のクリップを行います。
282     NN_SND_CLIPPING_MODE_SOFT        = 1   //!< ソフトクリップを行います。
283 } nnsndClippingMode;
284 
285 typedef enum nnsndSurroundSpeakerPosition
286 {
287     NN_SND_SURROUND_SPEAKER_POSITION_SQUARE = 0,  //!< Square モード (45, 135) を表します
288     NN_SND_SURROUND_SPEAKER_POSITION_WIDE   = 1   //!< Wide モード (60, 110) を表します。
289 } nnsndSurroundSpeakerPosition;
290 
291 #endif //NN_SND_TYPES_H_
292