summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Scavone <gary@music.mcgill.ca>2008-01-24 20:26:40 +0000
committerStephen Sinclair <sinclair@music.mcgill.ca>2013-10-11 01:38:22 +0200
commitee94b95a993d091d1ab7826951498b03bb6dbbbc (patch)
tree39224307d98bfa8438fd620c3f907d611afc4198
parent637f7dc5e805bad55dba7fb7693a45f5992b2ae7 (diff)
Various updates in ALSA for probing while device is open and in Windows for thread priority (gps).
-rw-r--r--Makefile.in2
-rw-r--r--RtAudio.cpp36
-rw-r--r--RtAudio.h6
-rw-r--r--configure.ac8
-rw-r--r--doc/release.txt5
-rw-r--r--rtaudio-config.in2
-rw-r--r--tests/Makefile.in2
7 files changed, 50 insertions, 11 deletions
diff --git a/Makefile.in b/Makefile.in
index 57df82b..23a444f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -13,7 +13,7 @@ RANLIB = @RANLIB@
DEFS = @debug@
DEFS += @audio_apis@
-CFLAGS = @cflags@ -Iinclude
+CFLAGS = @CFLAGS@ -Iinclude
CFLAGS += @warn@
all : $(LIBRARY)
diff --git a/RtAudio.cpp b/RtAudio.cpp
index de7219f..f879244 100644
--- a/RtAudio.cpp
+++ b/RtAudio.cpp
@@ -3683,8 +3683,10 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned
while ( dsPointerLeadTime * 2U > (DWORD) bufferBytes )
bufferBytes *= 2;
- // Set cooperative level to DSSCL_EXCLUSIVE
- result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE );
+ // Set cooperative level to DSSCL_EXCLUSIVE ... sound stops when window focus changes.
+ //result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE );
+ // Set cooperative level to DSSCL_PRIORITY ... sound remains when window focus changes.
+ result = output->SetCooperativeLevel( hWnd, DSSCL_PRIORITY );
if ( FAILED( result ) ) {
output->Release();
errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsinfo.name << ")!";
@@ -4938,6 +4940,18 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device )
foundDevice:
+ // If a stream is already open, we cannot probe the stream devices.
+ // Thus, use the saved results.
+ if ( stream_.state != STREAM_CLOSED &&
+ ( stream_.device[0] == device || stream_.device[1] == device ) ) {
+ if ( device >= devices_.size() ) {
+ errorText_ = "RtApiAlsa::getDeviceInfo: device ID was not present before stream was opened.";
+ error( RtError::WARNING );
+ return info;
+ }
+ return devices_[ device ];
+ }
+
int openMode = SND_PCM_ASYNC;
snd_pcm_stream_t stream;
snd_pcm_info_t *pcminfo;
@@ -5132,6 +5146,16 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device )
return info;
}
+void RtApiAlsa :: saveDeviceInfo( void )
+{
+ devices_.clear();
+
+ unsigned int nDevices = getDeviceCount();
+ devices_.resize( nDevices );
+ for ( unsigned int i=0; i<nDevices; i++ )
+ devices_[i] = getDeviceInfo( i );
+}
+
bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
unsigned int firstChannel, unsigned int sampleRate,
RtAudioFormat format, unsigned int *bufferSize,
@@ -5191,6 +5215,12 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne
foundDevice:
+ // The getDeviceInfo() function will not work for a device that is
+ // already open. Thus, we'll probe the system before opening a
+ // stream and save the results for use by getDeviceInfo().
+ if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) // only do once
+ this->saveDeviceInfo();
+
snd_pcm_stream_t stream;
if ( mode == OUTPUT )
stream = SND_PCM_STREAM_PLAYBACK;
@@ -6911,7 +6941,7 @@ void RtApi :: clearStreamInfo()
stream_.callbackInfo.userData = 0;
stream_.callbackInfo.isRunning = false;
for ( int i=0; i<2; i++ ) {
- stream_.device[i] = 0;
+ stream_.device[i] = 11111;
stream_.doConvertBuffer[i] = false;
stream_.deviceInterleaved[i] = true;
stream_.doByteSwap[i] = false;
diff --git a/RtAudio.h b/RtAudio.h
index 5e0666d..e7314c7 100644
--- a/RtAudio.h
+++ b/RtAudio.h
@@ -10,7 +10,7 @@
RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/
RtAudio: realtime audio i/o C++ classes
- Copyright (c) 2001-2007 Gary P. Scavone
+ Copyright (c) 2001-2008 Gary P. Scavone
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
@@ -617,7 +617,7 @@ protected:
#endif
RtApiStream()
- :apiHandle(0), deviceBuffer(0) {}
+ :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; }
};
typedef signed short Int16;
@@ -867,6 +867,8 @@ public:
private:
+ std::vector<RtAudio::DeviceInfo> devices_;
+ void saveDeviceInfo( void );
bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
unsigned int firstChannel, unsigned int sampleRate,
RtAudioFormat format, unsigned int *bufferSize,
diff --git a/configure.ac b/configure.ac
index 5949a5e..027dae0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -30,13 +30,15 @@ AC_ARG_ENABLE(debug,
[AC_SUBST( debug, [] ) AC_SUBST( cflags, [-O2] ) AC_SUBST( object_path, [Release] ) AC_MSG_RESULT(no)])
# Checks for functions
-AC_CHECK_FUNC(gettimeofday, [cflags=$cflags" -DHAVE_GETTIMEOFDAY"], )
+AC_CHECK_FUNC(gettimeofday, [CFLAGS=$CFLAGS" -DHAVE_GETTIMEOFDAY"], )
# Check compiler and use -Wall if gnu.
if [test $GXX = "yes" ;] then
AC_SUBST( warn, [-Wall] )
fi
+CFLAGS="$CFLAGS $cflags"
+
# Checks for package options and external software
AC_CANONICAL_HOST
AC_MSG_CHECKING(for audio API)
@@ -45,7 +47,7 @@ case $host in
AC_SUBST( sound_api, [-D__LINUX_OSS__] )
AC_MSG_RESULT(using OSS)
AC_SUBST( audio_apis, [-D__LINUX_OSS__] )
- cflags=$cflags" -lossaudio"
+ CFLAGS=$CFLAGS" -lossaudio"
AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(RtAudio requires the pthread library!))
;;
@@ -56,7 +58,7 @@ case $host in
TEMP_LIBS=$LIBS
AC_CHECK_LIB(jack, jack_client_new, , AC_MSG_ERROR(JACK support requires the jack library!))
AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(Jack support also requires the asound library!))
- LIBS="`pkg-config --cflags --libs jack` $TEMP_LIBS -lasound"
+ LIBS="`pkg-config --CFLAGS --libs jack` $TEMP_LIBS -lasound"
audio_apis="-D__UNIX_JACK__"
fi
diff --git a/doc/release.txt b/doc/release.txt
index 8fc6384..b712254 100644
--- a/doc/release.txt
+++ b/doc/release.txt
@@ -3,8 +3,13 @@ RtAudio - a set of C++ classes that provide a common API for realtime audio inpu
By Gary P. Scavone, 2001-2008.
v4.0.4: ()
+- added functionality to allow getDeviceInfo() to work in ALSA on an open device (like ASIO)
+- fixes in configure script
- fixed clearing of error message stream in error()
- fixed RtAudio::DeviceInfo description in "probing" documentation
+- memory leak fixes in ALSA and OSS
+- Jack in/out port flag fix
+- Windows changes for thread priority and GLOBALFOCUS
v4.0.3: (7 December 2007)
- added support for MinGW compiler to configure script
diff --git a/rtaudio-config.in b/rtaudio-config.in
index f950f4e..c689a98 100644
--- a/rtaudio-config.in
+++ b/rtaudio-config.in
@@ -9,7 +9,7 @@ CFLAGS="@audio_apis@"
if (test "x$1" == "x--libs") ; then
echo "$LIBRARY"
-elif (test "x$1" == "x--cflags") ; then
+elif (test "x$1" == "x--CFLAGS") ; then
echo "$CFLAGS"
else
echo "Unknown option: $1"
diff --git a/tests/Makefile.in b/tests/Makefile.in
index ec41447..059b5ce 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -13,7 +13,7 @@ OBJECTS = RtAudio.o @objects@
CC = @CXX@
DEFS = @debug@
DEFS += @audio_apis@
-CFLAGS = @cflags@
+CFLAGS = @CFLAGS@
CFLAGS += @warn@ -I$(INCLUDE) -I../include
LIBRARY = @LIBS@
LIBRARY += @frameworks@