From 6befb5faa6fa95ca63ec62e240263f79c79432e2 Mon Sep 17 00:00:00 2001 From: Gary Scavone Date: Mon, 10 Dec 2012 19:03:43 +0000 Subject: [PATCH] Updates for SCHED_RR in ALSA API, plus support in configure for powerpc64 (gs). --- RtAudio.cpp | 23 +++++++++++++++-------- RtAudio.h | 4 +++- config/config.sub | 10 +++++++--- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/RtAudio.cpp b/RtAudio.cpp index 8477ef9..68dabff 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -5881,22 +5881,21 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); + #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { - struct sched_param param; + // We previously attempted to increase the audio callback priority + // to SCHED_RR here via the attributes. However, while no errors + // were reported in doing so, it did not work. So, now this is + // done in the alsaCallbackHandler function. + stream_.callbackInfo.doRealtime = true; int priority = options->priority; int min = sched_get_priority_min( SCHED_RR ); int max = sched_get_priority_max( SCHED_RR ); if ( priority < min ) priority = min; else if ( priority > max ) priority = max; - param.sched_priority = priority; - pthread_attr_setschedpolicy( &attr, SCHED_RR ); - pthread_attr_setschedparam( &attr, ¶m ); + stream_.callbackInfo.priority = priority; } - else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #endif stream_.callbackInfo.isRunning = true; @@ -6314,6 +6313,14 @@ extern "C" void *alsaCallbackHandler( void *ptr ) RtApiAlsa *object = (RtApiAlsa *) info->object; bool *isRunning = &info->isRunning; +#ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) + if ( &info->doRealtime ) { + pthread_t tID = pthread_self(); // ID of this thread + sched_param prio = { info->priority }; // scheduling priority of thread + pthread_setschedparam( tID, SCHED_RR, &prio ); + } +#endif + while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); diff --git a/RtAudio.h b/RtAudio.h index f725124..4a0b9f3 100644 --- a/RtAudio.h +++ b/RtAudio.h @@ -537,10 +537,12 @@ struct CallbackInfo { void *userData; void *apiInfo; // void pointer for API specific callback information bool isRunning; + bool doRealtime; + int priority; // Default constructor. CallbackInfo() - :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {} + :object(0), callback(0), userData(0), apiInfo(0), isRunning(false), doRealtime(false) {} }; // **************************************************************** // diff --git a/config/config.sub b/config/config.sub index 7d3f49f..9a7d59a 100755 --- a/config/config.sub +++ b/config/config.sub @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. -timestamp='2004-02-26' +timestamp='2012-11-19' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -225,7 +225,7 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ | alphaev6[78] \ | we32k | ns16k | clipper | i370 | sh | sh[34] \ - | powerpc | powerpcle \ + | powerpc | powerpc64 | powerpcle \ | 1750a | dsp16xx | pdp10 | pdp11 \ | mips16 | mips64 | mipsel | mips64el \ | mips64orion | mips64orionel | mipstx39 | mipstx39el \ @@ -271,7 +271,7 @@ case $basic_machine in | alphaev6[78]-* \ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ | clipper-* | orion-* \ - | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpc64-* | powerpcle-* \ | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \ | mips16-* | mips64-* | mipsel-* \ | mips64el-* | mips64orion-* | mips64orionel-* \ @@ -721,6 +721,10 @@ case $basic_machine in ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; -- 2.30.2