Fix to initialize lastTickTimestamp when setting stream time.
[rtaudio-cdist.git] / RtAudio.cpp
index 5ab4c780c02675475932ff171db6bc4e16a56beb..5d49366358f450fcfdf400206b31df22437e7673 100644 (file)
@@ -45,6 +45,7 @@
 #include <cstdlib>\r
 #include <cstring>\r
 #include <climits>\r
+#include <cmath>\r
 #include <algorithm>\r
 \r
 // Static variable definitions.\r
@@ -92,12 +93,12 @@ const unsigned int RtApi::SAMPLE_RATES[] = {
 //\r
 // *************************************************** //\r
 \r
-std::string RtAudio :: getVersion( void ) throw()\r
+std::string RtAudio :: getVersion( void )\r
 {\r
   return RTAUDIO_VERSION;\r
 }\r
 \r
-void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis ) throw()\r
+void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis )\r
 {\r
   apis.clear();\r
 \r
@@ -209,7 +210,7 @@ RtAudio :: RtAudio( RtAudio::Api api )
   throw( RtAudioError( errorText, RtAudioError::UNSPECIFIED ) );\r
 }\r
 \r
-RtAudio :: ~RtAudio() throw()\r
+RtAudio :: ~RtAudio()\r
 {\r
   if ( rtapi_ )\r
     delete rtapi_;\r
@@ -427,6 +428,9 @@ void RtApi :: setStreamTime( double time )
 \r
   if ( time >= 0.0 )\r
     stream_.streamTime = time;\r
+#if defined( HAVE_GETTIMEOFDAY )\r
+  gettimeofday( &stream_.lastTickTimestamp, NULL );\r
+#endif\r
 }\r
 \r
 unsigned int RtApi :: getStreamSampleRate( void )\r
@@ -3875,7 +3879,7 @@ void convertBufferWasapi( char* outBuffer,
   float sampleStep = 1.0f / sampleRatio;\r
   float inSampleFraction = 0.0f;\r
 \r
-  outSampleCount = ( unsigned int ) roundf( inSampleCount * sampleRatio );\r
+  outSampleCount = ( unsigned int ) std::roundf( inSampleCount * sampleRatio );\r
 \r
   // if inSampleRate is a multiple of outSampleRate (or vice versa) there's no need to interpolate\r
   if ( floor( sampleRatio ) == sampleRatio || floor( sampleRatioInv ) == sampleRatioInv )\r
@@ -3925,11 +3929,10 @@ void convertBufferWasapi( char* outBuffer,
       {\r
         case RTAUDIO_SINT8:\r
         {\r
-          char* convInBuffer = ( char* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            char fromSample = convInBuffer[ frameInSample + channel ];\r
-            char toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            char fromSample = ( ( char* ) inBuffer )[ frameInSample + channel ];\r
+            char toSample = ( ( char* ) inBuffer )[ frameInSample + channelCount + channel ];\r
             char sampleDiff = ( char ) ( ( toSample - fromSample ) * inSampleDec );\r
             ( ( char* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
@@ -3937,11 +3940,10 @@ void convertBufferWasapi( char* outBuffer,
         }\r
         case RTAUDIO_SINT16:\r
         {\r
-          short* convInBuffer = ( short* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            short fromSample = convInBuffer[ frameInSample + channel ];\r
-            short toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            short fromSample = ( ( short* ) inBuffer )[ frameInSample + channel ];\r
+            short toSample = ( ( short* ) inBuffer )[ frameInSample + channelCount + channel ];\r
             short sampleDiff = ( short ) ( ( toSample - fromSample ) * inSampleDec );\r
             ( ( short* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
@@ -3949,11 +3951,10 @@ void convertBufferWasapi( char* outBuffer,
         }\r
         case RTAUDIO_SINT24:\r
         {\r
-          S24* convInBuffer = ( S24* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            int fromSample = convInBuffer[ frameInSample + channel ].asInt();\r
-            int toSample = convInBuffer[ frameInSample + channelCount + channel ].asInt();\r
+            int fromSample = ( ( S24* ) inBuffer )[ frameInSample + channel ].asInt();\r
+            int toSample = ( ( S24* ) inBuffer )[ frameInSample + channelCount + channel ].asInt();\r
             int sampleDiff = ( int ) ( ( toSample - fromSample ) * inSampleDec );\r
             ( ( S24* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
@@ -3961,11 +3962,10 @@ void convertBufferWasapi( char* outBuffer,
         }\r
         case RTAUDIO_SINT32:\r
         {\r
-          int* convInBuffer = ( int* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            int fromSample = convInBuffer[ frameInSample + channel ];\r
-            int toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            int fromSample = ( ( int* ) inBuffer )[ frameInSample + channel ];\r
+            int toSample = ( ( int* ) inBuffer )[ frameInSample + channelCount + channel ];\r
             int sampleDiff = ( int ) ( ( toSample - fromSample ) * inSampleDec );\r
             ( ( int* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
@@ -3973,11 +3973,10 @@ void convertBufferWasapi( char* outBuffer,
         }\r
         case RTAUDIO_FLOAT32:\r
         {\r
-          float* convInBuffer = ( float* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            float fromSample = convInBuffer[ frameInSample + channel ];\r
-            float toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            float fromSample = ( ( float* ) inBuffer )[ frameInSample + channel ];\r
+            float toSample = ( ( float* ) inBuffer )[ frameInSample + channelCount + channel ];\r
             float sampleDiff = ( toSample - fromSample ) * inSampleDec;\r
             ( ( float* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
@@ -3985,11 +3984,10 @@ void convertBufferWasapi( char* outBuffer,
         }\r
         case RTAUDIO_FLOAT64:\r
         {\r
-          double* convInBuffer = ( double* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            double fromSample = convInBuffer[ frameInSample + channel ];\r
-            double toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            double fromSample = ( ( double* ) inBuffer )[ frameInSample + channel ];\r
+            double toSample = ( ( double* ) inBuffer )[ frameInSample + channelCount + channel ];\r
             double sampleDiff = ( toSample - fromSample ) * inSampleDec;\r
             ( ( double* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
@@ -5369,8 +5367,8 @@ RtApiDs :: RtApiDs()
 \r
 RtApiDs :: ~RtApiDs()\r
 {\r
-  if ( coInitialized_ ) CoUninitialize(); // balanced call.\r
   if ( stream_.state != STREAM_CLOSED ) closeStream();\r
+  if ( coInitialized_ ) CoUninitialize(); // balanced call.\r
 }\r
 \r
 // The DirectSound default output is always the first device.\r
@@ -8789,8 +8787,10 @@ RtAudio::DeviceInfo RtApiOss :: getDeviceInfo( unsigned int device )
     info.nativeFormats |= RTAUDIO_SINT8;\r
   if ( mask & AFMT_S32_LE || mask & AFMT_S32_BE )\r
     info.nativeFormats |= RTAUDIO_SINT32;\r
+#ifdef AFMT_FLOAT\r
   if ( mask & AFMT_FLOAT )\r
     info.nativeFormats |= RTAUDIO_FLOAT32;\r
+#endif\r
   if ( mask & AFMT_S24_LE || mask & AFMT_S24_BE )\r
     info.nativeFormats |= RTAUDIO_SINT24;\r
 \r
@@ -9117,7 +9117,7 @@ bool RtApiOss :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned
   }\r
 \r
   // Verify the sample rate setup worked.\r
-  if ( abs( srate - sampleRate ) > 100 ) {\r
+  if ( abs( srate - (int)sampleRate ) > 100 ) {\r
     close( fd );\r
     errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support sample rate (" << sampleRate << ").";\r
     errorText_ = errorStream_.str();\r