1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: snd_Global.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. 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 $Revision: 25184 $ 14 *---------------------------------------------------------------------------*/ 15 16 /** 17 * :include nw/snd/snd_Global.h 18 * 19 * @file snd_Global.h 20 */ 21 22 #ifndef NW_SND_GLOBAL_H_ 23 #define NW_SND_GLOBAL_H_ 24 25 #include <nn/snd.h> 26 #include <nw/config.h> // for NW_PLATFORM_*** 27 #include <nw/ut/ut_ResTypes.h> 28 29 #include <nn/version.h> 30 31 32 namespace nw { 33 namespace snd { 34 35 36 /* ======================================================================== 37 sndライブラリ共通のグローバル定義 38 ======================================================================== */ 39 40 //--------------------------------------------------------------------------- 41 //! @brief サウンドフレーム処理から呼ばれるユーザーコールバック関数の型定義です。 42 //! 43 //! @ref SoundSystem::SetSoundFrameUserCallback で登録することができます。 44 //! 45 //! @param[in] arg コールバック関数のユーザー引数です。 46 //! 47 //! @see SoundSystem::SetSoundFrameUserCallback 48 //! 49 //! @date 2010/06/14 初版 50 //--------------------------------------------------------------------------- 51 typedef void(*SoundFrameUserCallback)( uptr arg ); 52 53 //--------------------------------------------------------------------------- 54 //! @brief サウンドの出力モードの定義です。 55 //! 56 //! @see SoundSystem::SetOutputMode 57 //! @see SoundSystem::GetOutputMode 58 //! 59 //! @date 2010/06/16 OUTPUT_MODE_NUM を追加 60 //! @date 2010/06/14 サラウンドモードを追加 61 //! @date 2010/01/15 初版 62 //--------------------------------------------------------------------------- 63 enum OutputMode 64 { 65 OUTPUT_MODE_MONO, //!< モノラルモードです。パンは効果がありません。 66 OUTPUT_MODE_STEREO, //!< ステレオモードです。 67 OUTPUT_MODE_SURROUND, //!< サラウンドモードです。 68 OUTPUT_MODE_NUM //!< 出力モードの総数です。 69 }; 70 71 // ------------------------------------------------------------------------ 72 // エフェクトバス 73 74 //--------------------------------------------------------------------------- 75 //! @brief AUX バス ID の定義です。 76 //! 77 //! AUX バスはバス A とバス B が存在します。 78 //! 79 //! @see SoundSystem::AppendEffect 80 //! @see SoundHandle::SetFxSend 81 //! @see SequenceSoundHandle::SetFxSend 82 //! @see StreamSoundHandle::SetFxSend 83 //! @see WaveSoundHandle::SetFxSend 84 //! 85 //! @date 2010/06/16 初版 86 //--------------------------------------------------------------------------- 87 enum AuxBus 88 { 89 AUX_BUS_A = nn::snd::AUX_BUS_A, //!< AUX バス A です。 90 AUX_BUS_B = nn::snd::AUX_BUS_B, //!< AUX バス B です。 91 AUX_BUS_NUM = nn::snd::AUX_BUS_NUM //!< AUX バスの本数です。 92 }; 93 94 // ------------------------------------------------------------------------ 95 // サンプルフォーマット 96 97 //--------------------------------------------------------------------------- 98 //! @brief サンプルフォーマットです。 99 //! 100 //! @ref FxBase::UpdateBuffer では、 101 //! つねに SAMPLE_FORMAT_PCM_S32 が入ります。 102 //! 103 //! @see FxBase::UpdateBuffer 104 //! 105 //! @date 2010/06/17 初版 106 //--------------------------------------------------------------------------- 107 enum SampleFormat 108 { 109 SAMPLE_FORMAT_PCM_S8, //!< signed 8bit です。 110 SAMPLE_FORMAT_PCM_S16, //!< signed 16bit です。 111 SAMPLE_FORMAT_PCM_S32, //!< signed 32bit です。 112 SAMPLE_FORMAT_DSP_ADPCM, //!< DSP ADPCM です。 113 SAMPLE_FORMAT_IMA_ADPCM //!< IMA ADPCM です。 114 }; 115 116 // ------------------------------------------------------------------------ 117 // シーケンスミュート 118 119 //--------------------------------------------------------------------------- 120 //! @brief シーケンストラックのミュート、及びミュート解除の定義です。 121 //! 122 //! @see SequenceSoundHandle::SetTrackMute 123 //! 124 //! @date 2010/01/25 初版 125 //--------------------------------------------------------------------------- 126 enum SeqMute 127 { 128 //--------------------------------------------------------------------------- 129 //! @brief ミュート状態を解除します。 130 //--------------------------------------------------------------------------- 131 SEQ_MUTE_OFF, 132 133 //--------------------------------------------------------------------------- 134 //! @brief シーケンストラックをミュート状態にします。 135 //! そのトラックで発音中の音は変化しません。 136 //--------------------------------------------------------------------------- 137 SEQ_MUTE_NO_STOP, 138 139 //--------------------------------------------------------------------------- 140 //! @brief シーケンストラックをミュート状態にします。 141 //! 同時に、そのトラックで発音中の音をエンベロープのリリースを発音してから、 142 //! 緩やかに停止させます。 143 //--------------------------------------------------------------------------- 144 SEQ_MUTE_RELEASE, 145 146 //--------------------------------------------------------------------------- 147 //! @brief シーケンストラックをミュート状態にします。 148 //! 同時に、そのトラックで発音中の音を直ちに停止します。 149 //--------------------------------------------------------------------------- 150 SEQ_MUTE_STOP 151 }; 152 153 154 // ------------------------------------------------------------------------ 155 // 波形データ 156 // 2ch [ステレオ] 波形までサポートします。 157 //! @details :private 158 static const int WAVE_CHANNEL_MAX = 2; 159 160 // ------------------------------------------------------------------------ 161 // ステレオ時のパン動作モード 162 //! @details :private 163 static const int PAN_MODE_NUM = 2; 164 165 //--------------------------------------------------------------------------- 166 //! @brief パンの動作モードの定義です。 167 //! 168 //! @see SoundArchive::SoundInfo 169 //! 170 //! @date 2010/01/15 初版 171 //--------------------------------------------------------------------------- 172 enum PanMode 173 { 174 PAN_MODE_DUAL, //!< ステレオを2本のモノラルとしてそれぞれに定位処理を行います。 175 PAN_MODE_BALANCE, //!< 左右チャンネルの音量バランスを処理します。 176 PAN_MODE_INVALID //!< 不正な種類のパンモードです。 177 }; 178 179 // ------------------------------------------------------------------------ 180 // パン計算の曲線 181 182 //! @details :private 183 static const int PAN_CURVE_NUM = 9; 184 185 //--------------------------------------------------------------------------- 186 //! @brief パンカーブの定義です。 187 //! 188 //! パンのカーブは以下の項目の組み合わせで定義されています。 189 //! 190 //! ・曲線の種類(平方根、三角関数、線形)@n 191 //! ・曲線のスケール(パンが中央のときに 0dB とするか、 192 //! パンが両端に振るられたときに 0dB とするか)@n 193 //! ・パンの曲線が 0dB を超えたときに、 0dB にクランプするかどうか 194 //! 195 //! @see SoundArchive::SoundInfo 196 //! 197 //! @date 2010/01/15 初版 198 //--------------------------------------------------------------------------- 199 enum PanCurve 200 { 201 PAN_CURVE_SQRT, //!< 平方根のカーブ。中央で-3dB、両端に振り切ると0dBとなります。 202 PAN_CURVE_SQRT_0DB, //!< 平方根のカーブ。中央で0dB、両端に振り切ると+3dBとなります。 203 PAN_CURVE_SQRT_0DB_CLAMP, //!< 平方根のカーブ。中央で0dB、両端に振り切ると0dBとなります。 204 PAN_CURVE_SINCOS, //!< 三角関数のカーブ。中央で-3dB、両端に振り切ると0dBとなります。 205 PAN_CURVE_SINCOS_0DB, //!< 三角関数のカーブ。中央で0dB、両端に振り切ると+3dBとなります。 206 PAN_CURVE_SINCOS_0DB_CLAMP, //!< 三角関数のカーブ。中央で0dB、両端に振り切ると0dBとなります。 207 PAN_CURVE_LINEAR, //!< 線形のカーブ。中央で-6dB、両端に振り切ると0dBとなります。 208 PAN_CURVE_LINEAR_0DB, //!< 線形のカーブ。中央で0dB、両端に振り切ると+6dBとなります。 209 PAN_CURVE_LINEAR_0DB_CLAMP, //!< 線形のカーブ。中央で0dB、両端に振り切ると0dBとなります。 210 PAN_CURVE_INVALID //!< 不正な種類のパンカーブです。 211 }; 212 213 //--------------------------------------------------------------------------- 214 //! @brief 音量減衰カーブの列挙型です。 215 //! 216 //! 音量減衰のカーブは 3D サウンドで使用されています。 217 //! @ref Sound3DParam を参照してください。 218 //! 219 //! @see Sound3DParam 構造体 220 //! 221 //! @date 2010/03/12 初版 222 //--------------------------------------------------------------------------- 223 enum DecayCurve 224 { 225 DECAY_CURVE_LOG = 1, //!< 対数のカーブ。 226 DECAY_CURVE_LINEAR = 2 //!< 線形のカーブ。 227 }; 228 229 //! @details :private 230 struct DspAdpcmParam 231 { 232 ut::ResU16 coef[16]; 233 ut::ResU16 predScale; 234 ut::ResU16 yn1; 235 ut::ResU16 yn2; 236 }; 237 238 #if 0 239 // 無効な ID を表現するのに利用する 240 typedef u32 IdType; 241 static const u32 INVALID_ID = 0xffffffff; 242 243 typedef IdType SoundId; 244 typedef IdType GroupId; 245 typedef IdType PlayerId; 246 typedef IdType BankId; 247 typedef IdType FileId; 248 typedef IdType WaveArchiveId; 249 250 typedef IdType StringId; 251 252 // サウンドタイプ 253 enum SoundType 254 { 255 SOUND_TYPE_INVALID = 0, 256 257 SOUND_TYPE_SEQ, 258 SOUND_TYPE_STRM, 259 SOUND_TYPE_WAVE 260 }; 261 #endif 262 263 // ADSHR カーブ 264 //! @details :private 265 struct AdshrCurve 266 { 267 u8 attack; 268 u8 decay; 269 u8 sustain; 270 u8 hold; 271 u8 release; 272 // u8 padding; 273 // u16 padding2; 274 275 AdshrCurve( u8 a = 0, u8 d = 0, u8 s = 0, u8 h = 0, u8 r = 0 ) attackAdshrCurve276 : attack( a ), 277 decay( d ), 278 sustain( s ), 279 hold( h ), 280 release( r ) 281 {} 282 }; 283 284 // ------------------------------------------------------------------------ 285 // Biquadフィルタの種類 286 287 //--------------------------------------------------------------------------- 288 //! @brief biquad フィルタの種類を示す列挙体です。 289 //! 290 //! biquad フィルタでは、フィルタの係数を変更することにより 291 //! 様々な種類のフィルタを使用することができます。 292 //! 293 //! ライブラリで用意されているプリセットの係数を利用するには、 294 //! BIQUAD_FILTER_TYPE_LPF ~ BIQUAD_FILTER_TYPE_BPF2048 を指定してください。 295 //! 296 //! biquad フィルタを使用しない場合は BIQUAD_FILTER_TYPE_NONE を指定してください。 297 //! 298 //! また、ユーザーが設計したフィルタ係数を登録する際のタイプ番号として 299 //! BIQUAD_FILTER_TYPE_USER_MIN ~ BIQUAD_FILTER_TYPE_USER_MAX 300 //! までの値をご利用ください。 301 //! 302 //! biquad フィルタは @ref SoundHandle::SetBiquadFilter 303 //! 関数から利用することができます。 304 //! 305 //! @see SoundHandle::SetBiquadFilter 306 //! 307 //! @date 2010/10/15 初版 308 //--------------------------------------------------------------------------- 309 enum BiquadFilterType 310 { 311 BIQUAD_FILTER_TYPE_NONE = 0, //!< biquad フィルタを使用しません。 312 BIQUAD_FILTER_TYPE_LPF = 1, //!< プリセットのローパスフィルタを使用します。 313 BIQUAD_FILTER_TYPE_HPF = 2, //!< プリセットのハイパスフィルタを使用します。 314 315 //! プリセットのバンドパスフィルタ (中心周波数 512Hz) を使用します。 316 BIQUAD_FILTER_TYPE_BPF512 = 3, 317 318 //! プリセットのバンドパスフィルタ (中心周波数 1024Hz) を使用します。 319 BIQUAD_FILTER_TYPE_BPF1024 = 4, 320 321 //! プリセットのバンドパスフィルタ (中心周波数 2048Hz) を使用します。 322 BIQUAD_FILTER_TYPE_BPF2048 = 5, 323 324 //! ユーザーが登録できるフィルタ係数の種類の最小値です。 325 BIQUAD_FILTER_TYPE_USER_MIN = 64, 326 327 //! ユーザーが登録できるフィルタ係数の種類の最大値です。 328 BIQUAD_FILTER_TYPE_USER_MAX = 127 329 }; 330 331 //--------------------------------------------------------------------------- 332 //! @brief SRC タイプ (サンプリングレートコンバータの補間方法) の定義です。 333 //! 334 //! サンプリングレート変換時の補間方法を示します。 335 //! 336 //! @see SoundSystem::SetSrcType 337 //! @see SoundSystem::GetSrcType 338 //! 339 //! @date 2010/01/16 文言の調整 340 //! @date 2010/01/15 初版 341 //--------------------------------------------------------------------------- 342 enum SrcType 343 { 344 SRC_TYPE_NONE, //!< 補完しません。 345 SRC_TYPE_LINEAR, //!< 線形補間します。 346 SRC_TYPE_4TAP //!< 4点補間します。 347 }; 348 349 /* ======================================================================== 350 非公開 351 ======================================================================== */ 352 353 namespace internal { 354 355 // ------------------------------------------------------------------------ 356 // 波形データ 357 static const int WAVE_CHANNEL_MAX = 2; 358 359 struct DspAdpcmLoopParam 360 { 361 ut::ResU16 loopPredScale; 362 ut::ResU16 loopYn1; 363 ut::ResU16 loopYn2; 364 }; 365 366 struct WaveInfo 367 { 368 SampleFormat sampleFormat; 369 bool loopFlag; 370 int channelCount; 371 int sampleRate; 372 u32 loopStartFrame; 373 u32 loopEndFrame; 374 375 struct ChannelParam 376 { 377 const void* dataAddress; 378 DspAdpcmParam adpcmParam; 379 DspAdpcmLoopParam adpcmLoopParam; 380 } channelParam[ WAVE_CHANNEL_MAX ]; 381 }; 382 383 typedef nn::snd::MixParam MixParam; 384 385 } // namespace nw::snd::internal 386 387 } // namespace nw::snd 388 } // namespace nw 389 390 #endif /* NW_SND_GLOBAL_H_ */ 391 392