@@ -13,7 +13,7 @@ RANLIB = @RANLIB@ | |||||
DEFS = @debug@ | DEFS = @debug@ | ||||
DEFS += @audio_apis@ | DEFS += @audio_apis@ | ||||
CFLAGS = @cflags@ -Iinclude | |||||
CFLAGS = @CFLAGS@ -Iinclude | |||||
CFLAGS += @warn@ | CFLAGS += @warn@ | ||||
all : $(LIBRARY) | all : $(LIBRARY) | ||||
@@ -3683,8 +3683,10 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned | |||||
while ( dsPointerLeadTime * 2U > (DWORD) bufferBytes ) | while ( dsPointerLeadTime * 2U > (DWORD) bufferBytes ) | ||||
bufferBytes *= 2; | 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 ) ) { | if ( FAILED( result ) ) { | ||||
output->Release(); | output->Release(); | ||||
errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsinfo.name << ")!"; | errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsinfo.name << ")!"; | ||||
@@ -4938,6 +4940,18 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) | |||||
foundDevice: | 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; | int openMode = SND_PCM_ASYNC; | ||||
snd_pcm_stream_t stream; | snd_pcm_stream_t stream; | ||||
snd_pcm_info_t *pcminfo; | snd_pcm_info_t *pcminfo; | ||||
@@ -5132,6 +5146,16 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) | |||||
return info; | 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, | bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | ||||
unsigned int firstChannel, unsigned int sampleRate, | unsigned int firstChannel, unsigned int sampleRate, | ||||
RtAudioFormat format, unsigned int *bufferSize, | RtAudioFormat format, unsigned int *bufferSize, | ||||
@@ -5191,6 +5215,12 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne | |||||
foundDevice: | 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; | snd_pcm_stream_t stream; | ||||
if ( mode == OUTPUT ) | if ( mode == OUTPUT ) | ||||
stream = SND_PCM_STREAM_PLAYBACK; | stream = SND_PCM_STREAM_PLAYBACK; | ||||
@@ -6911,7 +6941,7 @@ void RtApi :: clearStreamInfo() | |||||
stream_.callbackInfo.userData = 0; | stream_.callbackInfo.userData = 0; | ||||
stream_.callbackInfo.isRunning = false; | stream_.callbackInfo.isRunning = false; | ||||
for ( int i=0; i<2; i++ ) { | for ( int i=0; i<2; i++ ) { | ||||
stream_.device[i] = 0; | |||||
stream_.device[i] = 11111; | |||||
stream_.doConvertBuffer[i] = false; | stream_.doConvertBuffer[i] = false; | ||||
stream_.deviceInterleaved[i] = true; | stream_.deviceInterleaved[i] = true; | ||||
stream_.doByteSwap[i] = false; | stream_.doByteSwap[i] = false; | ||||
@@ -10,7 +10,7 @@ | |||||
RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ | RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ | ||||
RtAudio: realtime audio i/o C++ classes | 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 | Permission is hereby granted, free of charge, to any person | ||||
obtaining a copy of this software and associated documentation files | obtaining a copy of this software and associated documentation files | ||||
@@ -617,7 +617,7 @@ protected: | |||||
#endif | #endif | ||||
RtApiStream() | RtApiStream() | ||||
:apiHandle(0), deviceBuffer(0) {} | |||||
:apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } | |||||
}; | }; | ||||
typedef signed short Int16; | typedef signed short Int16; | ||||
@@ -867,6 +867,8 @@ public: | |||||
private: | private: | ||||
std::vector<RtAudio::DeviceInfo> devices_; | |||||
void saveDeviceInfo( void ); | |||||
bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | ||||
unsigned int firstChannel, unsigned int sampleRate, | unsigned int firstChannel, unsigned int sampleRate, | ||||
RtAudioFormat format, unsigned int *bufferSize, | RtAudioFormat format, unsigned int *bufferSize, | ||||
@@ -30,13 +30,15 @@ AC_ARG_ENABLE(debug, | |||||
[AC_SUBST( debug, [] ) AC_SUBST( cflags, [-O2] ) AC_SUBST( object_path, [Release] ) AC_MSG_RESULT(no)]) | [AC_SUBST( debug, [] ) AC_SUBST( cflags, [-O2] ) AC_SUBST( object_path, [Release] ) AC_MSG_RESULT(no)]) | ||||
# Checks for functions | # 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. | # Check compiler and use -Wall if gnu. | ||||
if [test $GXX = "yes" ;] then | if [test $GXX = "yes" ;] then | ||||
AC_SUBST( warn, [-Wall] ) | AC_SUBST( warn, [-Wall] ) | ||||
fi | fi | ||||
CFLAGS="$CFLAGS $cflags" | |||||
# Checks for package options and external software | # Checks for package options and external software | ||||
AC_CANONICAL_HOST | AC_CANONICAL_HOST | ||||
AC_MSG_CHECKING(for audio API) | AC_MSG_CHECKING(for audio API) | ||||
@@ -45,7 +47,7 @@ case $host in | |||||
AC_SUBST( sound_api, [-D__LINUX_OSS__] ) | AC_SUBST( sound_api, [-D__LINUX_OSS__] ) | ||||
AC_MSG_RESULT(using OSS) | AC_MSG_RESULT(using OSS) | ||||
AC_SUBST( audio_apis, [-D__LINUX_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!)) | AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(RtAudio requires the pthread library!)) | ||||
;; | ;; | ||||
@@ -56,7 +58,7 @@ case $host in | |||||
TEMP_LIBS=$LIBS | TEMP_LIBS=$LIBS | ||||
AC_CHECK_LIB(jack, jack_client_new, , AC_MSG_ERROR(JACK support requires the jack library!)) | 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!)) | 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__" | audio_apis="-D__UNIX_JACK__" | ||||
fi | fi | ||||
@@ -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. | By Gary P. Scavone, 2001-2008. | ||||
v4.0.4: () | 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 clearing of error message stream in error() | ||||
- fixed RtAudio::DeviceInfo description in "probing" documentation | - 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) | v4.0.3: (7 December 2007) | ||||
- added support for MinGW compiler to configure script | - added support for MinGW compiler to configure script | ||||
@@ -9,7 +9,7 @@ CFLAGS="@audio_apis@" | |||||
if (test "x$1" == "x--libs") ; then | if (test "x$1" == "x--libs") ; then | ||||
echo "$LIBRARY" | echo "$LIBRARY" | ||||
elif (test "x$1" == "x--cflags") ; then | |||||
elif (test "x$1" == "x--CFLAGS") ; then | |||||
echo "$CFLAGS" | echo "$CFLAGS" | ||||
else | else | ||||
echo "Unknown option: $1" | echo "Unknown option: $1" | ||||
@@ -13,7 +13,7 @@ OBJECTS = RtAudio.o @objects@ | |||||
CC = @CXX@ | CC = @CXX@ | ||||
DEFS = @debug@ | DEFS = @debug@ | ||||
DEFS += @audio_apis@ | DEFS += @audio_apis@ | ||||
CFLAGS = @cflags@ | |||||
CFLAGS = @CFLAGS@ | |||||
CFLAGS += @warn@ -I$(INCLUDE) -I../include | CFLAGS += @warn@ -I$(INCLUDE) -I../include | ||||
LIBRARY = @LIBS@ | LIBRARY = @LIBS@ | ||||
LIBRARY += @frameworks@ | LIBRARY += @frameworks@ | ||||