diff options
| author | Stephen Sinclair <sinclair@music.mcgill.ca> | 2013-10-11 01:52:34 +0200 |
|---|---|---|
| committer | Stephen Sinclair <sinclair@music.mcgill.ca> | 2013-10-11 01:52:34 +0200 |
| commit | c3ceaf900358dbd7e2fe375d2114d658e27b29dc (patch) | |
| tree | 3c6cd0d7c9b9a00449390a05feb4e3e697bc545a | |
| parent | 1c8dcf10265b9e8205dc94e6575d06fccbd6c07a (diff) | |
| parent | 1d3b191e05c76800fd3c30675f101e9dc5b2f5f1 (diff) | |
Merge 4.0.4 into releases
| -rw-r--r-- | Makefile.in | 2 | ||||
| -rw-r--r-- | RtAudio.cpp | 52 | ||||
| -rw-r--r-- | RtAudio.h | 8 | ||||
| -rw-r--r-- | configure.ac | 8 | ||||
| -rw-r--r-- | doc/doxygen/Doxyfile | 2 | ||||
| -rw-r--r-- | doc/doxygen/acknowledge.txt | 1 | ||||
| -rw-r--r-- | doc/doxygen/footer.html | 2 | ||||
| -rw-r--r-- | doc/doxygen/probe.txt | 18 | ||||
| -rw-r--r-- | doc/doxygen/tutorial.txt | 2 | ||||
| -rw-r--r-- | doc/release.txt | 11 | ||||
| -rw-r--r-- | install | 2 | ||||
| -rw-r--r-- | readme | 4 | ||||
| -rw-r--r-- | rtaudio-config.in | 2 | ||||
| -rw-r--r-- | tests/Makefile.in | 2 |
14 files changed, 83 insertions, 33 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 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 <iostream> @@ -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; 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, @@ -5164,6 +5192,7 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); + snd_ctl_close( chandle ); goto foundDevice; } nDevices++; @@ -5186,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; @@ -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; @@ -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<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/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: <UL> +<LI>Anders Ervik</LI> <LI>Robin Davies (Windows DS and ASIO)</LI> <LI>Ryan Williams (Windows non-MS compiler ASIO support)</LI> <LI>Ed Wildgoose (Linux ALSA and Jack)</LI> 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 @@ <HR> <table><tr><td><img src="../images/mcgill.gif" width=165></td> - <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr> + <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr> </table> </BODY> 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<int> 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<unsigned int> 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): <A href="http://music.mcgill.ca/~gary/rtaudio/release/rtaudio-4.0.3.tar.gz">Version 4.0.3</A> +Latest Release (24 January 2008): <A href="http://music.mcgill.ca/~gary/rtaudio/release/rtaudio-4.0.4.tar.gz">Version 4.0.4</A> \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 @@ -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): @@ -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@ |
