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 cdefda4..8d15a34 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -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 @@ -38,7 +38,7 @@ */ /************************************************************************/ -// RtAudio: Version 4.0.3 +// RtAudio: Version 4.0.4 #include "RtAudio.h" #include @@ -1816,8 +1816,8 @@ bool RtApiJack :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; - unsigned long flag = JackPortIsOutput; - if ( mode == INPUT ) flag = JackPortIsInput; + unsigned long flag = JackPortIsInput; + if ( mode == INPUT ) flag = JackPortIsOutput; ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; @@ -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 << ")!"; @@ -3725,6 +3727,7 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | + DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE ); // Force hardware mixing bufferDescription.dwBufferBytes = bufferBytes; @@ -3735,6 +3738,7 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | + DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE ); // Force software mixing result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); @@ -3995,6 +3999,8 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned goto error; } + // Boost DS thread priority + SetThreadPriority( (HANDLE) stream_.callbackInfo.thread, THREAD_PRIORITY_HIGHEST ); return SUCCESS; error: @@ -4934,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; @@ -5128,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; isaveDeviceInfo(); + snd_pcm_stream_t stream; if ( mode == OUTPUT ) stream = SND_PCM_STREAM_PLAYBACK; @@ -6014,6 +6049,7 @@ unsigned int RtApiOss :: getDeviceCount( void ) return 0; } + close( mixerfd ); return sysinfo.numaudios; } @@ -6874,11 +6910,11 @@ extern "C" void *ossCallbackHandler( void *ptr ) // message printing. void RtApi :: error( RtError::Type type ) { + errorStream_.str(""); // clear the ostringstream if ( type == RtError::WARNING && showWarnings_ == true ) std::cerr << '\n' << errorText_ << "\n\n"; else throw( RtError( errorText_, type ) ); - errorStream_.str(""); // clear the ostringstream } void RtApi :: verifyStream() @@ -6905,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 5acc9a5..8696262 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 @@ -42,7 +42,7 @@ \file RtAudio.h */ -// RtAudio: Version 4.0.3 +// RtAudio: Version 4.0.4 #ifndef __RTAUDIO_H #define __RTAUDIO_H @@ -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 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/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 0b72a2a..be6e89c 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -23,7 +23,7 @@ PROJECT_NAME = RtAudio # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 4.0.3 +PROJECT_NUMBER = 4.0.4 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/doc/doxygen/acknowledge.txt b/doc/doxygen/acknowledge.txt index 1c42191..f56836d 100644 --- a/doc/doxygen/acknowledge.txt +++ b/doc/doxygen/acknowledge.txt @@ -2,6 +2,7 @@ Many thanks to the following people for providing bug fixes and improvements:
    +
  • Anders Ervik
  • Robin Davies (Windows DS and ASIO)
  • Ryan Williams (Windows non-MS compiler ASIO support)
  • Ed Wildgoose (Linux ALSA and Jack)
  • diff --git a/doc/doxygen/footer.html b/doc/doxygen/footer.html index c10c2dd..6d2718d 100644 --- a/doc/doxygen/footer.html +++ b/doc/doxygen/footer.html @@ -1,7 +1,7 @@
    - +
    ©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.
    Maintained by Gary P. Scavone.
    ©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.
    Maintained by Gary P. Scavone.
    diff --git a/doc/doxygen/probe.txt b/doc/doxygen/probe.txt index 9fce97b..1352f51 100644 --- a/doc/doxygen/probe.txt +++ b/doc/doxygen/probe.txt @@ -37,15 +37,15 @@ The RtAudio::DeviceInfo structure is defined in RtAudio.h and provides a variety \code typedef struct RtAudio::DeviceInfo { - bool probed; // true if the device capabilities were successfully probed. - std::string name; // Character string device identifier. - int outputChannels; // Maximum output channels supported by device. - int inputChannels; // Maximum input channels supported by device. - int duplexChannels; // Maximum simultaneous input/output channels supported by device. - bool isDefaultOutput; // true if this is the default output device. - bool isDefaultInput; // true if this is the default input device. - std::vector sampleRates; // Supported sample rates. - RtAudioFormat nativeFormats; // Bit mask of supported data formats. + bool probed; // true if the device capabilities were successfully probed. + std::string name; // Character string device identifier. + unsigned int outputChannels; // Maximum output channels supported by device. + unsigned int inputChannels; // Maximum input channels supported by device. + unsigned int duplexChannels; // Maximum simultaneous input/output channels supported by device. + bool isDefaultOutput; // true if this is the default output device. + bool isDefaultInput; // true if this is the default input device. + std::vector sampleRates; // Supported sample rates. + RtAudioFormat nativeFormats; // Bit mask of supported data formats. }; \endcode diff --git a/doc/doxygen/tutorial.txt b/doc/doxygen/tutorial.txt index 89bb948..906afe3 100644 --- a/doc/doxygen/tutorial.txt +++ b/doc/doxygen/tutorial.txt @@ -32,7 +32,7 @@ Devices are now re-enumerated every time the RtAudio::getDeviceCount(), RtAudio: \section download Download -Latest Release (7 December 2007): Version 4.0.3 +Latest Release (24 January 2008): Version 4.0.4 \section documentation Documentation Links diff --git a/doc/release.txt b/doc/release.txt index 1fa678d..4bccff8 100644 --- a/doc/release.txt +++ b/doc/release.txt @@ -1,6 +1,15 @@ RtAudio - a set of C++ classes that provide a common API for realtime audio input/output across Linux (native ALSA, JACK, and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems. -By Gary P. Scavone, 2001-2007. +By Gary P. Scavone, 2001-2008. + +v4.0.4: (24 January 2008) +- added functionality to allow getDeviceInfo() to work in ALSA for 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/install b/install index 89788be..8bdd0ca 100644 --- a/install +++ b/install @@ -1,6 +1,6 @@ RtAudio - a set of C++ classes which provide a common API for realtime audio input/output across Linux (native ALSA, JACK, and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems. -By Gary P. Scavone, 2001-2007. +By Gary P. Scavone, 2001-2008. To configure and compile (on Unix systems and MinGW): diff --git a/readme b/readme index e9279ed..8228cd3 100644 --- a/readme +++ b/readme @@ -1,6 +1,6 @@ RtAudio - a set of C++ classes that provide a common API for realtime audio input/output across Linux (native ALSA, JACK, and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems. -By Gary P. Scavone, 2001-2007. +By Gary P. Scavone, 2001-2008. This distribution of RtAudio contains the following: @@ -34,7 +34,7 @@ LEGAL AND ETHICAL: The RtAudio license is similar to the MIT License. RtAudio: a set of 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 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@