Missing include for roundf().
[rtaudio-cdist.git] / RtAudio.cpp
index 882fa0e2830202407c2f17814c8a4e372947993d..539cdc273a069c2424c8ea2030575bc4e75d1665 100644 (file)
@@ -46,6 +46,7 @@
 #include <cstring>\r
 #include <climits>\r
 #include <algorithm>\r
+#include <cmath>\r
 \r
 // Static variable definitions.\r
 const unsigned int RtApi::MAX_SAMPLE_RATES = 14;\r
@@ -408,7 +409,9 @@ double RtApi :: getStreamTime( void )
   struct timeval then;\r
   struct timeval now;\r
 \r
-  if ( stream_.state != STREAM_RUNNING || stream_.streamTime == 0.0 )\r
+  // If lastTickTimestamp is 0 it means we haven't had a "last tick" since\r
+  // we started the stream.\r
+  if ( stream_.state != STREAM_RUNNING || (stream_.lastTickTimestamp.tv_sec == 0 && stream_.lastTickTimestamp.tv_usec == 0) )\r
     return stream_.streamTime;\r
 \r
   gettimeofday( &now, NULL );\r
@@ -436,6 +439,14 @@ unsigned int RtApi :: getStreamSampleRate( void )
  return stream_.sampleRate;\r
 }\r
 \r
+void RtApi :: startStream( void )\r
+{\r
+#if defined( HAVE_GETTIMEOFDAY )\r
+  stream_.lastTickTimestamp.tv_sec = 0;\r
+  stream_.lastTickTimestamp.tv_usec = 0;\r
+#endif\r
+}\r
+\r
 \r
 // *************************************************** //\r
 //\r
@@ -1475,6 +1486,7 @@ void RtApiCore :: closeStream( void )
 void RtApiCore :: startStream( void )\r
 {\r
   verifyStream();\r
+  RtApi::startStream();\r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiCore::startStream(): the stream is already running!";\r
     error( RtAudioError::WARNING );\r
@@ -2427,6 +2439,7 @@ void RtApiJack :: closeStream( void )
 void RtApiJack :: startStream( void )\r
 {\r
   verifyStream();\r
+  RtApi::startStream();\r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiJack::startStream(): the stream is already running!";\r
     error( RtAudioError::WARNING );\r
@@ -3306,6 +3319,7 @@ bool stopThreadCalled = false;
 void RtApiAsio :: startStream()\r
 {\r
   verifyStream();\r
+  RtApi::startStream();\r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiAsio::startStream(): the stream is already running!";\r
     error( RtAudioError::WARNING );\r
@@ -3682,7 +3696,7 @@ static const char* getAsioErrorString( ASIOError result )
 #include <audioclient.h>\r
 #include <avrt.h>\r
 #include <mmdeviceapi.h>\r
-#include <functiondiscoverykeys_devpkey.h>\r
+#include <FunctionDiscoveryKeys_devpkey.h>\r
 \r
 //=============================================================================\r
 \r
@@ -4317,7 +4331,8 @@ void RtApiWasapi::closeStream( void )
 void RtApiWasapi::startStream( void )\r
 {\r
   verifyStream();\r
-\r
+  RtApi::startStream();\r
+  \r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiWasapi::startStream: The stream is already running.";\r
     error( RtAudioError::WARNING );\r
@@ -6066,6 +6081,8 @@ void RtApiDs :: closeStream()
 void RtApiDs :: startStream()\r
 {\r
   verifyStream();\r
+  RtApi::startStream();\r
+  \r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiDs::startStream(): the stream is already running!";\r
     error( RtAudioError::WARNING );\r
@@ -7743,6 +7760,7 @@ void RtApiAlsa :: startStream()
   // This method calls snd_pcm_prepare if the device isn't already in that state.\r
 \r
   verifyStream();\r
+  RtApi::startStream();\r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiAlsa::startStream(): the stream is already running!";\r
     error( RtAudioError::WARNING );\r
@@ -8293,12 +8311,22 @@ void RtApiPulse::callbackEvent( void )
   MUTEX_UNLOCK( &stream_.mutex );\r
   RtApi::tickStreamTime();\r
 \r
+  if (pah->s_play) {\r
+    int e = 0;\r
+    pa_usec_t const lat = pa_simple_get_latency(pah->s_play, &e);\r
+    if (e == 0) {\r
+      stream_.latency[0] = lat * stream_.sampleRate / 1000000;\r
+    }\r
+  }\r
+\r
   if ( doStopStream == 1 )\r
     stopStream();\r
 }\r
 \r
 void RtApiPulse::startStream( void )\r
 {\r
+  RtApi::startStream();\r
+  \r
   PulseAudioHandle *pah = static_cast<PulseAudioHandle *>( stream_.apiHandle );\r
 \r
   if ( stream_.state == STREAM_CLOSED ) {\r
@@ -8337,6 +8365,7 @@ void RtApiPulse::stopStream( void )
   }\r
 \r
   stream_.state = STREAM_STOPPED;\r
+  pah->runnable = false;\r
   MUTEX_LOCK( &stream_.mutex );\r
 \r
   if ( pah && pah->s_play ) {\r
@@ -8371,6 +8400,7 @@ void RtApiPulse::abortStream( void )
   }\r
 \r
   stream_.state = STREAM_STOPPED;\r
+  pah->runnable = false;\r
   MUTEX_LOCK( &stream_.mutex );\r
 \r
   if ( pah && pah->s_play ) {\r
@@ -9235,6 +9265,7 @@ void RtApiOss :: closeStream()
 void RtApiOss :: startStream()\r
 {\r
   verifyStream();\r
+  RtApi::startStream();\r
   if ( stream_.state == STREAM_RUNNING ) {\r
     errorText_ = "RtApiOss::startStream(): the stream is already running!";\r
     error( RtAudioError::WARNING );\r