againcontroller.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 // Project     : VST SDK
00003 // Version     : 3.0
00004 //
00005 // Category    : Examples
00006 // Filename    : againcontroller.cpp
00007 // Created by  : Steinberg, 04/2005
00008 // Modified    : $Date: 2008/01/09 12:51:05 $
00009 // Description : AGain Controller Example for VST 3.0
00010 //-----------------------------------------------------------------------------
00011 // LICENSE
00012 // © 2008, Steinberg Media Technologies GmbH, All Rights Reserved
00013 //-----------------------------------------------------------------------------
00014 // This Software Development Kit may not be distributed in parts or its entirety  
00015 // without prior written agreement by Steinberg Media Technologies GmbH. 
00016 // This SDK must not be used to re-engineer or manipulate any technology used  
00017 // in any Steinberg or Third-party application or software module, 
00018 // unless permitted by law.
00019 // Neither the name of the Steinberg Media Technologies nor the names of its
00020 // contributors may be used to endorse or promote products derived from this 
00021 // software without specific prior written permission.
00022 // 
00023 // THIS SDK IS PROVIDED BY STEINBERG MEDIA TECHNOLOGIES GMBH "AS IS" AND
00024 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
00025 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00026 // IN NO EVENT SHALL STEINBERG MEDIA TECHNOLOGIES GMBH BE LIABLE FOR ANY DIRECT, 
00027 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
00028 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
00029 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
00030 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
00031 // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
00032 // OF THE POSSIBILITY OF SUCH DAMAGE.
00033 //-----------------------------------------------------------------------------
00034 
00035 #include "againcontroller.h"
00036 #include "againparamids.h"
00037 #include "againeditor.h"
00038 
00039 #include "pluginterfaces/base/ibstream.h"
00040 
00041 #include <stdio.h>
00042 #include <math.h>
00043 
00044 //------------------------------------------------------------------------
00045 // EditorViewElement Declaration: used for view-controller dependency
00046 //------------------------------------------------------------------------
00047 class EditorViewElement : public CArrayElement
00048 {
00049 public:
00050         EditorViewElement (AGainEditorView* view) : view (view) { if (view) view->addRef (); }
00051         ~EditorViewElement () { if (view) view->release (); }
00052 
00053         AGainEditorView* getView () { return view; }
00054 
00055 protected:
00056         AGainEditorView* view;
00057 };
00058 
00059 //------------------------------------------------------------------------
00060 // GainParameter Declaration
00061 // example of custom parameter (overwriting to and fromString)
00062 //------------------------------------------------------------------------
00063 class GainParameter : public Parameter
00064 {
00065 public:
00066         GainParameter (int32 flags, int32 id);
00067 
00068         virtual void toString (ParamValue normValue, String128 string) const;
00069         virtual bool fromString (const TChar* string, ParamValue& normValue) const;
00070 };
00071 
00072 //------------------------------------------------------------------------
00073 // GainParameter Implementation
00074 //------------------------------------------------------------------------
00075 GainParameter::GainParameter (int32 flags, int32 id)
00076 {
00077         Steinberg::UString (info.title, USTRINGSIZE (info.title)).assign (USTRING ("Gain"));
00078         Steinberg::UString (info.units, USTRINGSIZE (info.units)).assign (USTRING ("dB"));
00079         
00080         info.flags = flags;
00081         info.id = id;
00082         info.stepCount = 0;
00083         info.defaultNormalizedValue = 0.5f;
00084         info.unitId = -1;
00085         
00086         setNormalized (1.f);
00087 }
00088 
00089 //------------------------------------------------------------------------
00090 void GainParameter::toString (ParamValue normValue, String128 string) const
00091 {
00092         char text[32];
00093         if (normValue > 0.0001)
00094                 sprintf (text, "%.2f", 20 * log10f ((float)normValue));
00095         else
00096                 strcpy (text, "-oo");
00097 
00098         Steinberg::UString (string, 128).fromAscii (text);
00099 }
00100 
00101 //------------------------------------------------------------------------
00102 bool GainParameter::fromString (const TChar* string, ParamValue& normValue) const
00103 {
00104         Steinberg::UString wrapper ((TChar*)string, -1); // don't know buffer size here!
00105         double tmp = 0.0;
00106         if (wrapper.scanFloat (tmp))
00107         {
00108                 // allow only values between -oo and 0dB
00109                 if (tmp > 0.0)
00110                         tmp = -tmp;
00111 
00112                 normValue = expf (logf (10.f) * (float)tmp / 20.f);
00113                 return true;
00114         }
00115         return false;
00116 }
00117 
00118 
00119 //------------------------------------------------------------------------
00120 // AGainController Implementation
00121 //------------------------------------------------------------------------
00122 tresult PLUGIN_API AGainController::initialize (FUnknown* context)
00123 {
00124         tresult result = EditController::initialize (context);
00125         if (result != kResultOk)
00126                 return result;
00127 
00128         //---Create Parameters------------
00129         
00130         //---Gain parameter--
00131         GainParameter* gainParam = new GainParameter (ParameterInfo::kCanAutomate, kGainId);
00132         parameters.addParameter (gainParam);
00133 
00134         //---VuMeter parameter---
00135         int32 stepCount = 0;
00136         ParamValue defaultVal = 0;
00137         int32 flags = ParameterInfo::kIsReadOnly;
00138         int32 tag = kVuPPMId;
00139         parameters.addParameter (USTRING ("VuPPM"), 0, stepCount, defaultVal, flags, tag);
00140 
00141         //---Bypass parameter---
00142         stepCount = 1;
00143         defaultVal = 0;
00144         flags = ParameterInfo::kCanAutomate|ParameterInfo::kIsBypass;
00145         tag = kBypassId;
00146         parameters.addParameter (USTRING ("Bypass"), 0, stepCount, defaultVal, flags, tag);
00147 
00148         //---Custom state init------------
00149 
00150         UString str (defaultMessageText, 128);
00151         str.fromAscii ("Hello World!");
00152         
00153         return result;
00154 }
00155 
00156 //------------------------------------------------------------------------
00157 tresult PLUGIN_API AGainController::terminate  ()
00158 {
00159         viewsArray.removeAll ();
00160         
00161         return EditController::terminate ();
00162 }
00163 
00164 //------------------------------------------------------------------------
00165 tresult PLUGIN_API AGainController::setComponentState (IBStream* state)
00166 {
00167         // we receive the current state of the component (processor part)
00168         if (state)
00169         {
00170                 float savedGain = 0.f;
00171                 if (state->read (&savedGain, 4) != kResultOk)
00172                         return kResultFalse;
00173 
00174                 setParamNormalized (kGainId, savedGain);
00175         }
00176 
00177         return kResultOk;
00178 }
00179 
00180 //------------------------------------------------------------------------
00181 IPlugView* PLUGIN_API AGainController::createView (const char* name)
00182 {
00183         // someone wants my editor
00184         if (name && strcmp (name, "editor") == 0)
00185                 return new AGainEditorView (this);
00186         return 0;
00187 }
00188 
00189 //------------------------------------------------------------------------
00190 tresult PLUGIN_API AGainController::setState (IBStream* state)
00191 {
00192         tresult result = kResultFalse;
00193 
00194         int8 byteOrder;
00195         if ((result = state->read (&byteOrder, sizeof (int8))) != kResultTrue)
00196                 return result;
00197         if ((result = state->read (defaultMessageText, 128 * sizeof (TChar))) != kResultTrue)
00198                 return result;
00199 
00200         // if the byteorder doesn't match, byte swap the text array ...
00201         if (byteOrder != BYTEORDER)
00202         {
00203                 for (int32 i = 0; i < 128; i++)
00204                         SWAP_16 (defaultMessageText[i])
00205         }
00206 
00207         // update our editors
00208         for (int32 i = 0; i < viewsArray.total (); i++)
00209         {
00210                 EditorViewElement* elt = (EditorViewElement*)viewsArray.at (i);
00211                 if (elt)
00212                         elt->getView ()->messageTextChanged ();
00213         }
00214         
00215         return result;
00216 }
00217 
00218 //------------------------------------------------------------------------
00219 tresult PLUGIN_API AGainController::getState (IBStream* state)
00220 {
00221         // here we can save UI settings for example
00222 
00223         // as we save a Unicode string, we must know the byteorder when setState is called
00224         int8 byteOrder = BYTEORDER;
00225         if (state->write (&byteOrder, sizeof (int8)) == kResultTrue)
00226                 return state->write (defaultMessageText, 128 * sizeof (TChar));
00227         return kResultFalse;
00228 }
00229 
00230 //------------------------------------------------------------------------
00231 tresult AGainController::receiveText (const char* text)
00232 {
00233         // received from Component
00234         if (text)
00235         {
00236                 fprintf (stderr, "[AGainController] received: ");
00237                 fprintf (stderr, text);
00238                 fprintf (stderr, "\n");
00239         }
00240         return kResultOk;
00241 }
00242 
00243 //------------------------------------------------------------------------
00244 tresult PLUGIN_API AGainController::setParamNormalized (ParamID tag, ParamValue value)
00245 {
00246         // called from host to update our parameters state
00247         tresult result = EditController::setParamNormalized (tag, value);
00248         
00249         for (int32 i = 0; i < viewsArray.total (); i++)
00250         {
00251                 EditorViewElement* elt = (EditorViewElement*)viewsArray.at (i);
00252                 if (elt && elt->getView ())
00253                 {
00254                         elt->getView ()->update (tag, value);
00255                 }
00256         }
00257 
00258         return result;
00259 }
00260 
00261 //------------------------------------------------------------------------
00262 tresult PLUGIN_API AGainController::getParamStringByValue (ParamID tag, ParamValue valueNormalized, String128 string)
00263 {
00264         /* example
00265         switch (tag)
00266         {
00267                 case kGainId:
00268                 {
00269                         char text[32];
00270                         if (valueNormalized > 0.0001)
00271                         {
00272                                 sprintf (text, "%.2f", 20 * log10f ((float)valueNormalized));
00273                         }
00274                         else
00275                                 strcpy (text, "-oo");
00276 
00277                         Steinberg::UString (string, 128).fromAscii (text);
00278 
00279                         return kResultTrue;
00280                 }
00281         }*/
00282         return EditController::getParamStringByValue (tag, valueNormalized, string);
00283 }
00284 
00285 //------------------------------------------------------------------------
00286 tresult PLUGIN_API AGainController::getParamValueByString (ParamID tag, TChar* string, ParamValue& valueNormalized)
00287 {
00288         /* example
00289         switch (tag)
00290         {
00291                 case kGainId:
00292                 {
00293                         Steinberg::UString wrapper ((TChar*)string, -1); // don't know buffer size here!
00294                         double tmp = 0.0;
00295                         if (wrapper.scanFloat (tmp))
00296                         {
00297                                 valueNormalized = expf (logf (10.f) * (float)tmp / 20.f);
00298                                 return kResultTrue;
00299                         }
00300                         return kResultFalse;
00301                 }
00302         }*/
00303         return EditController::getParamValueByString (tag, string, valueNormalized);
00304 }
00305 
00306 //------------------------------------------------------------------------
00307 void AGainController::addDependentView (AGainEditorView* view)
00308 {
00309         EditorViewElement* elt = new EditorViewElement (view);
00310         viewsArray.add (elt);
00311 }
00312 
00313 //------------------------------------------------------------------------
00314 void AGainController::removeDependentView (AGainEditorView* view)
00315 {
00316         for (int32 i = 0; i < viewsArray.total (); i++)
00317         {
00318                 EditorViewElement* elt = (EditorViewElement*)viewsArray.at (i);
00319                 if (elt)
00320                 {
00321                         if (elt->getView () == view)
00322                         {
00323                                 viewsArray.removeAt (i);
00324                                 break;
00325                         }
00326                 }
00327         }
00328 }
00329 
00330 //------------------------------------------------------------------------
00331 void AGainController::setDefaultMessageText (String128 text)
00332 {
00333         UString str (defaultMessageText, 128);
00334         str.assign (text, -1);
00335 }
00336 
00337 //------------------------------------------------------------------------
00338 TChar* AGainController::getDefaultMessageText ()
00339 {
00340         return defaultMessageText;
00341 }
Empty

Copyright ©2008 Steinberg Media Technologies. All Rights Reserved.