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: 28909 $
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     SURROUND_SPEAKER_POSITION_NUM
90 } SurroundSpeakerPosition;
91 
92 /*!
93   @brief    補間方法を表す列挙型です。
94 */
95 enum InterpolationType
96 {
97     INTERPOLATION_TYPE_POLYPHASE, //!< 4 点補間を表します。
98     INTERPOLATION_TYPE_LINEAR,    //!< 線形補間を表します。
99     INTERPOLATION_TYPE_NONE       //!< 補間なしを表します。
100 };
101 
102 /*!
103   @brief    フィルタタイプを表す列挙型です。
104 */
105 typedef enum
106 {
107     FILTER_TYPE_NONE     = 0,       //!< フィルタなしを表します。
108     FILTER_TYPE_MONOPOLE = 1,       //!< 単極フィルタを表します。
109     FILTER_TYPE_BIQUAD   = 2,       //!< バイクワッドフィルタを表します。
110     FILTER_TYPE_BOTH     = 3        //!< 単極、バイクワッド両フィルタを併用します。
111 }
112 FilterType;
113 
114 /*!
115   @brief    Aux バスのID 表す列挙型です。
116 */
117 typedef enum
118 {
119     AUX_BUS_NULL = -1,
120 
121     AUX_BUS_A    =  0, //!< Aux A バスを表します。
122     AUX_BUS_B    =  1, //!< Aux B バスを表します。
123     AUX_BUS_NUM  =  2  //!< Aux バスの数を表します。
124 }
125 AuxBusId;
126 
127 /*!
128     @brief  各チャンネルのゲインを格納する構造体です。
129 */
130 struct MixParam
131 {
132     f32 mainBus[CHANNEL_INDEX_NUM];  //!< メインバスの各チャンネルのゲイン(1.0 が等倍)
133     f32 auxBusA[CHANNEL_INDEX_NUM];  //!< エフェクトバス0 の各チャンネルのゲイン(1.0 が等倍)
134     f32 auxBusB[CHANNEL_INDEX_NUM];  //!< エフェクトバス1 の各チャンネルのゲイン(1.0 が等倍)
135 
136     /*!
137       @brief        コンストラクタです。
138      */
MixParamMixParam139     MixParam()
140     {
141         for (int i = 0; i < CHANNEL_INDEX_NUM; i++)
142         {
143             mainBus[i] = auxBusA[i] = auxBusB[i] = 0.0f;
144         }
145     }
146 }; // MixParam
147 
148 /*!
149     @brief  サンプルデータが格納されているバッファの情報を格納する構造体です。
150 */
151 struct WaveBuffer
152 {
153     /*!
154       @brief        バッファの状態を表す列挙型です。
155     */
156     enum Status
157     {
158         STATUS_FREE, //!< 初期状態(一度もAppendWaveBuffer で追加されていない状態)を表します。ボイスの管理外にあります。
159         STATUS_WAIT, //!< ボイスのバッファリストにリンクされ、再生待ちの状態を表します。ボイスが管理しています。
160         STATUS_PLAY, //!< 現在再生中の状態を表します。ボイスが管理しています。
161         STATUS_DONE  //!< 再生完了状態を表します。ボイスの管理外にあります。
162     };
163 
164     // ユーザ用
165     const void * bufferAddress;   //!< サンプルデータ格納先アドレス。必須です。ボイスに登録後は変更しないで下さい。
166     s32 sampleLength;             //!< バッファ内のサンプル長。必須です。ボイスに登録後は変更しないで下さい。
167 
168     const AdpcmContext * pAdpcmContext; //!< Adpcm コンテクストのアドレス。ボイスに登録後、バッファの再生が終了するまで変更しないで下さい。
169 
170     uptr userParam;               //!< ユーザーパラメータ。任意です。
171 
172     bool loopFlag;                //!< ループフラグ。任意です。
173     Status status;                //!< バッファの状態。ライブラリが使用するため、変更しないで下さい。
174     u16 bufferId;                 //!< バッファ管理用 ID。ライブラリが使用するため、変更しないでください。
175 
176     struct WaveBuffer * next;     //!< 次のバッファ構造体のアドレス。ライブラリが使用するため、変更しないで下さい。
177 
178     /*!
179         @brief      コンストラクタです。
180      */
WaveBufferWaveBuffer181     WaveBuffer()
182     {
183         status = STATUS_FREE;
184     }
185 }; // WaveBuffer
186 
187 /*!
188   @brief    サンプルの形式を表す列挙型です。
189 */
190 enum SampleFormat
191 {
192     SAMPLE_FORMAT_PCM8  = Bcwav::ENCODING_PCM8,      //!< PCM8 を表します。
193     SAMPLE_FORMAT_PCM16 = Bcwav::ENCODING_PCM16,     //!< PCM16 を表します。
194     SAMPLE_FORMAT_ADPCM = Bcwav::ENCODING_DSP_ADPCM  //!< ADPCM を表します。
195 };
196 
197 static const s32 VOICE_PRIORITY_NODROP = 0x7fff; //!< 優先順位の最大値、かつ特別に扱われる優先順位です。
198 
199 /*!
200   @brief      サウンドフレーム毎にAux バスデータに対して施す処理を記述する関数の型定義です。
201 */
202 typedef struct
203 {
204     s32* frontLeft;  //!< フロントL データのアドレス。
205     s32* frontRight; //!< フロントR データのアドレス。
206     s32* rearLeft;   //!< リアL データのアドレス。
207     s32* rearRight;  //!< リアR データのアドレス。
208 }
209 AuxBusData;
210 
211 /*!
212   @brief      Aux コールバック関数ポインタの型定義です。
213   @param[in]  data         データ構造体のアドレス。
214   @param[in]  sampleLength サンプル長。
215   @param[in]  userData     ユーザ定義データ。
216   @return     なし。
217 */
218 typedef void(*AuxCallback)( AuxBusData* data, s32 sampleLength, uptr userData );
219 
220 /*! :private
221     @brief      @ref StartSoundThread 用スレッドパラメータ
222  */
223 struct ThreadParameter
224 {
225     uptr   stackBuffer;                 //!< スタック用バッファの先頭アドレス
226     uptr   stackSize;                   //!< スタック用バッファサイズ
227     size_t priority;                    //!< スレッド優先度
228 };
229 
230 }}} // namespace nn::snd::CTR
231 
232 #endif // __cplusplus
233 
234 // 以下、C 用宣言
235 
236 typedef struct
237 {
238     s16 n0;                             //!< x[n] の係数を表します。
239     s16 d1;                             //!< y[n-1] の係数を表します。
240 } nnsndMonoFilterCoefficients;
241 
242 /*!
243   @brief 双極フィルタの係数を格納する構造体です。
244  */
245 typedef struct
246 {
247     s16 n0;                             //!< x[n] の係数を表します。
248     s16 n1;                             //!< x[n-1] の係数を表します。
249     s16 n2;                             //!< x[n-2] の係数を表します。
250     s16 d1;                             //!< y[n-1] の係数を表します。
251     s16 d2;                             //!< y[n-2] の係数を表します。
252 } nnsndBiquadFilterCoefficients;
253 
254 typedef enum
255 {
256     NN_SND_FILTER_TYPE_NONE     = 0,    //!< フィルタなしを表します。
257     NN_SND_FILTER_TYPE_MONOPOLE = 1,    //!< 単極フィルタを表します。
258     NN_SND_FILTER_TYPE_BIQUAD   = 2,    //!< バイクワッドフィルタを表します。
259     NN_SND_FILTER_TYPE_BOTH     = 3     //!< 単極、バイクワッド両フィルタを併用します。
260 } nnsndFilterType;
261 
262 typedef enum
263 {
264     NN_SND_AUX_BUS_A   = 0, //!< Aux A バスを表します。
265     NN_SND_AUX_BUS_B   = 1, //!< Aux B バスを表します。
266     NN_SND_AUX_BUS_NUM = 2  //!< Aux バスの数を表します。
267 } nnsndAuxBusId;
268 
269 typedef enum nnsndSampleFormat
270 {
271     NN_SND_SAMPLE_FORMAT_PCM8  = NN_SND_BCWAV_ENCODING_PCM8,      //!< PCM8 を表します。
272     NN_SND_SAMPLE_FORMAT_PCM16 = NN_SND_BCWAV_ENCODING_PCM16,     //!< PCM16 を表します。
273     NN_SND_SAMPLE_FORMAT_ADPCM = NN_SND_BCWAV_ENCODING_DSP_ADPCM  //!< ADPCM を表します。
274 } nnsndSampleFormat;
275 
276 typedef enum nnsndChannelIndex
277 {
278     NN_SND_CHANNEL_INDEX_FRONT_LEFT  = 0,  //!< 左前チャンネルを表します。
279     NN_SND_CHANNEL_INDEX_FRONT_RIGHT = 1,  //!< 右前チャンネルを表します。
280     NN_SND_CHANNEL_INDEX_REAR_LEFT   = 2,  //!< 左後チャンネルを表します。
281     NN_SND_CHANNEL_INDEX_REAR_RIGHT  = 3,  //!< 右後チャンネルを表します。
282     NN_SND_CHANNEL_INDEX_NUM         = 4   //!< チャンネル数を表します。
283 } nnsndChannelIndex;
284 
285 typedef enum nnsndOutputMode
286 {
287     NN_SND_OUTPUT_MODE_MONO          = 0,  //!< モノラル出力を表します。
288     NN_SND_OUTPUT_MODE_STEREO        = 1,  //!< ステレオ出力を表します。
289     NN_SND_OUTPUT_MODE_3DSURROUND    = 2   //!< サラウンド出力を表します。
290 } nnsndOutputMode;
291 
292 typedef enum
293 {
294     NN_SND_CLIPPING_MODE_NORMAL      = 0,  //!< 通常のクリップを行います。
295     NN_SND_CLIPPING_MODE_SOFT        = 1   //!< ソフトクリップを行います。
296 } nnsndClippingMode;
297 
298 typedef enum nnsndSurroundSpeakerPosition
299 {
300     NN_SND_SURROUND_SPEAKER_POSITION_SQUARE = 0,  //!< Square モード (45, 135) を表します
301     NN_SND_SURROUND_SPEAKER_POSITION_WIDE   = 1   //!< Wide モード (60, 110) を表します。
302 } nnsndSurroundSpeakerPosition;
303 
304 #endif //NN_SND_TYPES_H_
305