1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     snd_FxDelay.h
4 
5   Copyright (C)2010 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: 26241 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_SND_CTR_SND_FX_DELAY_H_
17 #define NN_SND_CTR_SND_FX_DELAY_H_
18 
19 #include <nn/os.h>
20 #include <nn/snd/CTR/Common/snd_Types.h>
21 #include <nn/util/util_NonCopyable.h>
22 
23 #ifdef __cplusplus
24 
25 /*! @file
26     @brief      DSP ディレイエフェクトに関する関数、およびクラス定義
27 */
28 
29 namespace nn  {
30 namespace snd {
31 namespace CTR {
32 
33 /*! :private
34     @brief      DSP ディレイエフェクトを操作するクラスです。
35  */
36 class FxDelay : private nn::util::NonCopyable<FxDelay>
37 {
38 public:
39     /*!
40         @brief  ディレイパラメータの構造体です。
41 
42                 m_DelayTime を大きくすればするほど、反響が遅れてやって来ます。
43 
44                 m_FeedbackGain を大きくすればするほど、ディレイ音がなかなか消えなくなります。
45                 0.0f を指定すると、ワンショットディレイ(フィードバックなし)になります。
46 
47                 m_Damping は LPF(ローパスフィルタ)のかかり具合に影響します。
48                 この値を大きくすればするほど、カットオフ周波数が下がっていきます。
49                 0.0f にすると、ローパスフィルタはかかりません。
50 
51                 m_IsEnableSurround が true の場合、サラウンド(リアの L と R)
52                 成分もディレイ処理されます。
53                 false の場合は、サラウンド成分のディレイ処理はスキップされます。
54                 false にすると、その分処理負荷や必要となるバッファサイズを減らすことができます。
55                 デフォルトは false です。
56 
57         @date   2010/09/13 初版
58      */
59     struct Param
60     {
61         //! ディレイ時間 (msec) です。初期値は 5 です。
62         u32 m_DelayTime;
63 
64         //! フィードバックゲインです。0.0f 〜 1.0f で指定します。初期値は 0.0f です。
65         f32 m_FeedbackGain;
66 
67         //! LPF のかかり具合です。0.0f 〜 1.0f で指定します。初期値は 0.0f です。
68         f32 m_Damping;
69 
70         //! ディレイ処理をサラウンドチャンネルも有効にするかどうかのフラグです。
71         bool m_IsEnableSurround;
72         NN_PADDING3;
73 
74         /*!
75             @brief  コンストラクタです。
76             @date   2010/09/13 初版
77          */
ParamParam78         Param() : m_DelayTime(5), m_FeedbackGain(0.0f), m_Damping(0.0f), m_IsEnableSurround(false) {}
79     };
80 
81 public:
82     //----------------------------------------------------------------
83     /// @name   コンストラクタ / デストラクタ
84     //----------------------------------------------------------------
85     //@{
86     /*!
87         @brief      コンストラクタです。
88         @date       2010/09/13 初版
89      */
FxDelay()90     FxDelay() : m_Buffer(NULL), m_BufferSize(0), m_AuxBusId(AUX_BUS_NULL), m_IsEnabled(false), m_Channels(0) {}
91 
92     /*!
93         @brief      デストラクタです。
94         @date       2010/09/13 初版
95      */
~FxDelay()96     ~FxDelay() {}
97     //@}
98 
99     /*!
100         @brief      指定したディレイタイムに必要なバッファサイズを計算します。
101         @param[in]  delayTime           ディレイタイム (msec)
102         @param[in]  isEnableSurround    サラウンドチャンネルにも適用するかどうか
103         @return     バッファサイズを返します。
104         @date       2010/09/13 初版
105      */
106     static size_t GetRequiredMemorySize(u32 delayTime, bool isEnableSurround);
107 
108     /*!
109         @brief      FxDelay オブジェクトを AUX バスに関連付けます。
110         @param[in]  id      関連付ける AUX バス ID
111         @param[in]  buffer  ディレイバッファポインタ
112         @param[in]  size    ディレイバッファサイズ
113         @return     成功すれば true を、失敗すれば false を返します。
114         @date       2010/09/13 初版
115      */
116     bool Initialize(AuxBusId id, uptr buffer, size_t size);
117 
118     /*!
119         @brief      FxDelay オブジェクトの AUX バスへの関連付けを解除します。
120         @date       2010/09/13 初版
121      */
122     void Finalize();
123 
124     /*!
125         @brief      パラメータの設定を行います。
126         @param[in]  param   パラメータ
127         @return     成功すれば true を、失敗すれば false を返します。
128         @date       2010/09/13 初版
129      */
130     bool SetParam(const FxDelay::Param& param);
131 
132     /*!
133         @brief      ディレイエフェクトの有効、無効を切り替えます。
134         @param[in]  enable  有効、無効フラグ
135         @return     成功すれば true を、失敗すれば false を返します。
136         @date       2010/09/13 初版
137      */
138     bool Enable(bool enable = true);
139 
140     /*!
141         @brief      ディレイエフェクトを無効にします。
142         @return     成功すれば true を、失敗すれば false を返します。
143         @date       2010/09/13 初版
144      */
Disable()145     bool Disable()
146     {
147         return Enable(false);
148     }
149 
150     /*!
151         @brief      ディレイエフェクトが現在有効かどうかを返します。
152         @return     有効であれば true を、無効であれば false を返します。
153      */
IsEnabled()154     bool IsEnabled()
155     {
156         return m_IsEnabled;
157     }
158 
159 private:
160     bool AssignWorkBuffer(AuxBusId id, uptr buffer, size_t size);
161 
162     void ReleaseWorkBuffer();
163 
164     uptr        m_Buffer;
165     size_t      m_BufferSize;
166 
167     AuxBusId    m_AuxBusId;
168     bool        m_IsEnabled;
169     s8          m_Channels;
170     NN_PADDING1;
171 };
172 
173 }}} // namespace nn::snd::CTR
174 
175 #endif // __cplusplus
176 
177 #endif //NN_SND_VOICE_H_
178