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