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