#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
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
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
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
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
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
#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
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
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
// 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
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
}\r
\r
stream_.state = STREAM_STOPPED;\r
+ pah->runnable = false;\r
MUTEX_LOCK( &stream_.mutex );\r
\r
if ( pah && pah->s_play ) {\r
}\r
\r
stream_.state = STREAM_STOPPED;\r
+ pah->runnable = false;\r
MUTEX_LOCK( &stream_.mutex );\r
\r
if ( pah && pah->s_play ) {\r
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