diff stk/include/WvOut.h @ 0:4606bd505630 tip

first import
author Fiore Martin <f.martin@qmul.ac.uk>
date Sat, 13 Jun 2015 15:08:10 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stk/include/WvOut.h	Sat Jun 13 15:08:10 2015 +0100
@@ -0,0 +1,85 @@
+#ifndef STK_WVOUT_H
+#define STK_WVOUT_H
+
+#include "Stk.h"
+
+namespace stk {
+
+/***************************************************/
+/*! \class WvOut
+    \brief STK audio output abstract base class.
+
+    This class provides common functionality for a variety of audio
+    data output subclasses.
+
+    Currently, WvOut is non-interpolating and the output rate is
+    always Stk::sampleRate().
+
+    by Perry R. Cook and Gary P. Scavone, 1995--2014.
+*/
+/***************************************************/
+
+class WvOut : public Stk
+{
+ public:
+
+  //! Default constructor.
+  WvOut( void ) : frameCounter_(0), clipping_(false) {};
+
+  //! Return the number of sample frames output.
+  unsigned long getFrameCount( void ) const { return frameCounter_; };
+
+  //! Return the number of seconds of data output.
+  StkFloat getTime( void ) const { return (StkFloat) frameCounter_ / Stk::sampleRate(); };
+
+  //! Returns \c true if clipping has been detected during output since instantiation or the last reset.
+  bool clipStatus( void ) { return clipping_; };
+
+  //! Reset the clipping status to \c false.
+  void resetClipStatus( void ) { clipping_ = false; };
+
+  //! Output a single sample to all channels in a sample frame.
+  /*!
+    An StkError is thrown if an output error occurs.
+  */
+  virtual void tick( const StkFloat sample ) = 0;
+
+  //! Output the StkFrames data.
+  virtual void tick( const StkFrames& frames ) = 0;
+
+ protected:
+
+  // Check for sample clipping and clamp.
+  StkFloat& clipTest( StkFloat& sample );
+
+  StkFrames data_;
+  unsigned long frameCounter_;
+  bool clipping_;
+
+};
+
+inline StkFloat& WvOut :: clipTest( StkFloat& sample )
+{
+  bool clip = false;
+  if ( sample > 1.0 ) {
+    sample = 1.0;
+    clip = true;
+  }
+  else if ( sample < -1.0 ) {
+    sample = -1.0;
+    clip = true;
+  }
+
+  if ( clip == true && clipping_ == false ) {
+    // First occurrence of clipping since instantiation or reset.
+    clipping_ = true;
+    oStream_ << "WvOut: data value(s) outside +-1.0 detected ... clamping at outer bound!";
+    handleError( StkError::WARNING );
+  }
+
+  return sample;
+}
+
+} // stk namespace
+
+#endif