Browse Source

Various updates in ALSA for probing while device is open and in Windows for thread priority (gps).

tags/4.0.4
Gary Scavone Stephen Sinclair 17 years ago
parent
commit
ee94b95a99
7 changed files with 50 additions and 11 deletions
  1. +1
    -1
      Makefile.in
  2. +33
    -3
      RtAudio.cpp
  3. +4
    -2
      RtAudio.h
  4. +5
    -3
      configure.ac
  5. +5
    -0
      doc/release.txt
  6. +1
    -1
      rtaudio-config.in
  7. +1
    -1
      tests/Makefile.in

+ 1
- 1
Makefile.in View File

@@ -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)


+ 33
- 3
RtAudio.cpp View File

@@ -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;


+ 4
- 2
RtAudio.h View File

@@ -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,


+ 5
- 3
configure.ac View File

@@ -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




+ 5
- 0
doc/release.txt View File

@@ -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


+ 1
- 1
rtaudio-config.in View File

@@ -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"


+ 1
- 1
tests/Makefile.in View File

@@ -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@


Loading…
Cancel
Save