/*---------------------------------------------------------------------------* Project: NintendoWare File: snd_Global.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 25184 $ *---------------------------------------------------------------------------*/ /** * :include nw/snd/snd_Global.h * * @file snd_Global.h */ #ifndef NW_SND_GLOBAL_H_ #define NW_SND_GLOBAL_H_ #include #include // for NW_PLATFORM_*** #include #include namespace nw { namespace snd { /* ======================================================================== sndライブラリ共通のグローバル定義 ======================================================================== */ //--------------------------------------------------------------------------- //! @brief サウンドフレーム処理から呼ばれるユーザーコールバック関数の型定義です。 //! //! @ref SoundSystem::SetSoundFrameUserCallback で登録することができます。 //! //! @param[in] arg コールバック関数のユーザー引数です。 //! //! @see SoundSystem::SetSoundFrameUserCallback //! //! @date 2010/06/14 初版 //--------------------------------------------------------------------------- typedef void(*SoundFrameUserCallback)( uptr arg ); //--------------------------------------------------------------------------- //! @brief サウンドの出力モードの定義です。 //! //! @see SoundSystem::SetOutputMode //! @see SoundSystem::GetOutputMode //! //! @date 2010/06/16 OUTPUT_MODE_NUM を追加 //! @date 2010/06/14 サラウンドモードを追加 //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- enum OutputMode { OUTPUT_MODE_MONO, //!< モノラルモードです。パンは効果がありません。 OUTPUT_MODE_STEREO, //!< ステレオモードです。 OUTPUT_MODE_SURROUND, //!< サラウンドモードです。 OUTPUT_MODE_NUM //!< 出力モードの総数です。 }; // ------------------------------------------------------------------------ // エフェクトバス //--------------------------------------------------------------------------- //! @brief AUX バス ID の定義です。 //! //! AUX バスはバス A とバス B が存在します。 //! //! @see SoundSystem::AppendEffect //! @see SoundHandle::SetFxSend //! @see SequenceSoundHandle::SetFxSend //! @see StreamSoundHandle::SetFxSend //! @see WaveSoundHandle::SetFxSend //! //! @date 2010/06/16 初版 //--------------------------------------------------------------------------- enum AuxBus { AUX_BUS_A = nn::snd::AUX_BUS_A, //!< AUX バス A です。 AUX_BUS_B = nn::snd::AUX_BUS_B, //!< AUX バス B です。 AUX_BUS_NUM = nn::snd::AUX_BUS_NUM //!< AUX バスの本数です。 }; // ------------------------------------------------------------------------ // サンプルフォーマット //--------------------------------------------------------------------------- //! @brief サンプルフォーマットです。 //! //! @ref FxBase::UpdateBuffer では、 //! つねに SAMPLE_FORMAT_PCM_S32 が入ります。 //! //! @see FxBase::UpdateBuffer //! //! @date 2010/06/17 初版 //--------------------------------------------------------------------------- enum SampleFormat { SAMPLE_FORMAT_PCM_S8, //!< signed 8bit です。 SAMPLE_FORMAT_PCM_S16, //!< signed 16bit です。 SAMPLE_FORMAT_PCM_S32, //!< signed 32bit です。 SAMPLE_FORMAT_DSP_ADPCM, //!< DSP ADPCM です。 SAMPLE_FORMAT_IMA_ADPCM //!< IMA ADPCM です。 }; // ------------------------------------------------------------------------ // シーケンスミュート //--------------------------------------------------------------------------- //! @brief シーケンストラックのミュート、及びミュート解除の定義です。 //! //! @see SequenceSoundHandle::SetTrackMute //! //! @date 2010/01/25 初版 //--------------------------------------------------------------------------- enum SeqMute { //--------------------------------------------------------------------------- //! @brief ミュート状態を解除します。 //--------------------------------------------------------------------------- SEQ_MUTE_OFF, //--------------------------------------------------------------------------- //! @brief シーケンストラックをミュート状態にします。 //! そのトラックで発音中の音は変化しません。 //--------------------------------------------------------------------------- SEQ_MUTE_NO_STOP, //--------------------------------------------------------------------------- //! @brief シーケンストラックをミュート状態にします。 //! 同時に、そのトラックで発音中の音をエンベロープのリリースを発音してから、 //! 緩やかに停止させます。 //--------------------------------------------------------------------------- SEQ_MUTE_RELEASE, //--------------------------------------------------------------------------- //! @brief シーケンストラックをミュート状態にします。 //! 同時に、そのトラックで発音中の音を直ちに停止します。 //--------------------------------------------------------------------------- SEQ_MUTE_STOP }; // ------------------------------------------------------------------------ // 波形データ // 2ch [ステレオ] 波形までサポートします。 //! @details :private static const int WAVE_CHANNEL_MAX = 2; // ------------------------------------------------------------------------ // ステレオ時のパン動作モード //! @details :private static const int PAN_MODE_NUM = 2; //--------------------------------------------------------------------------- //! @brief パンの動作モードの定義です。 //! //! @see SoundArchive::SoundInfo //! //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- enum PanMode { PAN_MODE_DUAL, //!< ステレオを2本のモノラルとしてそれぞれに定位処理を行います。 PAN_MODE_BALANCE, //!< 左右チャンネルの音量バランスを処理します。 PAN_MODE_INVALID //!< 不正な種類のパンモードです。 }; // ------------------------------------------------------------------------ // パン計算の曲線 //! @details :private static const int PAN_CURVE_NUM = 9; //--------------------------------------------------------------------------- //! @brief パンカーブの定義です。 //! //! パンのカーブは以下の項目の組み合わせで定義されています。 //! //! ・曲線の種類(平方根、三角関数、線形)@n //! ・曲線のスケール(パンが中央のときに 0dB とするか、 //! パンが両端に振るられたときに 0dB とするか)@n //! ・パンの曲線が 0dB を超えたときに、 0dB にクランプするかどうか //! //! @see SoundArchive::SoundInfo //! //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- enum PanCurve { PAN_CURVE_SQRT, //!< 平方根のカーブ。中央で-3dB、両端に振り切ると0dBとなります。 PAN_CURVE_SQRT_0DB, //!< 平方根のカーブ。中央で0dB、両端に振り切ると+3dBとなります。 PAN_CURVE_SQRT_0DB_CLAMP, //!< 平方根のカーブ。中央で0dB、両端に振り切ると0dBとなります。 PAN_CURVE_SINCOS, //!< 三角関数のカーブ。中央で-3dB、両端に振り切ると0dBとなります。 PAN_CURVE_SINCOS_0DB, //!< 三角関数のカーブ。中央で0dB、両端に振り切ると+3dBとなります。 PAN_CURVE_SINCOS_0DB_CLAMP, //!< 三角関数のカーブ。中央で0dB、両端に振り切ると0dBとなります。 PAN_CURVE_LINEAR, //!< 線形のカーブ。中央で-6dB、両端に振り切ると0dBとなります。 PAN_CURVE_LINEAR_0DB, //!< 線形のカーブ。中央で0dB、両端に振り切ると+6dBとなります。 PAN_CURVE_LINEAR_0DB_CLAMP, //!< 線形のカーブ。中央で0dB、両端に振り切ると0dBとなります。 PAN_CURVE_INVALID //!< 不正な種類のパンカーブです。 }; //--------------------------------------------------------------------------- //! @brief 音量減衰カーブの列挙型です。 //! //! 音量減衰のカーブは 3D サウンドで使用されています。 //! @ref Sound3DParam を参照してください。 //! //! @see Sound3DParam 構造体 //! //! @date 2010/03/12 初版 //--------------------------------------------------------------------------- enum DecayCurve { DECAY_CURVE_LOG = 1, //!< 対数のカーブ。 DECAY_CURVE_LINEAR = 2 //!< 線形のカーブ。 }; //! @details :private struct DspAdpcmParam { ut::ResU16 coef[16]; ut::ResU16 predScale; ut::ResU16 yn1; ut::ResU16 yn2; }; #if 0 // 無効な ID を表現するのに利用する typedef u32 IdType; static const u32 INVALID_ID = 0xffffffff; typedef IdType SoundId; typedef IdType GroupId; typedef IdType PlayerId; typedef IdType BankId; typedef IdType FileId; typedef IdType WaveArchiveId; typedef IdType StringId; // サウンドタイプ enum SoundType { SOUND_TYPE_INVALID = 0, SOUND_TYPE_SEQ, SOUND_TYPE_STRM, SOUND_TYPE_WAVE }; #endif // ADSHR カーブ //! @details :private struct AdshrCurve { u8 attack; u8 decay; u8 sustain; u8 hold; u8 release; // u8 padding; // u16 padding2; AdshrCurve( u8 a = 0, u8 d = 0, u8 s = 0, u8 h = 0, u8 r = 0 ) : attack( a ), decay( d ), sustain( s ), hold( h ), release( r ) {} }; // ------------------------------------------------------------------------ // Biquadフィルタの種類 //--------------------------------------------------------------------------- //! @brief biquad フィルタの種類を示す列挙体です。 //! //! biquad フィルタでは、フィルタの係数を変更することにより //! 様々な種類のフィルタを使用することができます。 //! //! ライブラリで用意されているプリセットの係数を利用するには、 //! BIQUAD_FILTER_TYPE_LPF ~ BIQUAD_FILTER_TYPE_BPF2048 を指定してください。 //! //! biquad フィルタを使用しない場合は BIQUAD_FILTER_TYPE_NONE を指定してください。 //! //! また、ユーザーが設計したフィルタ係数を登録する際のタイプ番号として //! BIQUAD_FILTER_TYPE_USER_MIN ~ BIQUAD_FILTER_TYPE_USER_MAX //! までの値をご利用ください。 //! //! biquad フィルタは @ref SoundHandle::SetBiquadFilter //! 関数から利用することができます。 //! //! @see SoundHandle::SetBiquadFilter //! //! @date 2010/10/15 初版 //--------------------------------------------------------------------------- enum BiquadFilterType { BIQUAD_FILTER_TYPE_NONE = 0, //!< biquad フィルタを使用しません。 BIQUAD_FILTER_TYPE_LPF = 1, //!< プリセットのローパスフィルタを使用します。 BIQUAD_FILTER_TYPE_HPF = 2, //!< プリセットのハイパスフィルタを使用します。 //! プリセットのバンドパスフィルタ (中心周波数 512Hz) を使用します。 BIQUAD_FILTER_TYPE_BPF512 = 3, //! プリセットのバンドパスフィルタ (中心周波数 1024Hz) を使用します。 BIQUAD_FILTER_TYPE_BPF1024 = 4, //! プリセットのバンドパスフィルタ (中心周波数 2048Hz) を使用します。 BIQUAD_FILTER_TYPE_BPF2048 = 5, //! ユーザーが登録できるフィルタ係数の種類の最小値です。 BIQUAD_FILTER_TYPE_USER_MIN = 64, //! ユーザーが登録できるフィルタ係数の種類の最大値です。 BIQUAD_FILTER_TYPE_USER_MAX = 127 }; //--------------------------------------------------------------------------- //! @brief SRC タイプ (サンプリングレートコンバータの補間方法) の定義です。 //! //! サンプリングレート変換時の補間方法を示します。 //! //! @see SoundSystem::SetSrcType //! @see SoundSystem::GetSrcType //! //! @date 2010/01/16 文言の調整 //! @date 2010/01/15 初版 //--------------------------------------------------------------------------- enum SrcType { SRC_TYPE_NONE, //!< 補完しません。 SRC_TYPE_LINEAR, //!< 線形補間します。 SRC_TYPE_4TAP //!< 4点補間します。 }; /* ======================================================================== 非公開 ======================================================================== */ namespace internal { // ------------------------------------------------------------------------ // 波形データ static const int WAVE_CHANNEL_MAX = 2; struct DspAdpcmLoopParam { ut::ResU16 loopPredScale; ut::ResU16 loopYn1; ut::ResU16 loopYn2; }; struct WaveInfo { SampleFormat sampleFormat; bool loopFlag; int channelCount; int sampleRate; u32 loopStartFrame; u32 loopEndFrame; struct ChannelParam { const void* dataAddress; DspAdpcmParam adpcmParam; DspAdpcmLoopParam adpcmLoopParam; } channelParam[ WAVE_CHANNEL_MAX ]; }; typedef nn::snd::MixParam MixParam; } // namespace nw::snd::internal } // namespace nw::snd } // namespace nw #endif /* NW_SND_GLOBAL_H_ */