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