From a4f8006d958d592cc17ca8b08f5fc2d93ae0e9be Mon Sep 17 00:00:00 2001 From: Gary Scavone Date: Fri, 27 Dec 2013 16:09:21 -0800 Subject: [PATCH] Hades and Koegler patches for ALSA and general efficiency. --- RtAudio.cpp | 14 ++++++++------ RtAudio.h | 8 ++++---- doc/release.txt | 3 +++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/RtAudio.cpp b/RtAudio.cpp index baaf24e..1562e85 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -213,6 +213,7 @@ RtApi :: RtApi() stream_.userBuffer[1] = 0; MUTEX_INITIALIZE( &stream_.mutex ); showWarnings_ = true; + firstErrorOccurred = false; } RtApi :: ~RtApi() @@ -6089,6 +6090,7 @@ void RtApiAlsa :: startStream() } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { + result = snd_pcm_drop(handle[1]); // fix to remove stale data received since device has been open state = snd_pcm_state( handle[1] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[1] ); @@ -6103,7 +6105,7 @@ void RtApiAlsa :: startStream() stream_.state = STREAM_RUNNING; unlock: - apiInfo->runnable = true; + apiInfo->runnable = false; // fixes high CPU usage when stopped pthread_cond_signal( &apiInfo->runnable_cv ); MUTEX_UNLOCK( &stream_.mutex ); @@ -6148,6 +6150,7 @@ void RtApiAlsa :: stopStream() } unlock: + apiInfo->runnable = false; // fixes high CPU usage when stopped MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; @@ -6891,7 +6894,7 @@ bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, #include #include #include -#include "soundcard.h" +#include #include #include @@ -7837,12 +7840,11 @@ void RtApi :: error( RtAudioError::Type type ) RtAudioErrorCallback errorCallback = (RtAudioErrorCallback) stream_.callbackInfo.errorCallback; if ( errorCallback ) { // abortStream() can generate new error messages. Ignore them. Just keep original one. - static bool firstErrorOccured = false; - if ( firstErrorOccured ) + if ( firstErrorOccurred ) return; - firstErrorOccured = true; + firstErrorOccurred = true; const std::string errorMessage = errorText_; if ( type != RtAudioError::WARNING && stream_.state != STREAM_STOPPED) { @@ -7851,7 +7853,7 @@ void RtApi :: error( RtAudioError::Type type ) } errorCallback( type, errorMessage ); - firstErrorOccured = false; + firstErrorOccurred = false; return; } diff --git a/RtAudio.h b/RtAudio.h index f640a3f..2be313d 100644 --- a/RtAudio.h +++ b/RtAudio.h @@ -50,8 +50,7 @@ #include #include -// RtAudio version -static const std::string RTAUDIO_VERSION( "4.1.0pre" ); +// RtAudio version: 4.1.0pre /*! \typedef typedef unsigned long RtAudioFormat; \brief RtAudio data format type. @@ -375,7 +374,7 @@ class RtAudio }; //! A static function to determine the current RtAudio version. - static std::string getVersion( void ) { return RTAUDIO_VERSION; } + static std::string getVersion( void ) { return "4.1.0"; } //! A static function to determine the available compiled audio APIs. /*! @@ -572,7 +571,7 @@ class RtAudio #include #include - typedef unsigned long ThreadHandle; + typedef ULONG_PTR ThreadHandle; typedef CRITICAL_SECTION StreamMutex; #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) @@ -762,6 +761,7 @@ protected: std::string errorText_; bool showWarnings_; RtApiStream stream_; + bool firstErrorOccurred; /*! Protected, api-specific method that attempts to open a device diff --git a/doc/release.txt b/doc/release.txt index 7cbd9df..839d6ab 100644 --- a/doc/release.txt +++ b/doc/release.txt @@ -4,6 +4,9 @@ By Gary P. Scavone, 2001-2014. v4.1.0: (?? 2014) - RtError class renamed RtAudioError and embedded in RtAudio.h (RtError.h deleted) +- pulse audio update to support bufferFrames argument with audio input (thanks to Jonatan Wallmander) +- fixes for ALSA API to avoid high CPU usage during stops and to clear stale data before input (thanks to Pluto Hades) +- miscellaneous efficiency updates suggested by Martin Koegler v4.0.12: (16 April 2013) - new functionality to allow error reporting via a client-supplied function (thanks to Pavel Mogilevskiy)