Release 4.0.0 tarball 4.0.0
authorGary Scavone <gary@music.mcgill.ca>
Thu, 10 Oct 2013 23:46:50 +0000 (01:46 +0200)
committerStephen Sinclair <sinclair@music.mcgill.ca>
Thu, 10 Oct 2013 23:46:50 +0000 (01:46 +0200)
44 files changed:
configure
doc/html/RtAudio_8h-source.html
doc/html/RtAudio_8h.html [new file with mode: 0644]
doc/html/RtError_8h-source.html
doc/html/acknowledge.html [new file with mode: 0644]
doc/html/annotated.html
doc/html/apinotes.html [new file with mode: 0644]
doc/html/bugs.html [new file with mode: 0644]
doc/html/classRtAudio-members.html
doc/html/classRtAudio.html
doc/html/classRtError-members.html
doc/html/classRtError.html
doc/html/compiling.html [new file with mode: 0644]
doc/html/duplex.html [new file with mode: 0644]
doc/html/errors.html [new file with mode: 0644]
doc/html/files.html
doc/html/functions.html
doc/html/functions_enum.html
doc/html/functions_eval.html
doc/html/functions_func.html
doc/html/functions_vars.html
doc/html/globals.html [new file with mode: 0644]
doc/html/globals_enum.html [new file with mode: 0644]
doc/html/globals_eval.html [new file with mode: 0644]
doc/html/globals_type.html [new file with mode: 0644]
doc/html/index.html
doc/html/license.html [new file with mode: 0644]
doc/html/multi.html [new file with mode: 0644]
doc/html/pages.html [new file with mode: 0644]
doc/html/playback.html [new file with mode: 0644]
doc/html/probe.html [new file with mode: 0644]
doc/html/recording.html [new file with mode: 0644]
doc/html/settings.html [new file with mode: 0644]
doc/html/structRtAudioDeviceInfo-members.html
doc/html/structRtAudioDeviceInfo.html
doc/html/structRtAudioStreamParameters-members.html [new file with mode: 0644]
doc/html/structRtAudioStreamParameters.html [new file with mode: 0644]
doc/html/structRtAudio_1_1DeviceInfo-members.html [new file with mode: 0644]
doc/html/structRtAudio_1_1DeviceInfo.html [new file with mode: 0644]
doc/html/structRtAudio_1_1StreamOptions-members.html [new file with mode: 0644]
doc/html/structRtAudio_1_1StreamOptions.html [new file with mode: 0644]
doc/html/structRtAudio_1_1StreamParameters-members.html [new file with mode: 0644]
doc/html/structRtAudio_1_1StreamParameters.html [new file with mode: 0644]
doc/html/updates.html [new file with mode: 0644]

index 4981cb7b21c2a573cd67afea4938689815cc72a7..b9561b52ef484b7fdc43307ba446a094f1986f0d 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,11 +1,10 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57 for RtAudio 3.0.
+# Generated by GNU Autoconf 2.59 for RtAudio 4.0.
 #
-# Report bugs to <gary@ccrma.stanford.edu>.
+# Report bugs to <gary@music.mcgill.ca>.
 #
-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
+# Copyright (C) 2003 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
@@ -22,9 +21,10 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
 elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
   set -o posix
 fi
+DUALCASE=1; export DUALCASE # for MKS sh
 
 # Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   as_unset=unset
 else
   as_unset=false
@@ -43,7 +43,7 @@ for as_var in \
   LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
   LC_TELEPHONE LC_TIME
 do
-  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
     eval $as_var=C; export $as_var
   else
     $as_unset $as_var
@@ -220,16 +220,17 @@ rm -f conf$$ conf$$.exe conf$$.file
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
 else
+  test -d ./-p && rmdir ./-p
   as_mkdir_p=false
 fi
 
 as_executable_p="test -f"
 
 # Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 
 # Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
 # IFS
@@ -268,9 +269,9 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='RtAudio'
 PACKAGE_TARNAME='rtaudio'
-PACKAGE_VERSION='3.0'
-PACKAGE_STRING='RtAudio 3.0'
-PACKAGE_BUGREPORT='gary@ccrma.stanford.edu'
+PACKAGE_VERSION='4.0'
+PACKAGE_STRING='RtAudio 4.0'
+PACKAGE_BUGREPORT='gary@music.mcgill.ca'
 
 ac_unique_file="RtAudio.cpp"
 # Factoring default headers for most tests.
@@ -310,7 +311,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS GXX CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPP EGREP debug cflags object_path warn build build_cpu build_vendor build_os host host_cpu host_vendor host_os sound_api audio_apis frameworks LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS GXX CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX RANLIB ac_ct_RANLIB AR CPP EGREP debug cflags object_path warn build build_cpu build_vendor build_os host host_cpu host_vendor host_os sound_api audio_apis frameworks LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -669,7 +670,7 @@ done
 
 # Be sure to have absolute paths.
 for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-              localstatedir libdir includedir oldincludedir infodir mandir
+             localstatedir libdir includedir oldincludedir infodir mandir
 do
   eval ac_val=$`echo $ac_var`
   case $ac_val in
@@ -709,10 +710,10 @@ if test -z "$srcdir"; then
   # Try the directory containing this script, then its parent.
   ac_confdir=`(dirname "$0") 2>/dev/null ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$0" : 'X\(//\)[^/]' \| \
-         X"$0" : 'X\(//\)$' \| \
-         X"$0" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
 echo X"$0" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
          /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -787,7 +788,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures RtAudio 3.0 to adapt to many kinds of systems.
+\`configure' configures RtAudio 4.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -812,9 +813,9 @@ _ACEOF
   cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
+                         [$ac_default_prefix]
   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
+                         [PREFIX]
 
 By default, \`make install' will install all the files in
 \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
@@ -848,7 +849,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of RtAudio 3.0:";;
+     short | recursive ) echo "Configuration of RtAudio 4.0:";;
    esac
   cat <<\_ACEOF
 
@@ -860,9 +861,11 @@ Optional Features:
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-jack = choose JACK server support (linux only)
+  --with-jack = choose JACK server support (mac and linux only)
   --with-alsa = choose native ALSA API support (linux only)
   --with-oss = choose OSS API support (linux only)
+  --with-jack = choose JACK server support (unix only)
+  --with-core = choose CoreAudio API support (mac only)
 
 Some influential environment variables:
   CC          C compiler command
@@ -878,7 +881,7 @@ Some influential environment variables:
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
-Report bugs to <gary@ccrma.stanford.edu>.
+Report bugs to <gary@music.mcgill.ca>.
 _ACEOF
 fi
 
@@ -912,12 +915,45 @@ case $srcdir in
     ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
     ac_top_srcdir=$ac_top_builddir$srcdir ;;
 esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
 
     cd $ac_dir
     # Check for guested configure; otherwise get Cygnus style configure.
@@ -928,7 +964,7 @@ ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
       echo
       $SHELL $ac_srcdir/configure  --help=recursive
     elif test -f $ac_srcdir/configure.ac ||
-           test -f $ac_srcdir/configure.in; then
+          test -f $ac_srcdir/configure.in; then
       echo
       $ac_configure --help
     else
@@ -941,11 +977,10 @@ fi
 test -n "$ac_init_help" && exit 0
 if $ac_init_version; then
   cat <<\_ACEOF
-RtAudio configure 3.0
-generated by GNU Autoconf 2.57
+RtAudio configure 4.0
+generated by GNU Autoconf 2.59
 
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-Free Software Foundation, Inc.
+Copyright (C) 2003 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -956,8 +991,8 @@ cat >&5 <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by RtAudio $as_me 3.0, which was
-generated by GNU Autoconf 2.57.  Invocation command line was
+It was created by RtAudio $as_me 4.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
 
   $ $0 $@
 
@@ -1034,19 +1069,19 @@ do
     2)
       ac_configure_args1="$ac_configure_args1 '$ac_arg'"
       if test $ac_must_keep_next = true; then
-        ac_must_keep_next=false # Got value, back to normal.
+       ac_must_keep_next=false # Got value, back to normal.
       else
-        case $ac_arg in
-          *=* | --config-cache | -C | -disable-* | --disable-* \
-          | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-          | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-          | -with-* | --with-* | -without-* | --without-* | --x)
-            case "$ac_configure_args0 " in
-              "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-            esac
-            ;;
-          -* ) ac_must_keep_next=true ;;
-        esac
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
       fi
       ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
       # Get rid of the leading space.
@@ -1080,12 +1115,12 @@ _ASBOX
     case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
     *ac_space=\ *)
       sed -n \
-        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+       "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
       ;;
     *)
       sed -n \
-        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+       "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
       ;;
     esac;
 }
@@ -1114,7 +1149,7 @@ _ASBOX
       for ac_var in $ac_subst_files
       do
        eval ac_val=$`echo $ac_var`
-        echo "$ac_var='"'"'$ac_val'"'"'"
+       echo "$ac_var='"'"'$ac_val'"'"'"
       done | sort
       echo
     fi
@@ -1133,7 +1168,7 @@ _ASBOX
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core core.* *.core &&
+  rm -f core *.core &&
   rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
      ' 0
@@ -1213,7 +1248,7 @@ fi
 # value.
 ac_cache_corrupted=false
 for ac_var in `(set) 2>&1 |
-               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+              sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
   eval ac_old_val="\$ac_cv_env_${ac_var}_value"
@@ -1230,13 +1265,13 @@ echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
     ,);;
     *)
       if test "x$ac_old_val" != "x$ac_new_val"; then
-        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
 echo "$as_me:   former value:  $ac_old_val" >&2;}
-        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
 echo "$as_me:   current value: $ac_new_val" >&2;}
-        ac_cache_corrupted=:
+       ac_cache_corrupted=:
       fi;;
   esac
   # Pass precious variables to config.status.
@@ -1293,7 +1328,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-          ac_config_files="$ac_config_files tests/Makefile"
+                              ac_config_files="$ac_config_files rtaudio-config Makefile tests/Makefile"
 
 
 # Fill GXX with something before test.
@@ -1637,7 +1672,6 @@ ac_compiler=`set X $ac_compile; echo $2`
   (exit $ac_status); }
 
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -1657,8 +1691,8 @@ ac_clean_files="$ac_clean_files a.out a.exe b.out"
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output" >&5
-echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
 if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
   (eval $ac_link_default) 2>&5
@@ -1678,23 +1712,23 @@ do
   test -f "$ac_file" || continue
   case $ac_file in
     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-        ;;
+       ;;
     conftest.$ac_ext )
-        # This is the source file.
-        ;;
+       # This is the source file.
+       ;;
     [ab].out )
-        # We found the default executable, but exeext='' is most
-        # certainly right.
-        break;;
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
     *.* )
-        ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-        # FIXME: I believe we export ac_cv_exeext for Libtool,
-        # but it would be cool to find out if it's true.  Does anybody
-        # maintain Libtool? --akim.
-        export ac_cv_exeext
-        break;;
+       ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       # FIXME: I believe we export ac_cv_exeext for Libtool,
+       # but it would be cool to find out if it's true.  Does anybody
+       # maintain Libtool? --akim.
+       export ac_cv_exeext
+       break;;
     * )
-        break;;
+       break;;
   esac
 done
 else
@@ -1768,8 +1802,8 @@ for ac_file in conftest.exe conftest conftest.*; do
   case $ac_file in
     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-          export ac_cv_exeext
-          break;;
+         export ac_cv_exeext
+         break;;
     * ) break;;
   esac
 done
@@ -1794,7 +1828,6 @@ if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -1845,7 +1878,6 @@ if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -1865,11 +1897,21 @@ main ()
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -1882,7 +1924,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_compiler_gnu=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
@@ -1898,7 +1940,6 @@ if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -1915,11 +1956,21 @@ main ()
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -1932,7 +1983,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_prog_cc_g=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
@@ -1959,7 +2010,6 @@ else
   ac_cv_prog_cc_stdc=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -1987,6 +2037,16 @@ static char *f (char * (*g) (char **, int), char **p, ...)
   va_end (v);
   return s;
 }
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2013,11 +2073,21 @@ do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2030,7 +2100,7 @@ else
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext
+rm -f conftest.err conftest.$ac_objext
 done
 rm -f conftest.$ac_ext conftest.$ac_objext
 CC=$ac_save_CC
@@ -2058,19 +2128,28 @@ cat >conftest.$ac_ext <<_ACEOF
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   for ac_declaration in \
-   ''\
-   '#include <stdlib.h>' \
+   '' \
    'extern "C" void std::exit (int) throw (); using std::exit;' \
    'extern "C" void std::exit (int); using std::exit;' \
    'extern "C" void exit (int) throw ();' \
@@ -2078,14 +2157,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
    'void exit (int);'
 do
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <stdlib.h>
 $ac_declaration
+#include <stdlib.h>
 int
 main ()
 {
@@ -2096,11 +2174,21 @@ exit (42);
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2113,9 +2201,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 continue
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2132,11 +2219,21 @@ exit (42);
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2148,7 +2245,7 @@ else
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 rm -f conftest*
 if test -n "$ac_declaration"; then
@@ -2162,7 +2259,7 @@ else
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2288,7 +2385,6 @@ if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2308,11 +2404,21 @@ main ()
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_cxx_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2325,7 +2431,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_compiler_gnu=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
 fi
@@ -2341,7 +2447,6 @@ if test "${ac_cv_prog_cxx_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2358,11 +2463,21 @@ main ()
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_cxx_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2375,7 +2490,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_prog_cxx_g=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
@@ -2395,8 +2510,7 @@ else
   fi
 fi
 for ac_declaration in \
-   ''\
-   '#include <stdlib.h>' \
+   '' \
    'extern "C" void std::exit (int) throw (); using std::exit;' \
    'extern "C" void std::exit (int); using std::exit;' \
    'extern "C" void exit (int) throw ();' \
@@ -2404,14 +2518,13 @@ for ac_declaration in \
    'void exit (int);'
 do
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <stdlib.h>
 $ac_declaration
+#include <stdlib.h>
 int
 main ()
 {
@@ -2422,11 +2535,21 @@ exit (42);
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_cxx_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2439,9 +2562,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 continue
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2458,11 +2580,21 @@ exit (42);
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_cxx_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2474,7 +2606,7 @@ else
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 rm -f conftest*
 if test -n "$ac_declaration"; then
@@ -2489,6 +2621,131 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+# Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $AR in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_AR="$AR" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_AR" && ac_cv_path_AR="no"
+  ;;
+esac
+fi
+AR=$ac_cv_path_AR
+
+if test -n "$AR"; then
+  echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if [ $AR = "no" ] ; then
+    { { echo "$as_me:$LINENO: error: \"Could not find ar - needed to create a library\"" >&5
+echo "$as_me: error: \"Could not find ar - needed to create a library\"" >&2;}
+   { (exit 1); exit 1; }; };
+fi
 
 # Checks for libraries.
 
@@ -2501,7 +2758,6 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lpthread  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2525,11 +2781,21 @@ pthread_create ();
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2542,7 +2808,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_lib_pthread_pthread_create=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5
@@ -2561,6 +2828,8 @@ echo "$as_me: error: RtAudio requires the pthread library!" >&2;}
 fi
 
 
+
+
 # Checks for header files.
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -2590,7 +2859,6 @@ do
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2601,7 +2869,7 @@ cat >>conftest.$ac_ext <<_ACEOF
 #else
 # include <assert.h>
 #endif
-                     Syntax error
+                    Syntax error
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
@@ -2613,6 +2881,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -2633,7 +2902,6 @@ rm -f conftest.err conftest.$ac_ext
   # OK, works on sane cases.  Now check whether non-existent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2651,6 +2919,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -2697,7 +2966,6 @@ do
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2708,7 +2976,7 @@ cat >>conftest.$ac_ext <<_ACEOF
 #else
 # include <assert.h>
 #endif
-                     Syntax error
+                    Syntax error
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
@@ -2720,6 +2988,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -2740,7 +3009,6 @@ rm -f conftest.err conftest.$ac_ext
   # OK, works on sane cases.  Now check whether non-existent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2758,6 +3026,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -2818,7 +3087,6 @@ if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2839,11 +3107,21 @@ main ()
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2856,12 +3134,11 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_header_stdc=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2883,7 +3160,6 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2908,7 +3184,6 @@ if test $ac_cv_header_stdc = yes; then
   :
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2920,9 +3195,9 @@ cat >>conftest.$ac_ext <<_ACEOF
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
 #else
 # define ISLOWER(c) \
-                   (('a' <= (c) && (c) <= 'i') \
-                     || ('j' <= (c) && (c) <= 'r') \
-                     || ('s' <= (c) && (c) <= 'z'))
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
 # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
 #endif
 
@@ -2933,7 +3208,7 @@ main ()
   int i;
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
-        || toupper (i) != TOUPPER (i))
+       || toupper (i) != TOUPPER (i))
       exit(2);
   exit (0);
 }
@@ -2958,7 +3233,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
@@ -2983,7 +3258,7 @@ fi
 
 
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-                  inttypes.h stdint.h unistd.h
+                 inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
 echo "$as_me:$LINENO: checking for $ac_header" >&5
@@ -2992,7 +3267,6 @@ if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3004,11 +3278,21 @@ $ac_includes_default
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3021,7 +3305,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 eval "$as_ac_Header=no"
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
@@ -3053,7 +3337,6 @@ else
 echo "$as_me:$LINENO: checking $ac_header usability" >&5
 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3064,11 +3347,21 @@ $ac_includes_default
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3081,7 +3374,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_header_compiler=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
 echo "${ECHO_T}$ac_header_compiler" >&6
 
@@ -3089,7 +3382,6 @@ echo "${ECHO_T}$ac_header_compiler" >&6
 echo "$as_me:$LINENO: checking $ac_header presence" >&5
 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3107,6 +3399,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -3126,33 +3419,32 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
 echo "${ECHO_T}$ac_header_preproc" >&6
 
 # So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc in
-  yes:no )
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
     { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
     ;;
-  no:yes )
+  no:yes:* )
     { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
     (
       cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
+## ----------------------------------- ##
+## Report this to gary@music.mcgill.ca ##
+## ----------------------------------- ##
 _ASBOX
     ) |
       sed "s/^/$as_me: WARNING:     /" >&2
@@ -3163,7 +3455,7 @@ echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  eval "$as_ac_Header=$ac_header_preproc"
+  eval "$as_ac_Header=\$ac_header_preproc"
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
@@ -3186,7 +3478,6 @@ if test "${ac_cv_c_const+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3249,11 +3540,21 @@ main ()
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3266,7 +3567,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_c_const=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
 echo "${ECHO_T}$ac_cv_c_const" >&6
@@ -3298,30 +3599,126 @@ else
 echo "${ECHO_T}no" >&6
 fi;
 
-# Check compiler and use -Wall if gnu.
-if test $GXX = "yes" ; then
-  warn=-Wall
+# Checks for functions
+echo "$as_me:$LINENO: checking for gettimeofday" >&5
+echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6
+if test "${ac_cv_func_gettimeofday+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define gettimeofday to an innocuous variant, in case <limits.h> declares gettimeofday.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define gettimeofday innocuous_gettimeofday
 
-fi
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gettimeofday (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Checks for package options and external software
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f $ac_dir/install.sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f $ac_dir/shtool; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef gettimeofday
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettimeofday ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday)
+choke me
+#else
+char (*f) () = gettimeofday;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != gettimeofday;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_gettimeofday=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_gettimeofday=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_gettimeofday" >&5
+echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6
+if test $ac_cv_func_gettimeofday = yes; then
+  cflags=$cflags" -DHAVE_GETTIMEOFDAY"
+fi
+
+
+# Check compiler and use -Wall if gnu.
+if test $GXX = "yes" ; then
+  warn=-Wall
+
+fi
+
+# Checks for package options and external software
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
   { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
    { (exit 1); exit 1; }; }
@@ -3387,6 +3784,16 @@ host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$as_me:$LINENO: checking for audio API" >&5
 echo $ECHO_N "checking for audio API... $ECHO_C" >&6
 case $host in
+  *-*-netbsd*)
+    sound_api=-D__LINUX_OSS__
+
+    echo "$as_me:$LINENO: result: using OSS" >&5
+echo "${ECHO_T}using OSS" >&6
+    audio_apis=-D__LINUX_OSS__
+
+    cflags=$cflags" -lossaudio"
+  ;;
+
   *-*-linux*)
   sound_api=_NO_API_
 
@@ -3394,11 +3801,11 @@ case $host in
 # Check whether --with-jack or --without-jack was given.
 if test "${with_jack+set}" = set; then
   withval="$with_jack"
-  sound_api=-D__LINUX_JACK__
+  sound_api=-D__UNIX_JACK__
  echo "$as_me:$LINENO: result: using JACK" >&5
 echo "${ECHO_T}using JACK" >&6
 fi;
-  if test $sound_api = -D__LINUX_JACK__; then
+  if test $sound_api = -D__UNIX_JACK__; then
     TEMP_LIBS=$LIBS
 
 echo "$as_me:$LINENO: checking for jack_client_new in -ljack" >&5
@@ -3409,7 +3816,6 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ljack  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3433,11 +3839,21 @@ jack_client_new ();
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3450,7 +3866,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_lib_jack_jack_client_new=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_jack_jack_client_new" >&5
@@ -3477,7 +3894,6 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lasound  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3501,11 +3917,21 @@ snd_pcm_open ();
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3518,7 +3944,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_lib_asound_snd_pcm_open=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_asound_snd_pcm_open" >&5
@@ -3537,7 +3964,7 @@ echo "$as_me: error: Jack support also requires the asound library!" >&2;}
 fi
 
     LIBS="`pkg-config --cflags --libs jack` $TEMP_LIBS -lasound"
-    audio_apis="-D__LINUX_JACK__"
+    audio_apis="-D__UNIX_JACK__"
   fi
 
   # Look for Alsa flag
@@ -3559,7 +3986,6 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lasound  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3583,11 +4009,21 @@ snd_pcm_open ();
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3600,7 +4036,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_lib_asound_snd_pcm_open=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_asound_snd_pcm_open" >&5
@@ -3659,7 +4096,6 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-laudio  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3683,11 +4119,21 @@ alOpenPort ();
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3700,7 +4146,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_cv_lib_audio_alOpenPort=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_audio_alOpenPort" >&5
@@ -3721,8 +4168,109 @@ fi
   ;;
 
   *-apple*)
-  # Check for CoreAudio framework
-  if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then
+  sound_api=_NO_API_
+
+
+# Check whether --with-jack or --without-jack was given.
+if test "${with_jack+set}" = set; then
+  withval="$with_jack"
+  sound_api=-D__UNIX_JACK__
+ echo "$as_me:$LINENO: result: using JACK" >&5
+echo "${ECHO_T}using JACK" >&6
+fi;
+  if test $sound_api = -D__UNIX_JACK__; then
+
+echo "$as_me:$LINENO: checking for jack_client_new in -ljack" >&5
+echo $ECHO_N "checking for jack_client_new in -ljack... $ECHO_C" >&6
+if test "${ac_cv_lib_jack_jack_client_new+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljack  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char jack_client_new ();
+int
+main ()
+{
+jack_client_new ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_jack_jack_client_new=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_jack_jack_client_new=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_jack_jack_client_new" >&5
+echo "${ECHO_T}$ac_cv_lib_jack_jack_client_new" >&6
+if test $ac_cv_lib_jack_jack_client_new = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBJACK 1
+_ACEOF
+
+  LIBS="-ljack $LIBS"
+
+else
+  { { echo "$as_me:$LINENO: error: JACK support requires the jack library!" >&5
+echo "$as_me: error: JACK support requires the jack library!" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+    audio_apis="-D__UNIX_JACK__"
+  fi
+
+  # Look for Core flag
+
+# Check whether --with-core or --without-core was given.
+if test "${with_core+set}" = set; then
+  withval="$with_core"
+  sound_api=-D__MACOSX_CORE__
+ echo "$as_me:$LINENO: result: using CoreAudio" >&5
+echo "${ECHO_T}using CoreAudio" >&6
+fi;
+  if test $sound_api = -D__MACOSX_CORE__; then
+    if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then
   echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5
 echo $ECHO_N "checking for CoreAudio/CoreAudio.h... $ECHO_C" >&6
 if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then
@@ -3735,7 +4283,6 @@ else
 echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h usability" >&5
 echo $ECHO_N "checking CoreAudio/CoreAudio.h usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3746,11 +4293,21 @@ $ac_includes_default
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3763,7 +4320,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_header_compiler=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
 echo "${ECHO_T}$ac_header_compiler" >&6
 
@@ -3771,7 +4328,6 @@ echo "${ECHO_T}$ac_header_compiler" >&6
 echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h presence" >&5
 echo $ECHO_N "checking CoreAudio/CoreAudio.h presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3789,6 +4345,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -3808,33 +4365,189 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
 echo "${ECHO_T}$ac_header_preproc" >&6
 
 # So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc in
-  yes:no )
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
     { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&5
 echo "$as_me: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h:     section \"Present But Cannot Be Compiled\"" >&2;}
     { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&5
 echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&2;}
     (
       cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
+## ----------------------------------- ##
+## Report this to gary@music.mcgill.ca ##
+## ----------------------------------- ##
 _ASBOX
     ) |
       sed "s/^/$as_me: WARNING:     /" >&2
     ;;
-  no:yes )
+esac
+echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5
+echo $ECHO_N "checking for CoreAudio/CoreAudio.h... $ECHO_C" >&6
+if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_CoreAudio_CoreAudio_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_CoreAudio_CoreAudio_h" >&5
+echo "${ECHO_T}$ac_cv_header_CoreAudio_CoreAudio_h" >&6
+
+fi
+if test $ac_cv_header_CoreAudio_CoreAudio_h = yes; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: CoreAudio header files not found!" >&5
+echo "$as_me: error: CoreAudio header files not found!" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+    frameworks="-framework CoreAudio -framework CoreFoundation"
+
+    audio_apis="-D__MACOSX_CORE__ $audio_apis"
+  fi
+
+  # If no audio api flags specified, use CoreAudio
+  if test $sound_api = _NO_API_; then
+    sound_api=-D__MACOSX_CORE__
+
+    echo "$as_me:$LINENO: result: using CoreAudio" >&5
+echo "${ECHO_T}using CoreAudio" >&6
+    if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5
+echo $ECHO_N "checking for CoreAudio/CoreAudio.h... $ECHO_C" >&6
+if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_CoreAudio_CoreAudio_h" >&5
+echo "${ECHO_T}$ac_cv_header_CoreAudio_CoreAudio_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h usability" >&5
+echo $ECHO_N "checking CoreAudio/CoreAudio.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <CoreAudio/CoreAudio.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h presence" >&5
+echo $ECHO_N "checking CoreAudio/CoreAudio.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <CoreAudio/CoreAudio.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
     { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&5
 echo "$as_me: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: CoreAudio/CoreAudio.h: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h:     section \"Present But Cannot Be Compiled\"" >&2;}
     { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&5
 echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&2;}
     (
       cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
+## ----------------------------------- ##
+## Report this to gary@music.mcgill.ca ##
+## ----------------------------------- ##
 _ASBOX
     ) |
       sed "s/^/$as_me: WARNING:     /" >&2
@@ -3861,8 +4574,9 @@ echo "$as_me: error: CoreAudio header files not found!" >&2;}
 fi
 
 
-  frameworks="-framework CoreAudio"
+    frameworks="-framework CoreAudio -framework CoreFoundation"
 
+  fi
   ;;
 
   *)
@@ -3882,7 +4596,6 @@ if test "${ac_cv_prog_gcc_traditional+set}" = set; then
 else
     ac_pattern="Autoconf.*'x'"
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3902,7 +4615,6 @@ rm -f conftest*
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3955,13 +4667,13 @@ _ACEOF
       # `set' does not quote correctly, so add quotes (double-quote
       # substitution turns \\\\ into \\, and sed turns \\ into \).
       sed -n \
-        "s/'/'\\\\''/g;
-         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
       ;;
     *)
       # `set' quotes correctly as required by POSIX, so do not add quotes.
       sed -n \
-        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+       "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
       ;;
     esac;
 } |
@@ -3991,13 +4703,13 @@ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 # trailing colons and then remove the whole line if VPATH becomes empty
 # (actually we leave an empty line to preserve line numbers).
 if test "x$srcdir" = x.; then
-  ac_vpsub='/^[        ]*VPATH[        ]*=/{
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
 s/:*\$(srcdir):*/:/;
 s/:*\${srcdir}:*/:/;
 s/:*@srcdir@:*/:/;
-s/^\([^=]*=[   ]*\):*/\1/;
+s/^\([^=]*=[    ]*\):*/\1/;
 s/:*$//;
-s/^[^=]*=[     ]*$//;
+s/^[^=]*=[      ]*$//;
 }'
 fi
 
@@ -4011,13 +4723,13 @@ fi
 cat >confdef2opt.sed <<\_ACEOF
 t clear
 : clear
-s,^[   ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\),-D\1=\2,g
+s,^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\),-D\1=\2,g
 t quote
-s,^[   ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\),-D\1=\2,g
+s,^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\),-D\1=\2,g
 t quote
 d
 : quote
-s,[    `~#$^&*(){}\\|;'"<>?],\\&,g
+s,[     `~#$^&*(){}\\|;'"<>?],\\&,g
 s,\[,\\&,g
 s,\],\\&,g
 s,\$,$$,g
@@ -4039,7 +4751,7 @@ ac_ltlibobjs=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_i=`echo "$ac_i" |
-         sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+        sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
   # 2. Add them.
   ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
   ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
@@ -4083,9 +4795,10 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
 elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
   set -o posix
 fi
+DUALCASE=1; export DUALCASE # for MKS sh
 
 # Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   as_unset=unset
 else
   as_unset=false
@@ -4104,7 +4817,7 @@ for as_var in \
   LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
   LC_TELEPHONE LC_TIME
 do
-  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
     eval $as_var=C; export $as_var
   else
     $as_unset $as_var
@@ -4283,16 +4996,17 @@ rm -f conf$$ conf$$.exe conf$$.file
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
 else
+  test -d ./-p && rmdir ./-p
   as_mkdir_p=false
 fi
 
 as_executable_p="test -f"
 
 # Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 
 # Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
 # IFS
@@ -4318,8 +5032,8 @@ _ASBOX
 } >&5
 cat >&5 <<_CSEOF
 
-This file was extended by RtAudio $as_me 3.0, which was
-generated by GNU Autoconf 2.57.  Invocation command line was
+This file was extended by RtAudio $as_me 4.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -4363,7 +5077,7 @@ Usage: $0 [OPTIONS] [FILE]...
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
   --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
+                  instantiate the configuration file FILE
 
 Configuration files:
 $config_files
@@ -4373,12 +5087,11 @@ _ACEOF
 
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-RtAudio config.status 3.0
-configured by $0, generated by GNU Autoconf 2.57,
+RtAudio config.status 4.0
+configured by $0, generated by GNU Autoconf 2.59,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
+Copyright (C) 2003 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 srcdir=$srcdir
@@ -4476,6 +5189,8 @@ for ac_config_target in $ac_config_targets
 do
   case "$ac_config_target" in
   # Handling of arguments.
+  "rtaudio-config" ) CONFIG_FILES="$CONFIG_FILES rtaudio-config" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
   "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
@@ -4571,6 +5286,9 @@ s,@OBJEXT@,$OBJEXT,;t t
 s,@CXX@,$CXX,;t t
 s,@CXXFLAGS@,$CXXFLAGS,;t t
 s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@AR@,$AR,;t t
 s,@CPP@,$CPP,;t t
 s,@EGREP@,$EGREP,;t t
 s,@debug@,$debug,;t t
@@ -4619,9 +5337,9 @@ _ACEOF
       (echo ':t
   /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
       if test -z "$ac_sed_cmds"; then
-       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
       else
-       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
       fi
       ac_sed_frag=`expr $ac_sed_frag + 1`
       ac_beg=$ac_end
@@ -4639,21 +5357,21 @@ for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
   case $ac_file in
   - | *:- | *:-:* ) # input from stdin
-        cat >$tmp/stdin
-        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+       cat >$tmp/stdin
+       ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
   *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
   * )   ac_file_in=$ac_file.in ;;
   esac
 
   # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
   ac_dir=`(dirname "$ac_file") 2>/dev/null ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$ac_file" : 'X\(//\)[^/]' \| \
-         X"$ac_file" : 'X\(//\)$' \| \
-         X"$ac_file" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
 echo X"$ac_file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
          /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -4669,10 +5387,10 @@ echo X"$ac_file" |
       as_dirs="$as_dir $as_dirs"
       as_dir=`(dirname "$as_dir") 2>/dev/null ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$as_dir" : 'X\(//\)[^/]' \| \
-         X"$as_dir" : 'X\(//\)$' \| \
-         X"$as_dir" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
 echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
          /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -4710,12 +5428,45 @@ case $srcdir in
     ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
     ac_top_srcdir=$ac_top_builddir$srcdir ;;
 esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
 
 
 
@@ -4733,7 +5484,7 @@ echo "$as_me: creating $ac_file" >&6;}
     configure_input="$ac_file.  "
   fi
   configure_input=$configure_input"Generated from `echo $ac_file_in |
-                                     sed 's,.*/,,'` by configure."
+                                    sed 's,.*/,,'` by configure."
 
   # First look for the input files in the build tree, otherwise in the
   # src tree.
@@ -4742,24 +5493,24 @@ echo "$as_me: creating $ac_file" >&6;}
       case $f in
       -) echo $tmp/stdin ;;
       [\\/$]*)
-         # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+        # Absolute (can't be DOS-style, as IFS=:)
+        test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
-         echo $f;;
+        echo "$f";;
       *) # Relative
-         if test -f "$f"; then
-           # Build tree
-           echo $f
-         elif test -f "$srcdir/$f"; then
-           # Source tree
-           echo $srcdir/$f
-         else
-           # /dev/null tree
-           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+        if test -f "$f"; then
+          # Build tree
+          echo "$f"
+        elif test -f "$srcdir/$f"; then
+          # Source tree
+          echo "$srcdir/$f"
+        else
+          # /dev/null tree
+          { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
-         fi;;
+        fi;;
       esac
     done` || { (exit 1); exit 1; }
 _ACEOF
@@ -4820,3 +5571,5 @@ if test "$no_create" != yes; then
   $ac_cs_success || { (exit 1); exit 1; }
 fi
 
+
+chmod oug+x rtaudio-config
index 4d853be4b7ce2d892cb53359c53e2ab2e1dbf6df..5c34773fd4388535fb2918d95a4becb0c35b8592 100644 (file)
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
-<h1>RtAudio.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/************************************************************************/</span>
-<a name="l00038"></a>00038 <span class="comment">/************************************************************************/</span>
-<a name="l00039"></a>00039 
-<a name="l00040"></a>00040 <span class="comment">// RtAudio: Version 3.0.3 (18 November 2005)</span>
-<a name="l00041"></a>00041 
-<a name="l00042"></a>00042 <span class="preprocessor">#ifndef __RTAUDIO_H</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define __RTAUDIO_H</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "RtError.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include &lt;string&gt;</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include &lt;vector&gt;</span>
-<a name="l00048"></a>00048 
-<a name="l00049"></a>00049 <span class="comment">// Operating system dependent thread functionality.</span>
-<a name="l00050"></a>00050 <span class="preprocessor">#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__)</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">  #include &lt;windows.h&gt;</span>
-<a name="l00052"></a>00052 <span class="preprocessor">  #include &lt;process.h&gt;</span>
+<h1>RtAudio.h</h1><a href="RtAudio_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/************************************************************************/</span>
+<a name="l00039"></a>00039 <span class="comment">/************************************************************************/</span>
+<a name="l00040"></a>00040 
+<a name="l00045"></a>00045 <span class="comment">// RtAudio: Version 4.0</span>
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047 <span class="preprocessor">#ifndef __RTAUDIO_H</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#define __RTAUDIO_H</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span>
+<a name="l00050"></a>00050 <span class="preprocessor">#include &lt;string&gt;</span>
+<a name="l00051"></a>00051 <span class="preprocessor">#include &lt;vector&gt;</span>
+<a name="l00052"></a>00052 <span class="preprocessor">#include "RtError.h"</span>
 <a name="l00053"></a>00053 
-<a name="l00054"></a>00054   <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ThreadHandle;
-<a name="l00055"></a>00055   <span class="keyword">typedef</span> CRITICAL_SECTION StreamMutex;
-<a name="l00056"></a>00056 
-<a name="l00057"></a>00057 <span class="preprocessor">#else // Various unix flavors with pthread support.</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">  #include &lt;pthread.h&gt;</span>
-<a name="l00059"></a>00059 
-<a name="l00060"></a>00060   <span class="keyword">typedef</span> pthread_t ThreadHandle;
-<a name="l00061"></a>00061   <span class="keyword">typedef</span> pthread_mutex_t StreamMutex;
-<a name="l00062"></a>00062 
-<a name="l00063"></a>00063 <span class="preprocessor">#endif</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span>
-<a name="l00065"></a>00065 <span class="comment">// This global structure type is used to pass callback information</span>
-<a name="l00066"></a>00066 <span class="comment">// between the private RtAudio stream structure and global callback</span>
-<a name="l00067"></a>00067 <span class="comment">// handling functions.</span>
-<a name="l00068"></a>00068 <span class="keyword">struct </span>CallbackInfo {
-<a name="l00069"></a>00069   <span class="keywordtype">void</span> *object;    <span class="comment">// Used as a "this" pointer.</span>
-<a name="l00070"></a>00070   ThreadHandle thread;
-<a name="l00071"></a>00071   <span class="keywordtype">bool</span> usingCallback;
-<a name="l00072"></a>00072   <span class="keywordtype">void</span> *callback;
-<a name="l00073"></a>00073   <span class="keywordtype">void</span> *userData;
-<a name="l00074"></a>00074   <span class="keywordtype">void</span> *apiInfo;   <span class="comment">// void pointer for API specific callback information</span>
-<a name="l00075"></a>00075 
-<a name="l00076"></a>00076   <span class="comment">// Default constructor.</span>
-<a name="l00077"></a>00077   CallbackInfo()
-<a name="l00078"></a>00078     :object(0), usingCallback(false), callback(0),
-<a name="l00079"></a>00079      userData(0), apiInfo(0) {}
-<a name="l00080"></a>00080 };
-<a name="l00081"></a>00081 
-<a name="l00082"></a>00082 <span class="comment">// Support for signed integers and floats.  Audio data fed to/from</span>
-<a name="l00083"></a>00083 <span class="comment">// the tickStream() routine is assumed to ALWAYS be in host</span>
-<a name="l00084"></a>00084 <span class="comment">// byte order.  The internal routines will automatically take care of</span>
-<a name="l00085"></a>00085 <span class="comment">// any necessary byte-swapping between the host format and the</span>
-<a name="l00086"></a>00086 <span class="comment">// soundcard.  Thus, endian-ness is not a concern in the following</span>
-<a name="l00087"></a>00087 <span class="comment">// format definitions.</span>
-<a name="l00088"></a>00088 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> RtAudioFormat;
-<a name="l00089"></a>00089 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT8 = 0x1;    
-<a name="l00090"></a>00090 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT16 = 0x2;   
-<a name="l00091"></a>00091 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT24 = 0x4;   
-<a name="l00092"></a>00092 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT32 = 0x8;   
-<a name="l00093"></a>00093 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_FLOAT32 = 0x10; 
-<a name="l00094"></a>00094 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_FLOAT64 = 0x20; 
-<a name="l00096"></a>00096 <span class="keyword">typedef</span> int (*RtAudioCallback)(<span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> bufferSize, <span class="keywordtype">void</span> *userData);
-<a name="l00097"></a>00097 
-<a name="l00099"></a><a class="code" href="structRtAudioDeviceInfo.html">00099</a> <span class="keyword">struct </span><a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> {
-<a name="l00100"></a><a class="code" href="structRtAudioDeviceInfo.html#o0">00100</a>   std::string <a class="code" href="structRtAudioDeviceInfo.html#o0">name</a>;      
-<a name="l00101"></a><a class="code" href="structRtAudioDeviceInfo.html#o1">00101</a>   <span class="keywordtype">bool</span> <a class="code" href="structRtAudioDeviceInfo.html#o1">probed</a>;          
-<a name="l00102"></a><a class="code" href="structRtAudioDeviceInfo.html#o2">00102</a>   <span class="keywordtype">int</span> <a class="code" href="structRtAudioDeviceInfo.html#o2">outputChannels</a>;   
-<a name="l00103"></a><a class="code" href="structRtAudioDeviceInfo.html#o3">00103</a>   <span class="keywordtype">int</span> <a class="code" href="structRtAudioDeviceInfo.html#o3">inputChannels</a>;    
-<a name="l00104"></a><a class="code" href="structRtAudioDeviceInfo.html#o4">00104</a>   <span class="keywordtype">int</span> <a class="code" href="structRtAudioDeviceInfo.html#o4">duplexChannels</a>;   
-<a name="l00105"></a><a class="code" href="structRtAudioDeviceInfo.html#o5">00105</a>   <span class="keywordtype">bool</span> <a class="code" href="structRtAudioDeviceInfo.html#o5">isDefault</a>;       
-<a name="l00106"></a><a class="code" href="structRtAudioDeviceInfo.html#o6">00106</a>   std::vector&lt;int&gt; <a class="code" href="structRtAudioDeviceInfo.html#o6">sampleRates</a>; 
-<a name="l00107"></a><a class="code" href="structRtAudioDeviceInfo.html#o7">00107</a>   RtAudioFormat <a class="code" href="structRtAudioDeviceInfo.html#o7">nativeFormats</a>;  
-<a name="l00109"></a>00109   <span class="comment">// Default constructor.</span>
-<a name="l00110"></a>00110   <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a>()
-<a name="l00111"></a>00111     :<a class="code" href="structRtAudioDeviceInfo.html#o1">probed</a>(false), <a class="code" href="structRtAudioDeviceInfo.html#o2">outputChannels</a>(0), <a class="code" href="structRtAudioDeviceInfo.html#o3">inputChannels</a>(0),
-<a name="l00112"></a>00112        <a class="code" href="structRtAudioDeviceInfo.html#o4">duplexChannels</a>(0), <a class="code" href="structRtAudioDeviceInfo.html#o5">isDefault</a>(false), <a class="code" href="structRtAudioDeviceInfo.html#o7">nativeFormats</a>(0) {}
-<a name="l00113"></a>00113 };
-<a name="l00114"></a>00114 
-<a name="l00115"></a>00115 <span class="comment">// **************************************************************** //</span>
-<a name="l00116"></a>00116 <span class="comment">//</span>
-<a name="l00117"></a>00117 <span class="comment">// RtApi class declaration.</span>
-<a name="l00118"></a>00118 <span class="comment">//</span>
-<a name="l00119"></a>00119 <span class="comment">// Note that RtApi is an abstract base class and cannot be</span>
-<a name="l00120"></a>00120 <span class="comment">// explicitly instantiated.  The class RtAudio will create an</span>
-<a name="l00121"></a>00121 <span class="comment">// instance of an RtApi subclass (RtApiOss, RtApiAlsa,</span>
-<a name="l00122"></a>00122 <span class="comment">// RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio).</span>
-<a name="l00123"></a>00123 <span class="comment">//</span>
-<a name="l00124"></a>00124 <span class="comment">// **************************************************************** //</span>
-<a name="l00125"></a>00125 
-<a name="l00126"></a>00126 <span class="keyword">class </span>RtApi
-<a name="l00127"></a>00127 {
-<a name="l00128"></a>00128 <span class="keyword">public</span>:
-<a name="l00129"></a>00129 
-<a name="l00130"></a>00130   <span class="keyword">enum</span> StreamState {
-<a name="l00131"></a>00131     STREAM_STOPPED,
-<a name="l00132"></a>00132     STREAM_RUNNING
-<a name="l00133"></a>00133   };
-<a name="l00134"></a>00134 
-<a name="l00135"></a>00135   RtApi();
-<a name="l00136"></a>00136   <span class="keyword">virtual</span> ~RtApi();
-<a name="l00137"></a>00137   <span class="keywordtype">void</span> openStream( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
-<a name="l00138"></a>00138                    <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
-<a name="l00139"></a>00139                    RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
-<a name="l00140"></a>00140                    <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00141"></a>00141   <span class="keywordtype">void</span> openStream( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
-<a name="l00142"></a>00142                    <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
-<a name="l00143"></a>00143                    RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
-<a name="l00144"></a>00144                    <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> *numberOfBuffers );
-<a name="l00145"></a>00145   <span class="keyword">virtual</span> <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData ) = 0;
-<a name="l00146"></a>00146   <span class="keyword">virtual</span> <span class="keywordtype">void</span> cancelStreamCallback() = 0;
-<a name="l00147"></a>00147   <span class="keywordtype">int</span> getDeviceCount(<span class="keywordtype">void</span>);
-<a name="l00148"></a>00148   <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> getDeviceInfo( <span class="keywordtype">int</span> device );
-<a name="l00149"></a>00149   <span class="keywordtype">char</span> * <span class="keyword">const</span> getStreamBuffer();
-<a name="l00150"></a>00150   RtApi::StreamState getStreamState() <span class="keyword">const</span>;
-<a name="l00151"></a>00151   <span class="keyword">virtual</span> <span class="keywordtype">void</span> tickStream() = 0;
-<a name="l00152"></a>00152   <span class="keyword">virtual</span> <span class="keywordtype">void</span> closeStream();
-<a name="l00153"></a>00153   <span class="keyword">virtual</span> <span class="keywordtype">void</span> startStream() = 0;
-<a name="l00154"></a>00154   <span class="keyword">virtual</span> <span class="keywordtype">void</span> stopStream() = 0;
-<a name="l00155"></a>00155   <span class="keyword">virtual</span> <span class="keywordtype">void</span> abortStream() = 0;
-<a name="l00156"></a>00156 
-<a name="l00157"></a>00157 <span class="keyword">protected</span>:
-<a name="l00158"></a>00158 
-<a name="l00159"></a>00159   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MAX_SAMPLE_RATES;
-<a name="l00160"></a>00160   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SAMPLE_RATES[];
-<a name="l00161"></a>00161 
-<a name="l00162"></a>00162   <span class="keyword">enum</span> { FAILURE, SUCCESS };
-<a name="l00163"></a>00163 
-<a name="l00164"></a>00164   <span class="keyword">enum</span> StreamMode {
-<a name="l00165"></a>00165     OUTPUT,
-<a name="l00166"></a>00166     INPUT,
-<a name="l00167"></a>00167     DUPLEX,
-<a name="l00168"></a>00168     UNINITIALIZED = -75
-<a name="l00169"></a>00169   };
-<a name="l00170"></a>00170 
-<a name="l00171"></a>00171   <span class="comment">// A protected structure used for buffer conversion.</span>
-<a name="l00172"></a>00172   <span class="keyword">struct </span>ConvertInfo {
-<a name="l00173"></a>00173     <span class="keywordtype">int</span> channels;
-<a name="l00174"></a>00174     <span class="keywordtype">int</span> inJump, outJump;
-<a name="l00175"></a>00175     RtAudioFormat inFormat, outFormat;
-<a name="l00176"></a>00176     std::vector&lt;int&gt; inOffset;
-<a name="l00177"></a>00177     std::vector&lt;int&gt; outOffset;
-<a name="l00178"></a>00178   };
-<a name="l00179"></a>00179 
-<a name="l00180"></a>00180   <span class="comment">// A protected structure for audio streams.</span>
-<a name="l00181"></a>00181   <span class="keyword">struct </span>RtApiStream {
-<a name="l00182"></a>00182     <span class="keywordtype">int</span> device[2];          <span class="comment">// Playback and record, respectively.</span>
-<a name="l00183"></a>00183     <span class="keywordtype">void</span> *apiHandle;        <span class="comment">// void pointer for API specific stream handle information</span>
-<a name="l00184"></a>00184     StreamMode mode;         <span class="comment">// OUTPUT, INPUT, or DUPLEX.</span>
-<a name="l00185"></a>00185     StreamState state;       <span class="comment">// STOPPED or RUNNING</span>
-<a name="l00186"></a>00186     <span class="keywordtype">char</span> *userBuffer;
-<a name="l00187"></a>00187     <span class="keywordtype">char</span> *deviceBuffer;
-<a name="l00188"></a>00188     <span class="keywordtype">bool</span> doConvertBuffer[2]; <span class="comment">// Playback and record, respectively.</span>
-<a name="l00189"></a>00189     <span class="keywordtype">bool</span> deInterleave[2];    <span class="comment">// Playback and record, respectively.</span>
-<a name="l00190"></a>00190     <span class="keywordtype">bool</span> doByteSwap[2];      <span class="comment">// Playback and record, respectively.</span>
-<a name="l00191"></a>00191     <span class="keywordtype">int</span> sampleRate;
-<a name="l00192"></a>00192     <span class="keywordtype">int</span> bufferSize;
-<a name="l00193"></a>00193     <span class="keywordtype">int</span> nBuffers;
-<a name="l00194"></a>00194     <span class="keywordtype">int</span> nUserChannels[2];    <span class="comment">// Playback and record, respectively.</span>
-<a name="l00195"></a>00195     <span class="keywordtype">int</span> nDeviceChannels[2];  <span class="comment">// Playback and record channels, respectively.</span>
-<a name="l00196"></a>00196     RtAudioFormat userFormat;
-<a name="l00197"></a>00197     RtAudioFormat deviceFormat[2]; <span class="comment">// Playback and record, respectively.</span>
-<a name="l00198"></a>00198     StreamMutex mutex;
-<a name="l00199"></a>00199     CallbackInfo callbackInfo;
-<a name="l00200"></a>00200     ConvertInfo convertInfo[2];
-<a name="l00201"></a>00201 
-<a name="l00202"></a>00202     RtApiStream()
-<a name="l00203"></a>00203       :apiHandle(0), userBuffer(0), deviceBuffer(0) {}
-<a name="l00204"></a>00204   };
-<a name="l00205"></a>00205 
-<a name="l00206"></a>00206   <span class="comment">// A protected device structure for audio devices.</span>
-<a name="l00207"></a>00207   <span class="keyword">struct </span>RtApiDevice {
-<a name="l00208"></a>00208     std::string name;      
-<a name="l00209"></a>00209     <span class="keywordtype">bool</span> probed;           
-<a name="l00210"></a>00210     <span class="keywordtype">void</span> *apiDeviceId;     <span class="comment">// void pointer for API specific device information</span>
-<a name="l00211"></a>00211     <span class="keywordtype">int</span> maxOutputChannels; 
-<a name="l00212"></a>00212     <span class="keywordtype">int</span> maxInputChannels;  
-<a name="l00213"></a>00213     <span class="keywordtype">int</span> maxDuplexChannels; 
-<a name="l00214"></a>00214     <span class="keywordtype">int</span> minOutputChannels; 
-<a name="l00215"></a>00215     <span class="keywordtype">int</span> minInputChannels;  
-<a name="l00216"></a>00216     <span class="keywordtype">int</span> minDuplexChannels; 
-<a name="l00217"></a>00217     <span class="keywordtype">bool</span> hasDuplexSupport; 
-<a name="l00218"></a>00218     <span class="keywordtype">bool</span> isDefault;        
-<a name="l00219"></a>00219     std::vector&lt;int&gt; sampleRates; 
-<a name="l00220"></a>00220     RtAudioFormat nativeFormats;  
-<a name="l00222"></a>00222     <span class="comment">// Default constructor.</span>
-<a name="l00223"></a>00223     RtApiDevice()
-<a name="l00224"></a>00224       :probed(false), apiDeviceId(0), maxOutputChannels(0), maxInputChannels(0),
-<a name="l00225"></a>00225        maxDuplexChannels(0), minOutputChannels(0), minInputChannels(0),
-<a name="l00226"></a>00226        minDuplexChannels(0), isDefault(false), nativeFormats(0) {}
-<a name="l00227"></a>00227   };
-<a name="l00228"></a>00228 
-<a name="l00229"></a>00229   <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">short</span> Int16;
-<a name="l00230"></a>00230   <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> Int32;
-<a name="l00231"></a>00231   <span class="keyword">typedef</span> <span class="keywordtype">float</span> Float32;
-<a name="l00232"></a>00232   <span class="keyword">typedef</span> <span class="keywordtype">double</span> Float64;
-<a name="l00233"></a>00233 
-<a name="l00234"></a>00234   <span class="keywordtype">char</span> message_[1024];
-<a name="l00235"></a>00235   <span class="keywordtype">int</span> nDevices_;
-<a name="l00236"></a>00236   std::vector&lt;RtApiDevice&gt; devices_;
-<a name="l00237"></a>00237   RtApiStream stream_;
-<a name="l00238"></a>00238 
-<a name="l00243"></a>00243   <span class="keyword">virtual</span> <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>) = 0;
-<a name="l00244"></a>00244 
-<a name="l00253"></a>00253   <span class="keyword">virtual</span> <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00254"></a>00254 
-<a name="l00263"></a>00263   <span class="keyword">virtual</span> <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00264"></a>00264                                 <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00265"></a>00265                                 <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00266"></a>00266 
-<a name="l00271"></a>00271   <span class="keyword">virtual</span> <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
-<a name="l00272"></a>00272 
-<a name="l00277"></a>00277   <span class="keyword">virtual</span> <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
-<a name="l00278"></a>00278 
-<a name="l00280"></a>00280   <span class="keywordtype">void</span> clearDeviceInfo( RtApiDevice *info );
-<a name="l00281"></a>00281 
-<a name="l00283"></a>00283   <span class="keywordtype">void</span> clearStreamInfo();
-<a name="l00284"></a>00284 
-<a name="l00286"></a>00286   <span class="keywordtype">void</span> error( <a class="code" href="classRtError.html#w11">RtError::Type</a> type );
-<a name="l00287"></a>00287 
-<a name="l00292"></a>00292   <span class="keywordtype">void</span> verifyStream();
+<a name="l00070"></a><a class="code" href="RtAudio_8h.html#a1">00070</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a>;
+<a name="l00071"></a>00071 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> RTAUDIO_SINT8 = 0x1;    <span class="comment">// 8-bit signed integer.</span>
+<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> RTAUDIO_SINT16 = 0x2;   <span class="comment">// 16-bit signed integer.</span>
+<a name="l00073"></a>00073 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> RTAUDIO_SINT24 = 0x4;   <span class="comment">// Lower 3 bytes of 32-bit signed integer.</span>
+<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> RTAUDIO_SINT32 = 0x8;   <span class="comment">// 32-bit signed integer.</span>
+<a name="l00075"></a>00075 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> RTAUDIO_FLOAT32 = 0x10; <span class="comment">// Normalized between plus/minus 1.0.</span>
+<a name="l00076"></a>00076 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> RTAUDIO_FLOAT64 = 0x20; <span class="comment">// Normalized between plus/minus 1.0.</span>
+<a name="l00077"></a>00077 
+<a name="l00112"></a><a class="code" href="RtAudio_8h.html#a8">00112</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a>;
+<a name="l00113"></a>00113 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a> RTAUDIO_NONINTERLEAVED = 0x1;    <span class="comment">// Use non-interleaved buffers (default = interleaved).</span>
+<a name="l00114"></a>00114 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a> RTAUDIO_MINIMIZE_LATENCY = 0x2;  <span class="comment">// Attempt to set stream parameters for lowest possible latency.</span>
+<a name="l00115"></a>00115 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a> RTAUDIO_HOG_DEVICE = 0x4;        <span class="comment">// Attempt grab device and prevent use by others.</span>
+<a name="l00116"></a>00116 
+<a name="l00128"></a><a class="code" href="RtAudio_8h.html#a12">00128</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a>;
+<a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> RTAUDIO_INPUT_OVERFLOW = 0x1;    <span class="comment">// Input data was discarded because of an overflow condition at the driver.</span>
+<a name="l00130"></a>00130 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> RTAUDIO_OUTPUT_UNDERFLOW = 0x2;  <span class="comment">// The output buffer ran low, likely causing a gap in the output sound.</span>
+<a name="l00131"></a>00131 
+<a name="l00133"></a>00133 
+<a name="l00171"></a><a class="code" href="RtAudio_8h.html#a15">00171</a> <span class="keyword">typedef</span> int (*<a class="code" href="RtAudio_8h.html#a15">RtAudioCallback</a>)( <span class="keywordtype">void</span> *outputBuffer, <span class="keywordtype">void</span> *inputBuffer,
+<a name="l00172"></a>00172                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFrames,
+<a name="l00173"></a>00173                                 <span class="keywordtype">double</span> streamTime,
+<a name="l00174"></a>00174                                 <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> status,
+<a name="l00175"></a>00175                                 <span class="keywordtype">void</span> *userData );
+<a name="l00176"></a>00176 
+<a name="l00177"></a>00177 
+<a name="l00178"></a>00178 <span class="comment">// **************************************************************** //</span>
+<a name="l00179"></a>00179 <span class="comment">//</span>
+<a name="l00180"></a>00180 <span class="comment">// RtAudio class declaration.</span>
+<a name="l00181"></a>00181 <span class="comment">//</span>
+<a name="l00182"></a>00182 <span class="comment">// RtAudio is a "controller" used to select an available audio i/o</span>
+<a name="l00183"></a>00183 <span class="comment">// interface.  It presents a common API for the user to call but all</span>
+<a name="l00184"></a>00184 <span class="comment">// functionality is implemented by the class RtApi and its</span>
+<a name="l00185"></a>00185 <span class="comment">// subclasses.  RtAudio creates an instance of an RtApi subclass</span>
+<a name="l00186"></a>00186 <span class="comment">// based on the user's API choice.  If no choice is made, RtAudio</span>
+<a name="l00187"></a>00187 <span class="comment">// attempts to make a "logical" API selection.</span>
+<a name="l00188"></a>00188 <span class="comment">//</span>
+<a name="l00189"></a>00189 <span class="comment">// **************************************************************** //</span>
+<a name="l00190"></a>00190 
+<a name="l00191"></a>00191 <span class="keyword">class </span>RtApi;
+<a name="l00192"></a>00192 
+<a name="l00193"></a><a class="code" href="classRtAudio.html">00193</a> <span class="keyword">class </span><a class="code" href="classRtAudio.html">RtAudio</a>
+<a name="l00194"></a>00194 {
+<a name="l00195"></a>00195  <span class="keyword">public</span>:
+<a name="l00196"></a>00196 
+<a name="l00198"></a><a class="code" href="classRtAudio.html#w8">00198</a>   <span class="keyword">enum</span> <a class="code" href="classRtAudio.html#w8">Api</a> {
+<a name="l00199"></a>00199     <a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a>,    
+<a name="l00200"></a>00200     <a class="code" href="classRtAudio.html#w8w1">LINUX_ALSA</a>,     
+<a name="l00201"></a>00201     <a class="code" href="classRtAudio.html#w8w2">LINUX_OSS</a>,      
+<a name="l00202"></a>00202     <a class="code" href="classRtAudio.html#w8w3">UNIX_JACK</a>,      
+<a name="l00203"></a>00203     <a class="code" href="classRtAudio.html#w8w4">MACOSX_CORE</a>,    
+<a name="l00204"></a>00204     <a class="code" href="classRtAudio.html#w8w5">WINDOWS_ASIO</a>,   
+<a name="l00205"></a>00205     <a class="code" href="classRtAudio.html#w8w6">WINDOWS_DS</a>,     
+<a name="l00206"></a><a class="code" href="classRtAudio.html#w8w7">00206</a>     <a class="code" href="classRtAudio.html#w8w7">RTAUDIO_DUMMY</a>   
+<a name="l00207"></a>00207   };
+<a name="l00208"></a>00208 
+<a name="l00210"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html">00210</a>   <span class="keyword">struct </span><a class="code" href="structRtAudio_1_1DeviceInfo.html">DeviceInfo</a> {
+<a name="l00211"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o0">00211</a>     <span class="keywordtype">bool</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o0">probed</a>;                  
+<a name="l00212"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o1">00212</a>     std::string <a class="code" href="structRtAudio_1_1DeviceInfo.html#o1">name</a>;             
+<a name="l00213"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o2">00213</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o2">outputChannels</a>;  
+<a name="l00214"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o3">00214</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o3">inputChannels</a>;   
+<a name="l00215"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o4">00215</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o4">duplexChannels</a>;  
+<a name="l00216"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o5">00216</a>     <span class="keywordtype">bool</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o5">isDefaultOutput</a>;         
+<a name="l00217"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o6">00217</a>     <span class="keywordtype">bool</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o6">isDefaultInput</a>;          
+<a name="l00218"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o7">00218</a>     std::vector&lt;unsigned int&gt; <a class="code" href="structRtAudio_1_1DeviceInfo.html#o7">sampleRates</a>; 
+<a name="l00219"></a><a class="code" href="structRtAudio_1_1DeviceInfo.html#o8">00219</a>     <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> <a class="code" href="structRtAudio_1_1DeviceInfo.html#o8">nativeFormats</a>;  
+<a name="l00221"></a>00221     <span class="comment">// Default constructor.</span>
+<a name="l00222"></a>00222     <a class="code" href="structRtAudio_1_1DeviceInfo.html">DeviceInfo</a>()
+<a name="l00223"></a>00223       :<a class="code" href="structRtAudio_1_1DeviceInfo.html#o0">probed</a>(false), <a class="code" href="structRtAudio_1_1DeviceInfo.html#o2">outputChannels</a>(0), <a class="code" href="structRtAudio_1_1DeviceInfo.html#o3">inputChannels</a>(0), <a class="code" href="structRtAudio_1_1DeviceInfo.html#o4">duplexChannels</a>(0),
+<a name="l00224"></a>00224        <a class="code" href="structRtAudio_1_1DeviceInfo.html#o5">isDefaultOutput</a>(false), <a class="code" href="structRtAudio_1_1DeviceInfo.html#o6">isDefaultInput</a>(false), <a class="code" href="structRtAudio_1_1DeviceInfo.html#o8">nativeFormats</a>(0) {}
+<a name="l00225"></a>00225   };
+<a name="l00226"></a>00226 
+<a name="l00228"></a><a class="code" href="structRtAudio_1_1StreamParameters.html">00228</a>   <span class="keyword">struct </span><a class="code" href="structRtAudio_1_1StreamParameters.html">StreamParameters</a> {
+<a name="l00229"></a><a class="code" href="structRtAudio_1_1StreamParameters.html#o0">00229</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a>;     
+<a name="l00230"></a><a class="code" href="structRtAudio_1_1StreamParameters.html#o1">00230</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a>;    
+<a name="l00231"></a><a class="code" href="structRtAudio_1_1StreamParameters.html#o2">00231</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1StreamParameters.html#o2">firstChannel</a>; 
+<a name="l00233"></a>00233     <span class="comment">// Default constructor.</span>
+<a name="l00234"></a>00234     <a class="code" href="structRtAudio_1_1StreamParameters.html">StreamParameters</a>()
+<a name="l00235"></a>00235       : <a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a>(0), <a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a>(0), <a class="code" href="structRtAudio_1_1StreamParameters.html#o2">firstChannel</a>(0) {}
+<a name="l00236"></a>00236   };
+<a name="l00237"></a>00237 
+<a name="l00239"></a>00239 
+<a name="l00284"></a><a class="code" href="structRtAudio_1_1StreamOptions.html">00284</a>   <span class="keyword">struct </span><a class="code" href="structRtAudio_1_1StreamOptions.html">StreamOptions</a> {
+<a name="l00285"></a><a class="code" href="structRtAudio_1_1StreamOptions.html#o0">00285</a>     <a class="code" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a> <a class="code" href="structRtAudio_1_1StreamOptions.html#o0">flags</a>;      
+<a name="l00286"></a><a class="code" href="structRtAudio_1_1StreamOptions.html#o1">00286</a>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structRtAudio_1_1StreamOptions.html#o1">numberOfBuffers</a>;  
+<a name="l00287"></a><a class="code" href="structRtAudio_1_1StreamOptions.html#o2">00287</a>     std::string <a class="code" href="structRtAudio_1_1StreamOptions.html#o2">streamName</a>;        
+<a name="l00289"></a>00289     <span class="comment">// Default constructor.</span>
+<a name="l00290"></a>00290     <a class="code" href="structRtAudio_1_1StreamOptions.html">StreamOptions</a>()
+<a name="l00291"></a>00291       : <a class="code" href="structRtAudio_1_1StreamOptions.html#o0">flags</a>(0), <a class="code" href="structRtAudio_1_1StreamOptions.html#o1">numberOfBuffers</a>(0) {}
+<a name="l00292"></a>00292   };
 <a name="l00293"></a>00293 
-<a name="l00298"></a>00298   <span class="keywordtype">void</span> convertBuffer( <span class="keywordtype">char</span> *outBuffer, <span class="keywordtype">char</span> *inBuffer, ConvertInfo &amp;info );
-<a name="l00299"></a>00299 
-<a name="l00301"></a>00301   <span class="keywordtype">void</span> byteSwapBuffer( <span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> samples, RtAudioFormat format );
-<a name="l00302"></a>00302 
-<a name="l00304"></a>00304   <span class="keywordtype">int</span> formatBytes( RtAudioFormat format );
-<a name="l00305"></a>00305 };
-<a name="l00306"></a>00306 
-<a name="l00307"></a>00307 
-<a name="l00308"></a>00308 <span class="comment">// **************************************************************** //</span>
-<a name="l00309"></a>00309 <span class="comment">//</span>
-<a name="l00310"></a>00310 <span class="comment">// RtAudio class declaration.</span>
-<a name="l00311"></a>00311 <span class="comment">//</span>
-<a name="l00312"></a>00312 <span class="comment">// RtAudio is a "controller" used to select an available audio i/o</span>
-<a name="l00313"></a>00313 <span class="comment">// interface.  It presents a common API for the user to call but all</span>
-<a name="l00314"></a>00314 <span class="comment">// functionality is implemented by the class RtAudioApi and its</span>
-<a name="l00315"></a>00315 <span class="comment">// subclasses.  RtAudio creates an instance of an RtAudioApi subclass</span>
-<a name="l00316"></a>00316 <span class="comment">// based on the user's API choice.  If no choice is made, RtAudio</span>
-<a name="l00317"></a>00317 <span class="comment">// attempts to make a "logical" API selection.</span>
-<a name="l00318"></a>00318 <span class="comment">//</span>
-<a name="l00319"></a>00319 <span class="comment">// **************************************************************** //</span>
-<a name="l00320"></a>00320 
-<a name="l00321"></a><a class="code" href="classRtAudio.html">00321</a> <span class="keyword">class </span><a class="code" href="classRtAudio.html">RtAudio</a>
-<a name="l00322"></a>00322 {
-<a name="l00323"></a>00323 <span class="keyword">public</span>:
+<a name="l00295"></a>00295 
+<a name="l00300"></a>00300   <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#e0">getCompiledApi</a>( std::vector&lt;RtAudio::Api&gt; &amp;apis ) <span class="keywordflow">throw</span>();
+<a name="l00301"></a>00301 
+<a name="l00303"></a>00303 
+<a name="l00311"></a>00311   <a class="code" href="classRtAudio.html#a0">RtAudio</a>( <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> api=<a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a> ) throw();
+<a name="l00312"></a>00312 
+<a name="l00314"></a>00314 
+<a name="l00318"></a>00318   ~<a class="code" href="classRtAudio.html">RtAudio</a>() throw();
+<a name="l00319"></a>00319 
+<a name="l00321"></a>00321   <a class="code" href="classRtAudio.html">RtAudio</a>::<a class="code" href="classRtAudio.html#w8">Api</a> <a class="code" href="classRtAudio.html#a2">getCurrentApi</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00322"></a>00322 
 <a name="l00324"></a>00324 
-<a name="l00326"></a><a class="code" href="classRtAudio.html#w8">00326</a>   <span class="keyword">enum</span> <a class="code" href="classRtAudio.html#w8">RtAudioApi</a> {
-<a name="l00327"></a>00327     <a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a>,    
-<a name="l00328"></a>00328     <a class="code" href="classRtAudio.html#w8w1">LINUX_ALSA</a>,     
-<a name="l00329"></a>00329     <a class="code" href="classRtAudio.html#w8w2">LINUX_OSS</a>,      
-<a name="l00330"></a>00330     <a class="code" href="classRtAudio.html#w8w3">LINUX_JACK</a>,     
-<a name="l00331"></a>00331     <a class="code" href="classRtAudio.html#w8w4">MACOSX_CORE</a>,    
-<a name="l00332"></a>00332     <a class="code" href="classRtAudio.html#w8w5">IRIX_AL</a>,        
-<a name="l00333"></a>00333     <a class="code" href="classRtAudio.html#w8w6">WINDOWS_ASIO</a>,   
-<a name="l00334"></a><a class="code" href="classRtAudio.html#w8w7">00334</a>     <a class="code" href="classRtAudio.html#w8w7">WINDOWS_DS</a>      
-<a name="l00335"></a>00335   };
-<a name="l00336"></a>00336 
-<a name="l00338"></a>00338 
-<a name="l00348"></a>00348   <a class="code" href="classRtAudio.html#a0">RtAudio</a>( <a class="code" href="classRtAudio.html#w8">RtAudioApi</a> api=<a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a> );
-<a name="l00349"></a>00349 
-<a name="l00351"></a>00351 
-<a name="l00362"></a>00362   <a class="code" href="classRtAudio.html#a0">RtAudio</a>( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
-<a name="l00363"></a>00363            <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
-<a name="l00364"></a>00364            RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
-<a name="l00365"></a>00365            <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers, <a class="code" href="classRtAudio.html#w8">RtAudioApi</a> api=<a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a> );
-<a name="l00366"></a>00366 
-<a name="l00368"></a>00368 
-<a name="l00376"></a>00376   <a class="code" href="classRtAudio.html#a0">RtAudio</a>( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
-<a name="l00377"></a>00377            <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
-<a name="l00378"></a>00378            RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
-<a name="l00379"></a>00379            <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> *numberOfBuffers, <a class="code" href="classRtAudio.html#w8">RtAudioApi</a> api=<a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a> );
-<a name="l00380"></a>00380 
-<a name="l00382"></a>00382 
-<a name="l00386"></a>00386   <a class="code" href="classRtAudio.html#a3">~RtAudio</a>();
-<a name="l00387"></a>00387 
-<a name="l00389"></a>00389 
-<a name="l00415"></a>00415   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a4">openStream</a>( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
-<a name="l00416"></a>00416                    <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
-<a name="l00417"></a>00417                    RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
-<a name="l00418"></a>00418                    <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00419"></a>00419 
-<a name="l00421"></a>00421 
-<a name="l00429"></a>00429   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a4">openStream</a>( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
-<a name="l00430"></a>00430                    <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
-<a name="l00431"></a>00431                    RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
-<a name="l00432"></a>00432                    <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> *numberOfBuffers );
-<a name="l00433"></a>00433 
-<a name="l00435"></a>00435 
-<a name="l00454"></a><a class="code" href="classRtAudio.html#a6">00454</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a6">setStreamCallback</a>(RtAudioCallback callback, <span class="keywordtype">void</span> *userData) { rtapi_-&gt;setStreamCallback( callback, userData ); };
+<a name="l00329"></a>00329   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a3">getDeviceCount</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00330"></a>00330 
+<a name="l00332"></a>00332 
+<a name="l00342"></a>00342   <a class="code" href="classRtAudio.html">RtAudio</a>::DeviceInfo <a class="code" href="classRtAudio.html#a4">getDeviceInfo</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00343"></a>00343 
+<a name="l00345"></a>00345 
+<a name="l00352"></a>00352   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a5">getDefaultOutputDevice</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00353"></a>00353 
+<a name="l00355"></a>00355 
+<a name="l00362"></a>00362   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a6">getDefaultInputDevice</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00363"></a>00363 
+<a name="l00365"></a>00365 
+<a name="l00402"></a>00402   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a7">openStream</a>( <a class="code" href="classRtAudio.html">RtAudio</a>::StreamParameters *outputParameters,
+<a name="l00403"></a>00403                    <a class="code" href="classRtAudio.html">RtAudio</a>::StreamParameters *inputParameters,
+<a name="l00404"></a>00404                    <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00405"></a>00405                    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferFrames, <a class="code" href="RtAudio_8h.html#a15">RtAudioCallback</a> callback,
+<a name="l00406"></a>00406                    <span class="keywordtype">void</span> *userData = NULL, <a class="code" href="classRtAudio.html">RtAudio</a>::StreamOptions *options = NULL );
+<a name="l00407"></a>00407 
+<a name="l00409"></a>00409 
+<a name="l00413"></a>00413   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a8">closeStream</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00414"></a>00414 
+<a name="l00416"></a>00416 
+<a name="l00422"></a>00422   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a9">startStream</a>( <span class="keywordtype">void</span> );
+<a name="l00423"></a>00423 
+<a name="l00425"></a>00425 
+<a name="l00431"></a>00431   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a10">stopStream</a>( <span class="keywordtype">void</span> );
+<a name="l00432"></a>00432 
+<a name="l00434"></a>00434 
+<a name="l00440"></a>00440   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a11">abortStream</a>( <span class="keywordtype">void</span> );
+<a name="l00441"></a>00441 
+<a name="l00443"></a>00443   <span class="keywordtype">bool</span> <a class="code" href="classRtAudio.html#a12">isStreamOpen</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00444"></a>00444 
+<a name="l00446"></a>00446   <span class="keywordtype">bool</span> <a class="code" href="classRtAudio.html#a13">isStreamRunning</a>( <span class="keywordtype">void</span> ) throw();
+<a name="l00447"></a>00447 
+<a name="l00449"></a>00449 
+<a name="l00452"></a>00452   <span class="keywordtype">double</span> <a class="code" href="classRtAudio.html#a14">getStreamTime</a>( <span class="keywordtype">void</span> );
+<a name="l00453"></a>00453 
 <a name="l00455"></a>00455 
-<a name="l00457"></a>00457 
-<a name="l00464"></a><a class="code" href="classRtAudio.html#a7">00464</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a7">cancelStreamCallback</a>() { rtapi_-&gt;cancelStreamCallback(); };
-<a name="l00465"></a>00465 
-<a name="l00467"></a><a class="code" href="classRtAudio.html#a8">00467</a>   <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a8">getDeviceCount</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> rtapi_-&gt;getDeviceCount(); };
-<a name="l00468"></a>00468 
-<a name="l00470"></a>00470 
-<a name="l00478"></a><a class="code" href="classRtAudio.html#a9">00478</a>   <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> <a class="code" href="classRtAudio.html#a9">getDeviceInfo</a>(<span class="keywordtype">int</span> device) { <span class="keywordflow">return</span> rtapi_-&gt;getDeviceInfo( device ); };
-<a name="l00479"></a>00479 
+<a name="l00463"></a>00463   <span class="keywordtype">long</span> <a class="code" href="classRtAudio.html#a15">getStreamLatency</a>( <span class="keywordtype">void</span> );
+<a name="l00464"></a>00464 
+<a name="l00466"></a>00466   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a16">showWarnings</a>( <span class="keywordtype">bool</span> value = true ) throw();
+<a name="l00467"></a>00467 
+<a name="l00468"></a>00468  protected:
+<a name="l00469"></a>00469 
+<a name="l00470"></a>00470   <span class="keywordtype">void</span> openRtApi( <a class="code" href="classRtAudio.html">RtAudio</a>::<a class="code" href="classRtAudio.html#w8">Api</a> api );
+<a name="l00471"></a>00471   RtApi *rtapi_;
+<a name="l00472"></a>00472 };
+<a name="l00473"></a>00473 
+<a name="l00474"></a>00474 <span class="comment">// Operating system dependent thread functionality.</span>
+<a name="l00475"></a>00475 #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__)
+<a name="l00476"></a>00476   #include &lt;windows.h&gt;
+<a name="l00477"></a>00477   #include &lt;process.h&gt;
+<a name="l00478"></a>00478 
+<a name="l00479"></a>00479   typedef <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ThreadHandle;
+<a name="l00480"></a>00480   typedef CRITICAL_SECTION StreamMutex;
 <a name="l00481"></a>00481 
-<a name="l00486"></a><a class="code" href="classRtAudio.html#a10">00486</a>   <span class="keywordtype">char</span> * <span class="keyword">const</span> <a class="code" href="classRtAudio.html#a10">getStreamBuffer</a>() { <span class="keywordflow">return</span> rtapi_-&gt;getStreamBuffer(); };
-<a name="l00487"></a>00487 
-<a name="l00489"></a>00489 
-<a name="l00494"></a><a class="code" href="classRtAudio.html#a11">00494</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a11">tickStream</a>() { rtapi_-&gt;tickStream(); };
-<a name="l00495"></a>00495 
-<a name="l00497"></a>00497 
-<a name="l00501"></a><a class="code" href="classRtAudio.html#a12">00501</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a12">closeStream</a>()  { rtapi_-&gt;closeStream(); };
-<a name="l00502"></a>00502 
-<a name="l00504"></a>00504 
-<a name="l00508"></a><a class="code" href="classRtAudio.html#a13">00508</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a13">startStream</a>() { rtapi_-&gt;startStream(); };
-<a name="l00509"></a>00509 
-<a name="l00511"></a>00511 
-<a name="l00515"></a><a class="code" href="classRtAudio.html#a14">00515</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a14">stopStream</a>() { rtapi_-&gt;stopStream(); };
-<a name="l00516"></a>00516 
-<a name="l00518"></a>00518 
-<a name="l00522"></a><a class="code" href="classRtAudio.html#a15">00522</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a15">abortStream</a>() { rtapi_-&gt;abortStream(); };
-<a name="l00523"></a>00523 
-<a name="l00524"></a>00524 
-<a name="l00525"></a>00525  <span class="keyword">protected</span>:
+<a name="l00482"></a>00482 #elif defined(__LINUX_ALSA__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)
+<a name="l00483"></a>00483   <span class="comment">// Using pthread library for various flavors of unix.</span>
+<a name="l00484"></a>00484   #include &lt;pthread.h&gt;
+<a name="l00485"></a>00485 
+<a name="l00486"></a>00486   typedef pthread_t ThreadHandle;
+<a name="l00487"></a>00487   typedef pthread_mutex_t StreamMutex;
+<a name="l00488"></a>00488 
+<a name="l00489"></a>00489 #else <span class="comment">// Setup for "dummy" behavior</span>
+<a name="l00490"></a>00490 
+<a name="l00491"></a>00491   #define __RTAUDIO_DUMMY__
+<a name="l00492"></a>00492   typedef <span class="keywordtype">int</span> ThreadHandle;
+<a name="l00493"></a>00493   typedef <span class="keywordtype">int</span> StreamMutex;
+<a name="l00494"></a>00494 
+<a name="l00495"></a>00495 #endif
+<a name="l00496"></a>00496 
+<a name="l00497"></a>00497 <span class="comment">// This global structure type is used to pass callback information</span>
+<a name="l00498"></a>00498 <span class="comment">// between the private RtAudio stream structure and global callback</span>
+<a name="l00499"></a>00499 <span class="comment">// handling functions.</span>
+<a name="l00500"></a>00500 struct CallbackInfo {
+<a name="l00501"></a>00501   <span class="keywordtype">void</span> *object;    <span class="comment">// Used as a "this" pointer.</span>
+<a name="l00502"></a>00502   ThreadHandle thread;
+<a name="l00503"></a>00503   <span class="keywordtype">void</span> *callback;
+<a name="l00504"></a>00504   <span class="keywordtype">void</span> *userData;
+<a name="l00505"></a>00505   <span class="keywordtype">void</span> *apiInfo;   <span class="comment">// void pointer for API specific callback information</span>
+<a name="l00506"></a>00506   <span class="keywordtype">bool</span> isRunning;
+<a name="l00507"></a>00507 
+<a name="l00508"></a>00508   <span class="comment">// Default constructor.</span>
+<a name="l00509"></a>00509   CallbackInfo()
+<a name="l00510"></a>00510     :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {}
+<a name="l00511"></a>00511 };
+<a name="l00512"></a>00512 
+<a name="l00513"></a>00513 <span class="comment">// **************************************************************** //</span>
+<a name="l00514"></a>00514 <span class="comment">//</span>
+<a name="l00515"></a>00515 <span class="comment">// RtApi class declaration.</span>
+<a name="l00516"></a>00516 <span class="comment">//</span>
+<a name="l00517"></a>00517 <span class="comment">// Subclasses of RtApi contain all API- and OS-specific code necessary</span>
+<a name="l00518"></a>00518 <span class="comment">// to fully implement the RtAudio API.</span>
+<a name="l00519"></a>00519 <span class="comment">//</span>
+<a name="l00520"></a>00520 <span class="comment">// Note that RtApi is an abstract base class and cannot be</span>
+<a name="l00521"></a>00521 <span class="comment">// explicitly instantiated.  The class RtAudio will create an</span>
+<a name="l00522"></a>00522 <span class="comment">// instance of an RtApi subclass (RtApiOss, RtApiAlsa,</span>
+<a name="l00523"></a>00523 <span class="comment">// RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio).</span>
+<a name="l00524"></a>00524 <span class="comment">//</span>
+<a name="l00525"></a>00525 <span class="comment">// **************************************************************** //</span>
 <a name="l00526"></a>00526 
-<a name="l00527"></a>00527   <span class="keywordtype">void</span> initialize( <a class="code" href="classRtAudio.html#w8">RtAudioApi</a> api );
-<a name="l00528"></a>00528 
-<a name="l00529"></a>00529   RtApi *rtapi_;
-<a name="l00530"></a>00530 };
-<a name="l00531"></a>00531 
+<a name="l00527"></a>00527 <span class="preprocessor">#if defined( HAVE_GETTIMEOFDAY )</span>
+<a name="l00528"></a>00528 <span class="preprocessor"></span><span class="preprocessor">  #include &lt;sys/time.h&gt;</span>
+<a name="l00529"></a>00529 <span class="preprocessor">#endif</span>
+<a name="l00530"></a>00530 <span class="preprocessor"></span>
+<a name="l00531"></a>00531 <span class="preprocessor">#include &lt;sstream&gt;</span>
 <a name="l00532"></a>00532 
-<a name="l00533"></a>00533 <span class="comment">// RtApi Subclass prototypes.</span>
-<a name="l00534"></a>00534 
-<a name="l00535"></a>00535 <span class="preprocessor">#if defined(__LINUX_ALSA__)</span>
-<a name="l00536"></a>00536 <span class="preprocessor"></span>
-<a name="l00537"></a>00537 <span class="keyword">class </span>RtApiAlsa: <span class="keyword">public</span> RtApi
-<a name="l00538"></a>00538 {
-<a name="l00539"></a>00539 <span class="keyword">public</span>:
-<a name="l00540"></a>00540 
-<a name="l00541"></a>00541   RtApiAlsa();
-<a name="l00542"></a>00542   ~RtApiAlsa();
-<a name="l00543"></a>00543   <span class="keywordtype">void</span> tickStream();
-<a name="l00544"></a>00544   <span class="keywordtype">void</span> closeStream();
-<a name="l00545"></a>00545   <span class="keywordtype">void</span> startStream();
-<a name="l00546"></a>00546   <span class="keywordtype">void</span> stopStream();
-<a name="l00547"></a>00547   <span class="keywordtype">void</span> abortStream();
-<a name="l00548"></a>00548   <span class="keywordtype">int</span> streamWillBlock();
-<a name="l00549"></a>00549   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00550"></a>00550   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00551"></a>00551 
-<a name="l00552"></a>00552   <span class="keyword">private</span>:
-<a name="l00553"></a>00553 
-<a name="l00554"></a>00554   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00555"></a>00555   <span class="keywordtype">bool</span> primeOutputBuffer();
-<a name="l00556"></a>00556   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00557"></a>00557   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00558"></a>00558                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00559"></a>00559                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00560"></a>00560 };
+<a name="l00533"></a>00533 <span class="keyword">class </span>RtApi
+<a name="l00534"></a>00534 {
+<a name="l00535"></a>00535 <span class="keyword">public</span>:
+<a name="l00536"></a>00536 
+<a name="l00537"></a>00537   RtApi();
+<a name="l00538"></a>00538   <span class="keyword">virtual</span> ~RtApi();
+<a name="l00539"></a>00539   <span class="keyword">virtual</span> <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> <a class="code" href="classRtAudio.html#a2">getCurrentApi</a>( <span class="keywordtype">void</span> ) = 0;
+<a name="l00540"></a>00540   <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a3">getDeviceCount</a>( <span class="keywordtype">void</span> ) = 0;
+<a name="l00541"></a>00541   <span class="keyword">virtual</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> <a class="code" href="classRtAudio.html#a4">getDeviceInfo</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device ) = 0;
+<a name="l00542"></a>00542   <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a6">getDefaultInputDevice</a>( <span class="keywordtype">void</span> );
+<a name="l00543"></a>00543   <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a5">getDefaultOutputDevice</a>( <span class="keywordtype">void</span> );
+<a name="l00544"></a>00544   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a7">openStream</a>( <a class="code" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> *outputParameters,
+<a name="l00545"></a>00545                    <a class="code" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> *inputParameters,
+<a name="l00546"></a>00546                    <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00547"></a>00547                    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferFrames, <a class="code" href="RtAudio_8h.html#a15">RtAudioCallback</a> callback,
+<a name="l00548"></a>00548                    <span class="keywordtype">void</span> *userData, <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00549"></a>00549   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a8">closeStream</a>( <span class="keywordtype">void</span> );
+<a name="l00550"></a>00550   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a9">startStream</a>( <span class="keywordtype">void</span> ) = 0;
+<a name="l00551"></a>00551   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a10">stopStream</a>( <span class="keywordtype">void</span> ) = 0;
+<a name="l00552"></a>00552   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a11">abortStream</a>( <span class="keywordtype">void</span> ) = 0;
+<a name="l00553"></a>00553   <span class="keywordtype">long</span> <a class="code" href="classRtAudio.html#a15">getStreamLatency</a>( <span class="keywordtype">void</span> );
+<a name="l00554"></a>00554   <span class="keyword">virtual</span> <span class="keywordtype">double</span> <a class="code" href="classRtAudio.html#a14">getStreamTime</a>( <span class="keywordtype">void</span> );
+<a name="l00555"></a>00555   <span class="keywordtype">bool</span> <a class="code" href="classRtAudio.html#a12">isStreamOpen</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> stream_.state != STREAM_CLOSED; };
+<a name="l00556"></a>00556   <span class="keywordtype">bool</span> <a class="code" href="classRtAudio.html#a13">isStreamRunning</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> stream_.state == STREAM_RUNNING; };
+<a name="l00557"></a>00557   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a16">showWarnings</a>( <span class="keywordtype">bool</span> value ) { showWarnings_ = value; };
+<a name="l00558"></a>00558 
+<a name="l00559"></a>00559 
+<a name="l00560"></a>00560 <span class="keyword">protected</span>:
 <a name="l00561"></a>00561 
-<a name="l00562"></a>00562 <span class="preprocessor">#endif</span>
-<a name="l00563"></a>00563 <span class="preprocessor"></span>
-<a name="l00564"></a>00564 <span class="preprocessor">#if defined(__LINUX_JACK__)</span>
-<a name="l00565"></a>00565 <span class="preprocessor"></span>
-<a name="l00566"></a>00566 <span class="keyword">class </span>RtApiJack: <span class="keyword">public</span> RtApi
-<a name="l00567"></a>00567 {
-<a name="l00568"></a>00568 <span class="keyword">public</span>:
-<a name="l00569"></a>00569 
-<a name="l00570"></a>00570   RtApiJack();
-<a name="l00571"></a>00571   ~RtApiJack();
-<a name="l00572"></a>00572   <span class="keywordtype">void</span> tickStream();
-<a name="l00573"></a>00573   <span class="keywordtype">void</span> closeStream();
-<a name="l00574"></a>00574   <span class="keywordtype">void</span> startStream();
-<a name="l00575"></a>00575   <span class="keywordtype">void</span> stopStream();
-<a name="l00576"></a>00576   <span class="keywordtype">void</span> abortStream();
-<a name="l00577"></a>00577   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00578"></a>00578   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00579"></a>00579   <span class="comment">// This function is intended for internal use only.  It must be</span>
-<a name="l00580"></a>00580   <span class="comment">// public because it is called by the internal callback handler,</span>
-<a name="l00581"></a>00581   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
-<a name="l00582"></a>00582   <span class="comment">// will most likely produce highly undesireable results!</span>
-<a name="l00583"></a>00583   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nframes );
-<a name="l00584"></a>00584 
-<a name="l00585"></a>00585   <span class="keyword">private</span>:
-<a name="l00586"></a>00586 
-<a name="l00587"></a>00587   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00588"></a>00588   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00589"></a>00589   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00590"></a>00590                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00591"></a>00591                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00592"></a>00592 };
-<a name="l00593"></a>00593 
-<a name="l00594"></a>00594 <span class="preprocessor">#endif</span>
-<a name="l00595"></a>00595 <span class="preprocessor"></span>
-<a name="l00596"></a>00596 <span class="preprocessor">#if defined(__LINUX_OSS__)</span>
-<a name="l00597"></a>00597 <span class="preprocessor"></span>
-<a name="l00598"></a>00598 <span class="keyword">class </span>RtApiOss: <span class="keyword">public</span> RtApi
-<a name="l00599"></a>00599 {
-<a name="l00600"></a>00600 <span class="keyword">public</span>:
-<a name="l00601"></a>00601 
-<a name="l00602"></a>00602   RtApiOss();
-<a name="l00603"></a>00603   ~RtApiOss();
-<a name="l00604"></a>00604   <span class="keywordtype">void</span> tickStream();
-<a name="l00605"></a>00605   <span class="keywordtype">void</span> closeStream();
-<a name="l00606"></a>00606   <span class="keywordtype">void</span> startStream();
-<a name="l00607"></a>00607   <span class="keywordtype">void</span> stopStream();
-<a name="l00608"></a>00608   <span class="keywordtype">void</span> abortStream();
-<a name="l00609"></a>00609   <span class="keywordtype">int</span> streamWillBlock();
-<a name="l00610"></a>00610   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00611"></a>00611   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00612"></a>00612 
-<a name="l00613"></a>00613   <span class="keyword">private</span>:
-<a name="l00614"></a>00614 
-<a name="l00615"></a>00615   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00616"></a>00616   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00617"></a>00617   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00618"></a>00618                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00619"></a>00619                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00620"></a>00620 };
-<a name="l00621"></a>00621 
-<a name="l00622"></a>00622 <span class="preprocessor">#endif</span>
-<a name="l00623"></a>00623 <span class="preprocessor"></span>
-<a name="l00624"></a>00624 <span class="preprocessor">#if defined(__MACOSX_CORE__)</span>
-<a name="l00625"></a>00625 <span class="preprocessor"></span>
-<a name="l00626"></a>00626 <span class="preprocessor">#include &lt;CoreAudio/AudioHardware.h&gt;</span>
-<a name="l00627"></a>00627 
-<a name="l00628"></a>00628 <span class="keyword">class </span>RtApiCore: <span class="keyword">public</span> RtApi
-<a name="l00629"></a>00629 {
-<a name="l00630"></a>00630 <span class="keyword">public</span>:
-<a name="l00631"></a>00631 
-<a name="l00632"></a>00632   RtApiCore();
-<a name="l00633"></a>00633   ~RtApiCore();
-<a name="l00634"></a>00634   <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
-<a name="l00635"></a>00635   <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
-<a name="l00636"></a>00636   <span class="keywordtype">void</span> tickStream();
-<a name="l00637"></a>00637   <span class="keywordtype">void</span> closeStream();
-<a name="l00638"></a>00638   <span class="keywordtype">void</span> startStream();
-<a name="l00639"></a>00639   <span class="keywordtype">void</span> stopStream();
-<a name="l00640"></a>00640   <span class="keywordtype">void</span> abortStream();
-<a name="l00641"></a>00641   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00642"></a>00642   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00643"></a>00643 
-<a name="l00644"></a>00644   <span class="comment">// This function is intended for internal use only.  It must be</span>
-<a name="l00645"></a>00645   <span class="comment">// public because it is called by the internal callback handler,</span>
-<a name="l00646"></a>00646   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
-<a name="l00647"></a>00647   <span class="comment">// will most likely produce highly undesireable results!</span>
-<a name="l00648"></a>00648   <span class="keywordtype">void</span> callbackEvent( AudioDeviceID deviceId, <span class="keywordtype">void</span> *inData, <span class="keywordtype">void</span> *outData );
-<a name="l00649"></a>00649 
-<a name="l00650"></a>00650   <span class="keyword">private</span>:
-<a name="l00651"></a>00651 
-<a name="l00652"></a>00652   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00653"></a>00653   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00654"></a>00654   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00655"></a>00655                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00656"></a>00656                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00657"></a>00657 };
-<a name="l00658"></a>00658 
-<a name="l00659"></a>00659 <span class="preprocessor">#endif</span>
-<a name="l00660"></a>00660 <span class="preprocessor"></span>
-<a name="l00661"></a>00661 <span class="preprocessor">#if defined(__WINDOWS_DS__)</span>
-<a name="l00662"></a>00662 <span class="preprocessor"></span>
-<a name="l00663"></a>00663 <span class="keyword">class </span>RtApiDs: <span class="keyword">public</span> RtApi
-<a name="l00664"></a>00664 {
-<a name="l00665"></a>00665 <span class="keyword">public</span>:
-<a name="l00666"></a>00666 
-<a name="l00667"></a>00667   RtApiDs();
-<a name="l00668"></a>00668   ~RtApiDs();
-<a name="l00669"></a>00669   <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
-<a name="l00670"></a>00670   <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
-<a name="l00671"></a>00671   <span class="keywordtype">void</span> tickStream();
-<a name="l00672"></a>00672   <span class="keywordtype">void</span> closeStream();
-<a name="l00673"></a>00673   <span class="keywordtype">void</span> startStream();
-<a name="l00674"></a>00674   <span class="keywordtype">void</span> stopStream();
-<a name="l00675"></a>00675   <span class="keywordtype">void</span> abortStream();
-<a name="l00676"></a>00676   <span class="keywordtype">int</span> streamWillBlock();
-<a name="l00677"></a>00677   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00678"></a>00678   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00679"></a>00679 
-<a name="l00680"></a>00680   <span class="keyword">public</span>:
-<a name="l00681"></a>00681   <span class="comment">// \brief Internal structure that provide debug information on the state of a running DSound device.</span>
-<a name="l00682"></a>00682   <span class="keyword">struct </span>RtDsStatistics {
-<a name="l00683"></a>00683     <span class="comment">// \brief Sample Rate.</span>
-<a name="l00684"></a>00684     <span class="keywordtype">long</span> sampleRate;
-<a name="l00685"></a>00685     <span class="comment">// \brief The size of one sample * number of channels on the input device.</span>
-<a name="l00686"></a>00686     <span class="keywordtype">int</span> inputFrameSize; 
-<a name="l00687"></a>00687     <span class="comment">// \brief The size of one sample * number of channels on the output device.</span>
-<a name="l00688"></a>00688     <span class="keywordtype">int</span> outputFrameSize; 
-<a name="l00689"></a>00689     <span class="comment">/* \brief The number of times the read pointer had to be adjusted to avoid reading from an unsafe buffer position.</span>
-<a name="l00690"></a>00690 <span class="comment">     *</span>
-<a name="l00691"></a>00691 <span class="comment">     * This field is only used when running in DUPLEX mode. INPUT mode devices just wait until the data is </span>
-<a name="l00692"></a>00692 <span class="comment">     * available.</span>
-<a name="l00693"></a>00693 <span class="comment">     */</span>
-<a name="l00694"></a>00694     <span class="keywordtype">int</span> numberOfReadOverruns;
-<a name="l00695"></a>00695     <span class="comment">// \brief The number of times the write pointer had to be adjusted to avoid writing in an unsafe buffer position.</span>
-<a name="l00696"></a>00696     <span class="keywordtype">int</span> numberOfWriteUnderruns;
-<a name="l00697"></a>00697     <span class="comment">// \brief Number of bytes by attribute to buffer configuration by which writing must lead the current write pointer.</span>
-<a name="l00698"></a>00698     <span class="keywordtype">int</span> writeDeviceBufferLeadBytes;
-<a name="l00699"></a>00699     <span class="comment">// \brief Number of bytes by attributable to the device driver by which writing must lead the current write pointer on this output device.</span>
-<a name="l00700"></a>00700     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> writeDeviceSafeLeadBytes;
-<a name="l00701"></a>00701     <span class="comment">// \brief Number of bytes by which reading must trail the current read pointer on this input device.</span>
-<a name="l00702"></a>00702     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> readDeviceSafeLeadBytes; 
-<a name="l00703"></a>00703     <span class="comment">/* \brief Estimated latency in seconds. </span>
-<a name="l00704"></a>00704 <span class="comment">    *</span>
-<a name="l00705"></a>00705 <span class="comment">    * For INPUT mode devices, based the latency of the device's safe read pointer, plus one buffer's</span>
-<a name="l00706"></a>00706 <span class="comment">    * worth of additional latency.</span>
-<a name="l00707"></a>00707 <span class="comment">    *</span>
-<a name="l00708"></a>00708 <span class="comment">    * For OUTPUT mode devices, the latency of the device's safe write pointer, plus N buffers of </span>
-<a name="l00709"></a>00709 <span class="comment">    * additional buffer latency.</span>
-<a name="l00710"></a>00710 <span class="comment">    *</span>
-<a name="l00711"></a>00711 <span class="comment">    * For DUPLEX devices, the sum of latencies for both input and output devices. DUPLEX devices</span>
-<a name="l00712"></a>00712 <span class="comment">    * also back off the read pointers an additional amount in order to maintain synchronization </span>
-<a name="l00713"></a>00713 <span class="comment">    * between out-of-phase read and write pointers. This time is also included.</span>
-<a name="l00714"></a>00714 <span class="comment">    *</span>
-<a name="l00715"></a>00715 <span class="comment">    * Note that most software packages report latency between the safe write pointer </span>
-<a name="l00716"></a>00716 <span class="comment">    * and the software lead pointer, excluding the hardware device's safe write pointer </span>
-<a name="l00717"></a>00717 <span class="comment">    * latency. Figures of 1 or 2ms of latency on Windows audio devices are invariably of this type.</span>
-<a name="l00718"></a>00718 <span class="comment">    * The reality is that hardware devices often have latencies of 30ms or more (often much </span>
-<a name="l00719"></a>00719 <span class="comment">    * higher for duplex operation).</span>
-<a name="l00720"></a>00720 <span class="comment">    */</span>
-<a name="l00721"></a>00721 
-<a name="l00722"></a>00722     <span class="keywordtype">double</span> latency;
-<a name="l00723"></a>00723   };
-<a name="l00724"></a>00724   <span class="comment">// \brief Report on the current state of a running DSound device.</span>
-<a name="l00725"></a>00725   <span class="keyword">static</span> RtDsStatistics getDsStatistics();
-<a name="l00726"></a>00726 
-<a name="l00727"></a>00727   <span class="keyword">private</span>:
-<a name="l00728"></a>00728 
-<a name="l00729"></a>00729   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00730"></a>00730   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00731"></a>00731   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00732"></a>00732                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00733"></a>00733                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00734"></a>00734 
-<a name="l00735"></a>00735   <span class="keywordtype">bool</span> coInitialized;
-<a name="l00736"></a>00736   <span class="keywordtype">bool</span> buffersRolling;
-<a name="l00737"></a>00737   <span class="keywordtype">long</span> duplexPrerollBytes;
-<a name="l00738"></a>00738   <span class="keyword">static</span> RtDsStatistics statistics;
-<a name="l00739"></a>00739 
-<a name="l00740"></a>00740 };
-<a name="l00741"></a>00741 
-<a name="l00742"></a>00742 <span class="preprocessor">#endif</span>
-<a name="l00743"></a>00743 <span class="preprocessor"></span>
-<a name="l00744"></a>00744 <span class="preprocessor">#if defined(__WINDOWS_ASIO__)</span>
-<a name="l00745"></a>00745 <span class="preprocessor"></span>
-<a name="l00746"></a>00746 <span class="keyword">class </span>RtApiAsio: <span class="keyword">public</span> RtApi
-<a name="l00747"></a>00747 {
-<a name="l00748"></a>00748 <span class="keyword">public</span>:
-<a name="l00749"></a>00749 
-<a name="l00750"></a>00750   RtApiAsio();
-<a name="l00751"></a>00751   ~RtApiAsio();
-<a name="l00752"></a>00752   <span class="keywordtype">void</span> tickStream();
-<a name="l00753"></a>00753   <span class="keywordtype">void</span> closeStream();
-<a name="l00754"></a>00754   <span class="keywordtype">void</span> startStream();
-<a name="l00755"></a>00755   <span class="keywordtype">void</span> stopStream();
-<a name="l00756"></a>00756   <span class="keywordtype">void</span> abortStream();
-<a name="l00757"></a>00757   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00758"></a>00758   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00759"></a>00759 
-<a name="l00760"></a>00760   <span class="comment">// This function is intended for internal use only.  It must be</span>
-<a name="l00761"></a>00761   <span class="comment">// public because it is called by the internal callback handler,</span>
-<a name="l00762"></a>00762   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
-<a name="l00763"></a>00763   <span class="comment">// will most likely produce highly undesireable results!</span>
-<a name="l00764"></a>00764   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">long</span> bufferIndex );
-<a name="l00765"></a>00765 
-<a name="l00766"></a>00766   <span class="keyword">private</span>:
+<a name="l00562"></a>00562   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MAX_SAMPLE_RATES;
+<a name="l00563"></a>00563   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SAMPLE_RATES[];
+<a name="l00564"></a>00564 
+<a name="l00565"></a>00565   <span class="keyword">enum</span> { FAILURE, SUCCESS };
+<a name="l00566"></a>00566 
+<a name="l00567"></a>00567   <span class="keyword">enum</span> ErrorType {
+<a name="l00568"></a>00568     WARNING,
+<a name="l00569"></a>00569     INVALID_CALL,
+<a name="l00570"></a>00570     SYSTEM
+<a name="l00571"></a>00571   };
+<a name="l00572"></a>00572 
+<a name="l00573"></a>00573   <span class="keyword">enum</span> StreamState {
+<a name="l00574"></a>00574     STREAM_STOPPED,
+<a name="l00575"></a>00575     STREAM_RUNNING,
+<a name="l00576"></a>00576     STREAM_CLOSED = -50
+<a name="l00577"></a>00577   };
+<a name="l00578"></a>00578 
+<a name="l00579"></a>00579   <span class="keyword">enum</span> StreamMode {
+<a name="l00580"></a>00580     OUTPUT,
+<a name="l00581"></a>00581     INPUT,
+<a name="l00582"></a>00582     DUPLEX,
+<a name="l00583"></a>00583     UNINITIALIZED = -75
+<a name="l00584"></a>00584   };
+<a name="l00585"></a>00585 
+<a name="l00586"></a>00586   <span class="comment">// A protected structure used for buffer conversion.</span>
+<a name="l00587"></a>00587   <span class="keyword">struct </span>ConvertInfo {
+<a name="l00588"></a>00588     <span class="keywordtype">int</span> channels;
+<a name="l00589"></a>00589     <span class="keywordtype">int</span> inJump, outJump;
+<a name="l00590"></a>00590     <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> inFormat, outFormat;
+<a name="l00591"></a>00591     std::vector&lt;int&gt; inOffset;
+<a name="l00592"></a>00592     std::vector&lt;int&gt; outOffset;
+<a name="l00593"></a>00593   };
+<a name="l00594"></a>00594 
+<a name="l00595"></a>00595   <span class="comment">// A protected structure for audio streams.</span>
+<a name="l00596"></a>00596   <span class="keyword">struct </span>RtApiStream {
+<a name="l00597"></a>00597     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device[2];    <span class="comment">// Playback and record, respectively.</span>
+<a name="l00598"></a>00598     <span class="keywordtype">void</span> *apiHandle;           <span class="comment">// void pointer for API specific stream handle information</span>
+<a name="l00599"></a>00599     StreamMode mode;           <span class="comment">// OUTPUT, INPUT, or DUPLEX.</span>
+<a name="l00600"></a>00600     StreamState state;         <span class="comment">// STOPPED, RUNNING, or CLOSED</span>
+<a name="l00601"></a>00601     <span class="keywordtype">char</span> *userBuffer[2];       <span class="comment">// Playback and record, respectively.</span>
+<a name="l00602"></a>00602     <span class="keywordtype">char</span> *deviceBuffer;
+<a name="l00603"></a>00603     <span class="keywordtype">bool</span> doConvertBuffer[2];   <span class="comment">// Playback and record, respectively.</span>
+<a name="l00604"></a>00604     <span class="keywordtype">bool</span> userInterleaved;
+<a name="l00605"></a>00605     <span class="keywordtype">bool</span> deviceInterleaved[2]; <span class="comment">// Playback and record, respectively.</span>
+<a name="l00606"></a>00606     <span class="keywordtype">bool</span> doByteSwap[2];        <span class="comment">// Playback and record, respectively.</span>
+<a name="l00607"></a>00607     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate;
+<a name="l00608"></a>00608     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferSize;
+<a name="l00609"></a>00609     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBuffers;
+<a name="l00610"></a>00610     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nUserChannels[2];    <span class="comment">// Playback and record, respectively.</span>
+<a name="l00611"></a>00611     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nDeviceChannels[2];  <span class="comment">// Playback and record channels, respectively.</span>
+<a name="l00612"></a>00612     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channelOffset[2];    <span class="comment">// Playback and record, respectively.</span>
+<a name="l00613"></a>00613     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> latency[2];         <span class="comment">// Playback and record, respectively.</span>
+<a name="l00614"></a>00614     <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> userFormat;
+<a name="l00615"></a>00615     <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> deviceFormat[2];    <span class="comment">// Playback and record, respectively.</span>
+<a name="l00616"></a>00616     StreamMutex mutex;
+<a name="l00617"></a>00617     CallbackInfo callbackInfo;
+<a name="l00618"></a>00618     ConvertInfo convertInfo[2];
+<a name="l00619"></a>00619     <span class="keywordtype">double</span> streamTime;         <span class="comment">// Number of elapsed seconds since the stream started.</span>
+<a name="l00620"></a>00620 
+<a name="l00621"></a>00621 <span class="preprocessor">#if defined(HAVE_GETTIMEOFDAY)</span>
+<a name="l00622"></a>00622 <span class="preprocessor"></span>    <span class="keyword">struct </span>timeval lastTickTimestamp;
+<a name="l00623"></a>00623 <span class="preprocessor">#endif</span>
+<a name="l00624"></a>00624 <span class="preprocessor"></span>
+<a name="l00625"></a>00625     RtApiStream()
+<a name="l00626"></a>00626       :apiHandle(0), deviceBuffer(0) {}
+<a name="l00627"></a>00627   };
+<a name="l00628"></a>00628 
+<a name="l00629"></a>00629   <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">short</span> Int16;
+<a name="l00630"></a>00630   <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> Int32;
+<a name="l00631"></a>00631   <span class="keyword">typedef</span> <span class="keywordtype">float</span> Float32;
+<a name="l00632"></a>00632   <span class="keyword">typedef</span> <span class="keywordtype">double</span> Float64;
+<a name="l00633"></a>00633 
+<a name="l00634"></a>00634   std::ostringstream errorStream_;
+<a name="l00635"></a>00635   std::string errorText_;
+<a name="l00636"></a>00636   <span class="keywordtype">bool</span> showWarnings_;
+<a name="l00637"></a>00637   RtApiStream stream_;
+<a name="l00638"></a>00638 
+<a name="l00646"></a>00646   <span class="keyword">virtual</span> <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00647"></a>00647                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00648"></a>00648                                 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00649"></a>00649                                 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00650"></a>00650 
+<a name="l00652"></a>00652   <span class="keywordtype">void</span> tickStreamTime( <span class="keywordtype">void</span> );
+<a name="l00653"></a>00653 
+<a name="l00655"></a>00655   <span class="keywordtype">void</span> clearStreamInfo();
+<a name="l00656"></a>00656 
+<a name="l00661"></a>00661   <span class="keywordtype">void</span> verifyStream( <span class="keywordtype">void</span> );
+<a name="l00662"></a>00662 
+<a name="l00664"></a>00664   <span class="keywordtype">void</span> error( ErrorType type );
+<a name="l00665"></a>00665 
+<a name="l00670"></a>00670   <span class="keywordtype">void</span> convertBuffer( <span class="keywordtype">char</span> *outBuffer, <span class="keywordtype">char</span> *inBuffer, ConvertInfo &amp;info );
+<a name="l00671"></a>00671 
+<a name="l00673"></a>00673   <span class="keywordtype">void</span> byteSwapBuffer( <span class="keywordtype">char</span> *buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> samples, <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format );
+<a name="l00674"></a>00674 
+<a name="l00676"></a>00676   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> formatBytes( <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format );
+<a name="l00677"></a>00677 
+<a name="l00679"></a>00679   <span class="keywordtype">void</span> setConvertInfo( StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel );
+<a name="l00680"></a>00680 };
+<a name="l00681"></a>00681 
+<a name="l00682"></a>00682 <span class="comment">// **************************************************************** //</span>
+<a name="l00683"></a>00683 <span class="comment">//</span>
+<a name="l00684"></a>00684 <span class="comment">// Inline RtAudio definitions.</span>
+<a name="l00685"></a>00685 <span class="comment">//</span>
+<a name="l00686"></a>00686 <span class="comment">// **************************************************************** //</span>
+<a name="l00687"></a>00687 
+<a name="l00688"></a><a class="code" href="classRtAudio.html#a2">00688</a> <span class="keyword">inline</span> <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> <a class="code" href="classRtAudio.html#a2">RtAudio :: getCurrentApi</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;getCurrentApi(); };
+<a name="l00689"></a><a class="code" href="classRtAudio.html#a3">00689</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a3">RtAudio :: getDeviceCount</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;getDeviceCount(); };
+<a name="l00690"></a><a class="code" href="classRtAudio.html#a4">00690</a> <span class="keyword">inline</span> <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> <a class="code" href="classRtAudio.html#a4">RtAudio :: getDeviceInfo</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device ) { <span class="keywordflow">return</span> rtapi_-&gt;getDeviceInfo( device ); };
+<a name="l00691"></a><a class="code" href="classRtAudio.html#a6">00691</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a6">RtAudio :: getDefaultInputDevice</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;getDefaultInputDevice(); };
+<a name="l00692"></a><a class="code" href="classRtAudio.html#a5">00692</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a5">RtAudio :: getDefaultOutputDevice</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;getDefaultOutputDevice(); };
+<a name="l00693"></a><a class="code" href="classRtAudio.html#a8">00693</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a8">RtAudio :: closeStream</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;closeStream(); };
+<a name="l00694"></a><a class="code" href="classRtAudio.html#a9">00694</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a9">RtAudio :: startStream</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> rtapi_-&gt;startStream(); };
+<a name="l00695"></a><a class="code" href="classRtAudio.html#a10">00695</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a10">RtAudio :: stopStream</a>( <span class="keywordtype">void</span> )  { <span class="keywordflow">return</span> rtapi_-&gt;stopStream(); };
+<a name="l00696"></a><a class="code" href="classRtAudio.html#a11">00696</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a11">RtAudio :: abortStream</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> rtapi_-&gt;abortStream(); };
+<a name="l00697"></a><a class="code" href="classRtAudio.html#a12">00697</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classRtAudio.html#a12">RtAudio :: isStreamOpen</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;isStreamOpen(); };
+<a name="l00698"></a><a class="code" href="classRtAudio.html#a13">00698</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classRtAudio.html#a13">RtAudio :: isStreamRunning</a>( <span class="keywordtype">void</span> ) throw() { <span class="keywordflow">return</span> rtapi_-&gt;isStreamRunning(); };
+<a name="l00699"></a><a class="code" href="classRtAudio.html#a15">00699</a> <span class="keyword">inline</span> <span class="keywordtype">long</span> <a class="code" href="classRtAudio.html#a15">RtAudio :: getStreamLatency</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> rtapi_-&gt;getStreamLatency(); };
+<a name="l00700"></a><a class="code" href="classRtAudio.html#a14">00700</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="classRtAudio.html#a14">RtAudio :: getStreamTime</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> rtapi_-&gt;getStreamTime(); };
+<a name="l00701"></a><a class="code" href="classRtAudio.html#a16">00701</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a16">RtAudio :: showWarnings</a>( <span class="keywordtype">bool</span> value ) <span class="keywordflow">throw</span>() { rtapi_-&gt;showWarnings( value ); };
+<a name="l00702"></a>00702 
+<a name="l00703"></a>00703 <span class="comment">// RtApi Subclass prototypes.</span>
+<a name="l00704"></a>00704 
+<a name="l00705"></a>00705 <span class="preprocessor">#if defined(__MACOSX_CORE__)</span>
+<a name="l00706"></a>00706 <span class="preprocessor"></span>
+<a name="l00707"></a>00707 <span class="preprocessor">#include &lt;CoreAudio/AudioHardware.h&gt;</span>
+<a name="l00708"></a>00708 
+<a name="l00709"></a>00709 <span class="keyword">class </span>RtApiCore: <span class="keyword">public</span> RtApi
+<a name="l00710"></a>00710 {
+<a name="l00711"></a>00711 <span class="keyword">public</span>:
+<a name="l00712"></a>00712 
+<a name="l00713"></a>00713   RtApiCore();
+<a name="l00714"></a>00714   ~RtApiCore();
+<a name="l00715"></a>00715   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w4">RtAudio::MACOSX_CORE</a>; };
+<a name="l00716"></a>00716   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00717"></a>00717   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00718"></a>00718   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDefaultOutputDevice( <span class="keywordtype">void</span> );
+<a name="l00719"></a>00719   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDefaultInputDevice( <span class="keywordtype">void</span> );
+<a name="l00720"></a>00720   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00721"></a>00721   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00722"></a>00722   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00723"></a>00723   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00724"></a>00724   <span class="keywordtype">long</span> getStreamLatency( <span class="keywordtype">void</span> );
+<a name="l00725"></a>00725 
+<a name="l00726"></a>00726   <span class="comment">// This function is intended for internal use only.  It must be</span>
+<a name="l00727"></a>00727   <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00728"></a>00728   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
+<a name="l00729"></a>00729   <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00730"></a>00730   <span class="keywordtype">bool</span> callbackEvent( AudioDeviceID deviceId,
+<a name="l00731"></a>00731                       <span class="keyword">const</span> AudioBufferList *inBufferList,
+<a name="l00732"></a>00732                       <span class="keyword">const</span> AudioBufferList *outBufferList );
+<a name="l00733"></a>00733 
+<a name="l00734"></a>00734   <span class="keyword">private</span>:
+<a name="l00735"></a>00735 
+<a name="l00736"></a>00736   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00737"></a>00737                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00738"></a>00738                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00739"></a>00739                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00740"></a>00740   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* getErrorCode( OSStatus code );
+<a name="l00741"></a>00741 };
+<a name="l00742"></a>00742 
+<a name="l00743"></a>00743 <span class="preprocessor">#endif</span>
+<a name="l00744"></a>00744 <span class="preprocessor"></span>
+<a name="l00745"></a>00745 <span class="preprocessor">#if defined(__UNIX_JACK__)</span>
+<a name="l00746"></a>00746 <span class="preprocessor"></span>
+<a name="l00747"></a>00747 <span class="keyword">class </span>RtApiJack: <span class="keyword">public</span> RtApi
+<a name="l00748"></a>00748 {
+<a name="l00749"></a>00749 <span class="keyword">public</span>:
+<a name="l00750"></a>00750 
+<a name="l00751"></a>00751   RtApiJack();
+<a name="l00752"></a>00752   ~RtApiJack();
+<a name="l00753"></a>00753   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w3">RtAudio::UNIX_JACK</a>; };
+<a name="l00754"></a>00754   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00755"></a>00755   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00756"></a>00756   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00757"></a>00757   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00758"></a>00758   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00759"></a>00759   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00760"></a>00760   <span class="keywordtype">long</span> getStreamLatency( <span class="keywordtype">void</span> );
+<a name="l00761"></a>00761 
+<a name="l00762"></a>00762   <span class="comment">// This function is intended for internal use only.  It must be</span>
+<a name="l00763"></a>00763   <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00764"></a>00764   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
+<a name="l00765"></a>00765   <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00766"></a>00766   <span class="keywordtype">bool</span> callbackEvent( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nframes );
 <a name="l00767"></a>00767 
-<a name="l00768"></a>00768   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00769"></a>00769   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00770"></a>00770   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00771"></a>00771                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00772"></a>00772                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00773"></a>00773 
-<a name="l00774"></a>00774   <span class="keywordtype">bool</span> coInitialized;
+<a name="l00768"></a>00768   <span class="keyword">private</span>:
+<a name="l00769"></a>00769 
+<a name="l00770"></a>00770   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00771"></a>00771                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00772"></a>00772                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00773"></a>00773                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00774"></a>00774 };
 <a name="l00775"></a>00775 
-<a name="l00776"></a>00776 };
-<a name="l00777"></a>00777 
-<a name="l00778"></a>00778 <span class="preprocessor">#endif</span>
+<a name="l00776"></a>00776 <span class="preprocessor">#endif</span>
+<a name="l00777"></a>00777 <span class="preprocessor"></span>
+<a name="l00778"></a>00778 <span class="preprocessor">#if defined(__WINDOWS_ASIO__)</span>
 <a name="l00779"></a>00779 <span class="preprocessor"></span>
-<a name="l00780"></a>00780 <span class="preprocessor">#if defined(__IRIX_AL__)</span>
-<a name="l00781"></a>00781 <span class="preprocessor"></span>
-<a name="l00782"></a>00782 <span class="keyword">class </span>RtApiAl: <span class="keyword">public</span> RtApi
-<a name="l00783"></a>00783 {
-<a name="l00784"></a>00784 <span class="keyword">public</span>:
-<a name="l00785"></a>00785 
-<a name="l00786"></a>00786   RtApiAl();
-<a name="l00787"></a>00787   ~RtApiAl();
-<a name="l00788"></a>00788   <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
-<a name="l00789"></a>00789   <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
-<a name="l00790"></a>00790   <span class="keywordtype">void</span> tickStream();
-<a name="l00791"></a>00791   <span class="keywordtype">void</span> closeStream();
-<a name="l00792"></a>00792   <span class="keywordtype">void</span> startStream();
-<a name="l00793"></a>00793   <span class="keywordtype">void</span> stopStream();
-<a name="l00794"></a>00794   <span class="keywordtype">void</span> abortStream();
-<a name="l00795"></a>00795   <span class="keywordtype">int</span> streamWillBlock();
-<a name="l00796"></a>00796   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
-<a name="l00797"></a>00797   <span class="keywordtype">void</span> cancelStreamCallback();
-<a name="l00798"></a>00798 
-<a name="l00799"></a>00799   <span class="keyword">private</span>:
+<a name="l00780"></a>00780 <span class="keyword">class </span>RtApiAsio: <span class="keyword">public</span> RtApi
+<a name="l00781"></a>00781 {
+<a name="l00782"></a>00782 <span class="keyword">public</span>:
+<a name="l00783"></a>00783 
+<a name="l00784"></a>00784   RtApiAsio();
+<a name="l00785"></a>00785   ~RtApiAsio();
+<a name="l00786"></a>00786   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w5">RtAudio::WINDOWS_ASIO</a>; };
+<a name="l00787"></a>00787   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00788"></a>00788   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00789"></a>00789   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00790"></a>00790   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00791"></a>00791   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00792"></a>00792   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00793"></a>00793   <span class="keywordtype">long</span> getStreamLatency( <span class="keywordtype">void</span> );
+<a name="l00794"></a>00794 
+<a name="l00795"></a>00795   <span class="comment">// This function is intended for internal use only.  It must be</span>
+<a name="l00796"></a>00796   <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00797"></a>00797   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
+<a name="l00798"></a>00798   <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00799"></a>00799   <span class="keywordtype">bool</span> callbackEvent( <span class="keywordtype">long</span> bufferIndex );
 <a name="l00800"></a>00800 
-<a name="l00801"></a>00801   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
-<a name="l00802"></a>00802   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
-<a name="l00803"></a>00803   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
-<a name="l00804"></a>00804                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
-<a name="l00805"></a>00805                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
-<a name="l00806"></a>00806 };
-<a name="l00807"></a>00807 
-<a name="l00808"></a>00808 <span class="preprocessor">#endif</span>
-<a name="l00809"></a>00809 <span class="preprocessor"></span>
-<a name="l00810"></a>00810 <span class="comment">// Define the following flag to have extra information spewed to stderr.</span>
-<a name="l00811"></a>00811 <span class="comment">//#define __RTAUDIO_DEBUG__</span>
-<a name="l00812"></a>00812 
-<a name="l00813"></a>00813 <span class="preprocessor">#endif</span>
+<a name="l00801"></a>00801   <span class="keyword">private</span>:
+<a name="l00802"></a>00802 
+<a name="l00803"></a>00803   <span class="keywordtype">bool</span> coInitialized_;
+<a name="l00804"></a>00804   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00805"></a>00805                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00806"></a>00806                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00807"></a>00807                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00808"></a>00808 };
+<a name="l00809"></a>00809 
+<a name="l00810"></a>00810 <span class="preprocessor">#endif</span>
+<a name="l00811"></a>00811 <span class="preprocessor"></span>
+<a name="l00812"></a>00812 <span class="preprocessor">#if defined(__WINDOWS_DS__)</span>
+<a name="l00813"></a>00813 <span class="preprocessor"></span>
+<a name="l00814"></a>00814 <span class="keyword">class </span>RtApiDs: <span class="keyword">public</span> RtApi
+<a name="l00815"></a>00815 {
+<a name="l00816"></a>00816 <span class="keyword">public</span>:
+<a name="l00817"></a>00817 
+<a name="l00818"></a>00818   RtApiDs();
+<a name="l00819"></a>00819   ~RtApiDs();
+<a name="l00820"></a>00820   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w6">RtAudio::WINDOWS_DS</a>; };
+<a name="l00821"></a>00821   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00822"></a>00822   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDefaultOutputDevice( <span class="keywordtype">void</span> );
+<a name="l00823"></a>00823   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDefaultInputDevice( <span class="keywordtype">void</span> );
+<a name="l00824"></a>00824   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00825"></a>00825   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00826"></a>00826   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00827"></a>00827   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00828"></a>00828   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00829"></a>00829   <span class="keywordtype">long</span> getStreamLatency( <span class="keywordtype">void</span> );
+<a name="l00830"></a>00830 
+<a name="l00831"></a>00831   <span class="comment">// This function is intended for internal use only.  It must be</span>
+<a name="l00832"></a>00832   <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00833"></a>00833   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
+<a name="l00834"></a>00834   <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00835"></a>00835   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">void</span> );
+<a name="l00836"></a>00836 
+<a name="l00837"></a>00837   <span class="keyword">private</span>:
+<a name="l00838"></a>00838 
+<a name="l00839"></a>00839   <span class="keywordtype">bool</span> coInitialized_;
+<a name="l00840"></a>00840   <span class="keywordtype">bool</span> buffersRolling;
+<a name="l00841"></a>00841   <span class="keywordtype">long</span> duplexPrerollBytes;
+<a name="l00842"></a>00842   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00843"></a>00843                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00844"></a>00844                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00845"></a>00845                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00846"></a>00846 };
+<a name="l00847"></a>00847 
+<a name="l00848"></a>00848 <span class="preprocessor">#endif</span>
+<a name="l00849"></a>00849 <span class="preprocessor"></span>
+<a name="l00850"></a>00850 <span class="preprocessor">#if defined(__LINUX_ALSA__)</span>
+<a name="l00851"></a>00851 <span class="preprocessor"></span>
+<a name="l00852"></a>00852 <span class="keyword">class </span>RtApiAlsa: <span class="keyword">public</span> RtApi
+<a name="l00853"></a>00853 {
+<a name="l00854"></a>00854 <span class="keyword">public</span>:
+<a name="l00855"></a>00855 
+<a name="l00856"></a>00856   RtApiAlsa();
+<a name="l00857"></a>00857   ~RtApiAlsa();
+<a name="l00858"></a>00858   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi() { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w1">RtAudio::LINUX_ALSA</a>; };
+<a name="l00859"></a>00859   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00860"></a>00860   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00861"></a>00861   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00862"></a>00862   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00863"></a>00863   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00864"></a>00864   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00865"></a>00865 
+<a name="l00866"></a>00866   <span class="comment">// This function is intended for internal use only.  It must be</span>
+<a name="l00867"></a>00867   <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00868"></a>00868   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
+<a name="l00869"></a>00869   <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00870"></a>00870   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">void</span> );
+<a name="l00871"></a>00871 
+<a name="l00872"></a>00872   <span class="keyword">private</span>:
+<a name="l00873"></a>00873 
+<a name="l00874"></a>00874   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00875"></a>00875                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00876"></a>00876                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00877"></a>00877                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00878"></a>00878 };
+<a name="l00879"></a>00879 
+<a name="l00880"></a>00880 <span class="preprocessor">#endif</span>
+<a name="l00881"></a>00881 <span class="preprocessor"></span>
+<a name="l00882"></a>00882 <span class="preprocessor">#if defined(__LINUX_OSS__)</span>
+<a name="l00883"></a>00883 <span class="preprocessor"></span>
+<a name="l00884"></a>00884 <span class="keyword">class </span>RtApiOss: <span class="keyword">public</span> RtApi
+<a name="l00885"></a>00885 {
+<a name="l00886"></a>00886 <span class="keyword">public</span>:
+<a name="l00887"></a>00887 
+<a name="l00888"></a>00888   RtApiOss();
+<a name="l00889"></a>00889   ~RtApiOss();
+<a name="l00890"></a>00890   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi() { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w2">RtAudio::LINUX_OSS</a>; };
+<a name="l00891"></a>00891   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00892"></a>00892   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device );
+<a name="l00893"></a>00893   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00894"></a>00894   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00895"></a>00895   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00896"></a>00896   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00897"></a>00897 
+<a name="l00898"></a>00898   <span class="comment">// This function is intended for internal use only.  It must be</span>
+<a name="l00899"></a>00899   <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00900"></a>00900   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
+<a name="l00901"></a>00901   <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00902"></a>00902   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">void</span> );
+<a name="l00903"></a>00903 
+<a name="l00904"></a>00904   <span class="keyword">private</span>:
+<a name="l00905"></a>00905 
+<a name="l00906"></a>00906   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00907"></a>00907                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00908"></a>00908                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00909"></a>00909                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00910"></a>00910 };
+<a name="l00911"></a>00911 
+<a name="l00912"></a>00912 <span class="preprocessor">#endif</span>
+<a name="l00913"></a>00913 <span class="preprocessor"></span>
+<a name="l00914"></a>00914 <span class="preprocessor">#if defined(__RTAUDIO_DUMMY__)</span>
+<a name="l00915"></a>00915 <span class="preprocessor"></span>
+<a name="l00916"></a>00916 <span class="keyword">class </span>RtApiDummy: <span class="keyword">public</span> RtApi
+<a name="l00917"></a>00917 {
+<a name="l00918"></a>00918 <span class="keyword">public</span>:
+<a name="l00919"></a>00919 
+<a name="l00920"></a>00920   RtApiDummy() { errorText_ = <span class="stringliteral">"RtApiDummy: This class provides no functionality."</span>; error( WARNING ); };
+<a name="l00921"></a>00921   <a class="code" href="classRtAudio.html#w8">RtAudio::Api</a> getCurrentApi( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> <a class="code" href="classRtAudio.html#w8w7">RtAudio::RTAUDIO_DUMMY</a>; };
+<a name="l00922"></a>00922   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> 0; };
+<a name="l00923"></a>00923   <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> getDeviceInfo( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device ) { <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> info; <span class="keywordflow">return</span> info; };
+<a name="l00924"></a>00924   <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> ) {};
+<a name="l00925"></a>00925   <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> ) {};
+<a name="l00926"></a>00926   <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> ) {};
+<a name="l00927"></a>00927   <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> ) {};
+<a name="l00928"></a>00928 
+<a name="l00929"></a>00929   <span class="keyword">private</span>:
+<a name="l00930"></a>00930 
+<a name="l00931"></a>00931   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels, 
+<a name="l00932"></a>00932                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00933"></a>00933                         <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00934"></a>00934                         <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; };
+<a name="l00935"></a>00935 };
+<a name="l00936"></a>00936 
+<a name="l00937"></a>00937 <span class="preprocessor">#endif</span>
+<a name="l00938"></a>00938 <span class="preprocessor"></span>
+<a name="l00939"></a>00939 <span class="preprocessor">#endif</span>
+<a name="l00940"></a>00940 <span class="preprocessor"></span>
+<a name="l00941"></a>00941 <span class="comment">// Indentation settings for Vim and Emacs</span>
+<a name="l00942"></a>00942 <span class="comment">//</span>
+<a name="l00943"></a>00943 <span class="comment">// Local Variables:</span>
+<a name="l00944"></a>00944 <span class="comment">// c-basic-offset: 2</span>
+<a name="l00945"></a>00945 <span class="comment">// indent-tabs-mode: nil</span>
+<a name="l00946"></a>00946 <span class="comment">// End:</span>
+<a name="l00947"></a>00947 <span class="comment">//</span>
+<a name="l00948"></a>00948 <span class="comment">// vim: et sts=2 sw=2</span>
 </pre></div><HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
diff --git a/doc/html/RtAudio_8h.html b/doc/html/RtAudio_8h.html
new file mode 100644 (file)
index 0000000..8e35aee
--- /dev/null
@@ -0,0 +1,179 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudio.h File Reference</h1><code>#include &lt;string&gt;</code><br>
+<code>#include &lt;vector&gt;</code><br>
+<code>#include &quot;RtError.h&quot;</code><br>
+<code>#include &lt;sstream&gt;</code><br>
+
+<p>
+<a href="RtAudio_8h-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html">RtAudio</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Realtime audio i/o C++ classes.  <a href="classRtAudio.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The public device information structure for returning queried values.  <a href="structRtAudio_1_1DeviceInfo.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The structure for specifying input or ouput stream parameters.  <a href="structRtAudio_1_1StreamParameters.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The structure for specifying stream options.  <a href="structRtAudio_1_1StreamOptions.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef unsigned long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classRtAudio.html">RtAudio</a> data format type.  <a href="#a1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classRtAudio.html">RtAudio</a> stream option flags.  <a href="#a8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classRtAudio.html">RtAudio</a> stream status (over- or underflow) flags.  <a href="#a12"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef int(*&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="RtAudio_8h.html#a15">RtAudioCallback</a> )(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, <a class="el" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> status, void *userData)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classRtAudio.html">RtAudio</a> callback function prototype.  <a href="#a15"></a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<hr><h2>Typedef Documentation</h2>
+<a class="anchor" name="a1"></a><!-- doxytag: member="RtAudio.h::RtAudioFormat" ref="a1" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">typedef unsigned long <a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+<a class="el" href="classRtAudio.html">RtAudio</a> data format type. 
+<p>
+Support for signed integers and floats. Audio data fed to/from an <a class="el" href="classRtAudio.html">RtAudio</a> stream is assumed to ALWAYS be in host byte order. The internal routines will automatically take care of any necessary byte-swapping between the host format and the soundcard. Thus, endian-ness is not a concern in the following format definitions.<p>
+<ul>
+<li><em>RTAUDIO_SINT8:</em> 8-bit signed integer.</li><li><em>RTAUDIO_SINT16:</em> 16-bit signed integer.</li><li><em>RTAUDIO_SINT24:</em> Upper 3 bytes of 32-bit signed integer.</li><li><em>RTAUDIO_SINT32:</em> 32-bit signed integer.</li><li><em>RTAUDIO_FLOAT32:</em> Normalized between plus/minus 1.0.</li><li><em>RTAUDIO_FLOAT64:</em> Normalized between plus/minus 1.0.</li></ul>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="a8"></a><!-- doxytag: member="RtAudio.h::RtAudioStreamFlags" ref="a8" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">typedef unsigned long <a class="el" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+<a class="el" href="classRtAudio.html">RtAudio</a> stream option flags. 
+<p>
+The following flags can be OR'ed together to allow a client to make changes to the default stream behavior:<p>
+<ul>
+<li><em>RTAUDIO_NONINTERLEAVED:</em> Use non-interleaved buffers (default = interleaved).</li><li><em>RTAUDIO_MINIMIZE_LATENCY:</em> Attempt to set stream parameters for lowest possible latency.</li><li><em>RTAUDIO_HOG_DEVICE:</em> Attempt grab device for exclusive use.</li></ul>
+<p>
+By default, <a class="el" href="classRtAudio.html">RtAudio</a> streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with <code>nFrames</code> samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index <code>nFrames</code> (assuming the <code>buffer</code> pointer was recast to the correct data type for the stream).<p>
+Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, <a class="el" href="classRtAudio.html">RtAudio</a> will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance.<p>
+If the RTAUDIO_HOG_DEVICE flag is set, <a class="el" href="classRtAudio.html">RtAudio</a> will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs.    </td>
+  </tr>
+</table>
+<a class="anchor" name="a12"></a><!-- doxytag: member="RtAudio.h::RtAudioStreamStatus" ref="a12" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">typedef unsigned long <a class="el" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+<a class="el" href="classRtAudio.html">RtAudio</a> stream status (over- or underflow) flags. 
+<p>
+Notification of a stream over- or underflow is indicated by a non-zero stream <code>status</code> argument in the RtAudioCallback function. The stream status can be one of the following two options, depending on whether the stream is open for output and/or input:<p>
+<ul>
+<li><em>RTAUDIO_INPUT_OVERFLOW:</em> Input data was discarded because of an overflow condition at the driver.</li><li><em>RTAUDIO_OUTPUT_UNDERFLOW:</em> The output buffer ran low, likely producing a break in the output sound.</li></ul>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="a15"></a><!-- doxytag: member="RtAudio.h::RtAudioCallback" ref="a15" args=")(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">typedef int(* <a class="el" href="RtAudio_8h.html#a15">RtAudioCallback</a>)(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, <a class="el" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> status, void *userData)          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+<a class="el" href="classRtAudio.html">RtAudio</a> callback function prototype. 
+<p>
+All <a class="el" href="classRtAudio.html">RtAudio</a> clients must create a function of type RtAudioCallback to read and/or write data from/to the audio stream. When the underlying audio system is ready for new input or output data, this function will be invoked.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>outputBuffer</em>&nbsp;</td><td>For output (or duplex) streams, the client should write <code>nFrames</code> of audio sample frames into this buffer. This argument should be recast to the datatype specified when the stream was opened. For input-only streams, this argument will be NULL.</td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>inputBuffer</em>&nbsp;</td><td>For input (or duplex) streams, this buffer will hold <code>nFrames</code> of input audio sample frames. This argument should be recast to the datatype specified when the stream was opened. For output-only streams, this argument will be NULL.</td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>nFrames</em>&nbsp;</td><td>The number of sample frames of input or output data in the buffers. The actual buffer size in bytes is dependent on the data type and number of channels in use.</td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>streamTime</em>&nbsp;</td><td>The number of seconds that have elapsed since the stream was started.</td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>status</em>&nbsp;</td><td>If non-zero, this argument indicates a data overflow or underflow condition for the stream. The particular condition can be determined by comparison with the RtAudioStreamStatus flags.</td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>userData</em>&nbsp;</td><td>A pointer to optional data provided by the client when opening the stream (default = NULL).</td></tr>
+  </table>
+</dl>
+To continue normal stream operation, the RtAudioCallback function should return a value of zero. To stop the stream and drain the output buffer, the function should return a value of one. To abort the stream immediately, the client should return a value of two.    </td>
+  </tr>
+</table>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
index 3211c9aa4c2b86729e7370261b776f91613d2a4b..7d28615a493780e68a6a0632733cb63bf45272a3 100644 (file)
@@ -1,11 +1,12 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtError.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/************************************************************************/</span>
 <a name="l00012"></a>00012 <span class="preprocessor">#ifndef RTERROR_H</span>
 <a name="l00013"></a>00013 <span class="preprocessor"></span><span class="preprocessor">#define RTERROR_H</span>
 <a name="l00014"></a>00014 <span class="preprocessor"></span>
-<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;iostream&gt;</span>
-<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;string&gt;</span>
-<a name="l00017"></a>00017 
-<a name="l00018"></a><a class="code" href="classRtError.html">00018</a> <span class="keyword">class </span><a class="code" href="classRtError.html">RtError</a>
-<a name="l00019"></a>00019 {
-<a name="l00020"></a>00020 <span class="keyword">public</span>:
-<a name="l00022"></a><a class="code" href="classRtError.html#w11">00022</a>   <span class="keyword">enum</span> <a class="code" href="classRtError.html#w11">Type</a> {
-<a name="l00023"></a>00023     <a class="code" href="classRtError.html#w11w0">WARNING</a>,           
-<a name="l00024"></a>00024     <a class="code" href="classRtError.html#w11w1">DEBUG_WARNING</a>,     
-<a name="l00025"></a>00025     <a class="code" href="classRtError.html#w11w2">UNSPECIFIED</a>,       
-<a name="l00026"></a>00026     <a class="code" href="classRtError.html#w11w3">NO_DEVICES_FOUND</a>,  
-<a name="l00027"></a>00027     <a class="code" href="classRtError.html#w11w4">INVALID_DEVICE</a>,    
-<a name="l00028"></a>00028     <a class="code" href="classRtError.html#w11w5">INVALID_STREAM</a>,    
-<a name="l00029"></a>00029     <a class="code" href="classRtError.html#w11w6">MEMORY_ERROR</a>,      
-<a name="l00030"></a>00030     <a class="code" href="classRtError.html#w11w7">INVALID_PARAMETER</a>, 
-<a name="l00031"></a>00031     <a class="code" href="classRtError.html#w11w8">DRIVER_ERROR</a>,      
-<a name="l00032"></a>00032     <a class="code" href="classRtError.html#w11w9">SYSTEM_ERROR</a>,      
-<a name="l00033"></a><a class="code" href="classRtError.html#w11w10">00033</a>     <a class="code" href="classRtError.html#w11w10">THREAD_ERROR</a>       
-<a name="l00034"></a>00034   };
-<a name="l00035"></a>00035 
-<a name="l00036"></a>00036 <span class="keyword">protected</span>:
-<a name="l00037"></a>00037   std::string message_;
-<a name="l00038"></a>00038   <a class="code" href="classRtError.html#w11">Type</a> type_;
-<a name="l00039"></a>00039 
-<a name="l00040"></a>00040 <span class="keyword">public</span>:
-<a name="l00042"></a><a class="code" href="classRtError.html#a0">00042</a>   <a class="code" href="classRtError.html#a0">RtError</a>(<span class="keyword">const</span> std::string&amp; message, <a class="code" href="classRtError.html#w11">Type</a> type = <a class="code" href="classRtError.html#w11w2">RtError::UNSPECIFIED</a>) : message_(message), type_(type) {}
+<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;exception&gt;</span>
+<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;iostream&gt;</span>
+<a name="l00017"></a>00017 <span class="preprocessor">#include &lt;string&gt;</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a><a class="code" href="classRtError.html">00019</a> <span class="keyword">class </span><a class="code" href="classRtError.html">RtError</a> : <span class="keyword">public</span> std::exception
+<a name="l00020"></a>00020 {
+<a name="l00021"></a>00021  <span class="keyword">public</span>:
+<a name="l00023"></a><a class="code" href="classRtError.html#w9">00023</a>   <span class="keyword">enum</span> <a class="code" href="classRtError.html#w9">Type</a> {
+<a name="l00024"></a>00024     <a class="code" href="classRtError.html#w9w0">UNSPECIFIED</a>,       
+<a name="l00025"></a>00025     <a class="code" href="classRtError.html#w9w1">NO_DEVICES_FOUND</a>,  
+<a name="l00026"></a>00026     <a class="code" href="classRtError.html#w9w2">INVALID_DEVICE</a>,    
+<a name="l00027"></a>00027     <a class="code" href="classRtError.html#w9w3">MEMORY_ERROR</a>,      
+<a name="l00028"></a>00028     <a class="code" href="classRtError.html#w9w4">INVALID_PARAMETER</a>, 
+<a name="l00029"></a>00029     <a class="code" href="classRtError.html#w9w5">INVALID_USE</a>,       
+<a name="l00030"></a>00030     <a class="code" href="classRtError.html#w9w6">DRIVER_ERROR</a>,      
+<a name="l00031"></a>00031     <a class="code" href="classRtError.html#w9w7">SYSTEM_ERROR</a>,      
+<a name="l00032"></a><a class="code" href="classRtError.html#w9w8">00032</a>     <a class="code" href="classRtError.html#w9w8">THREAD_ERROR</a>       
+<a name="l00033"></a>00033   };
+<a name="l00034"></a>00034 
+<a name="l00036"></a><a class="code" href="classRtError.html#a0">00036</a>   <a class="code" href="classRtError.html#a0">RtError</a>( <span class="keyword">const</span> std::string&amp; message, <a class="code" href="classRtError.html#w9">Type</a> type = <a class="code" href="classRtError.html#w9w0">RtError::UNSPECIFIED</a> ) throw() : message_(message), type_(type) {}
+<a name="l00037"></a>00037  
+<a name="l00039"></a><a class="code" href="classRtError.html#a1">00039</a>   <span class="keyword">virtual</span> <a class="code" href="classRtError.html#a1">~RtError</a>( <span class="keywordtype">void</span> ) throw() {}
+<a name="l00040"></a>00040 
+<a name="l00042"></a><a class="code" href="classRtError.html#a2">00042</a>   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classRtError.html#a2">printMessage</a>( <span class="keywordtype">void</span> ) throw() { std::cerr &lt;&lt; <span class="charliteral">'\n'</span> &lt;&lt; message_ &lt;&lt; <span class="stringliteral">"\n\n"</span>; }
 <a name="l00043"></a>00043 
-<a name="l00045"></a><a class="code" href="classRtError.html#a1">00045</a>   <span class="keyword">virtual</span> <a class="code" href="classRtError.html#a1">~RtError</a>(<span class="keywordtype">void</span>) {};
+<a name="l00045"></a><a class="code" href="classRtError.html#a3">00045</a>   <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classRtError.html#w9">Type</a>&amp; <a class="code" href="classRtError.html#a3">getType</a>(<span class="keywordtype">void</span>) throw() { <span class="keywordflow">return</span> type_; }
 <a name="l00046"></a>00046 
-<a name="l00048"></a><a class="code" href="classRtError.html#a2">00048</a>   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classRtError.html#a2">printMessage</a>(<span class="keywordtype">void</span>) { std::cerr &lt;&lt; <span class="charliteral">'\n'</span> &lt;&lt; message_ &lt;&lt; <span class="stringliteral">"\n\n"</span>; }
+<a name="l00048"></a><a class="code" href="classRtError.html#a4">00048</a>   <span class="keyword">virtual</span> <span class="keyword">const</span> std::string&amp; <a class="code" href="classRtError.html#a4">getMessage</a>(<span class="keywordtype">void</span>) throw() { <span class="keywordflow">return</span> message_; }
 <a name="l00049"></a>00049 
-<a name="l00051"></a><a class="code" href="classRtError.html#a3">00051</a>   <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classRtError.html#w11">Type</a>&amp; <a class="code" href="classRtError.html#a3">getType</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> type_; }
+<a name="l00051"></a><a class="code" href="classRtError.html#a5">00051</a>   <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classRtError.html#a5">what</a>( <span class="keywordtype">void</span> ) const throw() { <span class="keywordflow">return</span> message_.c_str(); }
 <a name="l00052"></a>00052 
-<a name="l00054"></a><a class="code" href="classRtError.html#a4">00054</a>   <span class="keyword">virtual</span> <span class="keyword">const</span> std::string&amp; <a class="code" href="classRtError.html#a4">getMessage</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> message_; }
-<a name="l00055"></a>00055 
-<a name="l00057"></a><a class="code" href="classRtError.html#a5">00057</a>   <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classRtError.html#a5">getMessageString</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> message_.c_str(); }
-<a name="l00058"></a>00058 };
-<a name="l00059"></a>00059 
-<a name="l00060"></a>00060 <span class="preprocessor">#endif</span>
+<a name="l00053"></a>00053  <span class="keyword">protected</span>:
+<a name="l00054"></a>00054   std::string message_;
+<a name="l00055"></a>00055   <a class="code" href="classRtError.html#w9">Type</a> type_;
+<a name="l00056"></a>00056 };
+<a name="l00057"></a>00057 
+<a name="l00058"></a>00058 <span class="preprocessor">#endif</span>
 </pre></div><HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
diff --git a/doc/html/acknowledge.html b/doc/html/acknowledge.html
new file mode 100644 (file)
index 0000000..82ed11e
--- /dev/null
@@ -0,0 +1,31 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="acknowledge">Acknowledgements</a></h1>Many thanks to the following people for providing bug fixes and improvements: <ul>
+<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>
+<li>
+Dominic Mazzoni </li>
+</ul>
+<p>
+The <a class="el" href="classRtAudio.html">RtAudio</a> API incorporates many of the concepts developed in the <a href="http://www.portaudio.com/">PortAudio</a> project by Phil Burk and Ross Bencina. Early development also incorporated ideas from Bill Schottstaedt's <a href="http://www-ccrma.stanford.edu/software/snd/sndlib/">sndlib</a>. The CCRMA <a href="http://www-ccrma.stanford.edu/groups/soundwire/">SoundWire group</a> provided valuable feedback during the API proposal stages.<p>
+The early 2.0 version of <a class="el" href="classRtAudio.html">RtAudio</a> was slowly developed over the course of many months while in residence at the <a href="http://www.iua.upf.es/">Institut Universitari de L'Audiovisual (IUA)</a> in Barcelona, Spain and the <a href="http://www.acoustics.hut.fi/">Laboratory of Acoustics and Audio Signal Processing</a> at the Helsinki University of Technology, Finland. Much subsequent development happened while working at the <a href="http://www-ccrma.stanford.edu/">Center for Computer Research in Music and Acoustics (CCRMA)</a> at <a href="http://www.stanford.edu/">Stanford University</a>. All recent versions of <a class="el" href="classRtAudio.html">RtAudio</a> have been completed while working as an assistant professor of <a href="http://www.music.mcgill.ca/musictech/">Music Technology</a> at <a href="http://www.mcgill.ca/">McGill University</a>. This work was supported in part by the United States Air Force Office of Scientific Research (grant #F49620-99-1-0293). <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
index eaa21a759775676adb887c732d335160b66b0262..5dc72ffbaa32198eb36d2215797e1bc39ff0433b 100644 (file)
@@ -1,23 +1,25 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtAudio Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
   <tr><td class="indexkey"><a class="el" href="classRtAudio.html">RtAudio</a></td><td class="indexvalue">Realtime audio i/o C++ classes </td></tr>
-  <tr><td class="indexkey"><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td class="indexvalue">The public device information structure for returning queried values </td></tr>
+  <tr><td class="indexkey"><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td class="indexvalue">The public device information structure for returning queried values </td></tr>
+  <tr><td class="indexkey"><a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a></td><td class="indexvalue">The structure for specifying stream options </td></tr>
+  <tr><td class="indexkey"><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a></td><td class="indexvalue">The structure for specifying input or ouput stream parameters </td></tr>
   <tr><td class="indexkey"><a class="el" href="classRtError.html">RtError</a></td><td class="indexvalue">Exception handling class for <a class="el" href="classRtAudio.html">RtAudio</a> &amp; RtMidi </td></tr>
 </table>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
diff --git a/doc/html/apinotes.html b/doc/html/apinotes.html
new file mode 100644 (file)
index 0000000..983f063
--- /dev/null
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="apinotes">API Notes</a></h1><a class="el" href="classRtAudio.html">RtAudio</a> is designed to provide a common API across the various supported operating systems and audio libraries. Despite that, some issues should be mentioned with regard to each.<h2><a class="anchor" name="linux">
+Linux:</a></h2>
+<a class="el" href="classRtAudio.html">RtAudio</a> for Linux was developed under Redhat distributions 7.0 - Fedora. Three different audio APIs are supported on Linux platforms: <a href="http://www.opensound.com/oss.html">OSS</a> (versions &gt;= 4.0), <a href="http://www.alsa-project.org/">ALSA</a>, and <a href="http://jackit.sourceforge.net/">Jack</a>. Note that <a class="el" href="classRtAudio.html">RtAudio</a> now only supports the newer version 4.0 OSS API. The ALSA API is now part of the Linux kernel and offers significantly better functionality than the OSS API. <a class="el" href="classRtAudio.html">RtAudio</a> provides support for the 1.0 and higher versions of ALSA. Jack is a low-latency audio server written primarily for the GNU/Linux operating system. It can connect a number of different applications to an audio device, as well as allow them to share audio between themselves. Input/output latency on the order of 15 milliseconds can typically be achieved using any of the Linux APIs by fine-tuning the <a class="el" href="classRtAudio.html">RtAudio</a> buffer parameters (without kernel modifications). Latencies on the order of 5 milliseconds or less can be achieved using a low-latency kernel patch and increasing FIFO scheduling priority. The pthread library, which is used for callback functionality, is a standard component of all Linux distributions.<p>
+The ALSA library includes OSS emulation support. That means that you can run programs compiled for the OSS API even when using the ALSA drivers and library. It should be noted however that OSS emulation under ALSA is not perfect. Specifically, channel number queries seem to consistently produce invalid results. While OSS emulation is successful for the majority of <a class="el" href="classRtAudio.html">RtAudio</a> tests, it is recommended that the native ALSA implementation of <a class="el" href="classRtAudio.html">RtAudio</a> be used on systems which have ALSA drivers installed.<p>
+The ALSA implementation of <a class="el" href="classRtAudio.html">RtAudio</a> makes no use of the ALSA "plug" interface. All necessary data format conversions, channel compensation, de-interleaving, and byte-swapping is handled by internal <a class="el" href="classRtAudio.html">RtAudio</a> routines.<p>
+At the moment, only one <a class="el" href="classRtAudio.html">RtAudio</a> instance can be connected to the Jack server.<h2><a class="anchor" name="macosx">
+Macintosh OS-X (CoreAudio and Jack):</a></h2>
+The Apple CoreAudio API is designed to use a separate callback procedure for each of its audio devices. A single <a class="el" href="classRtAudio.html">RtAudio</a> duplex stream using two different devices is supported, though it cannot be guaranteed to always behave correctly because we cannot synchronize these two callbacks. The <em>numberOfBuffers</em> parameter to the <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> function has no affect in this implementation.<p>
+It is not possible to have multiple instances of <a class="el" href="classRtAudio.html">RtAudio</a> accessing the same CoreAudio device.<p>
+The <a class="el" href="classRtAudio.html">RtAudio</a> Jack support can be compiled on Macintosh OS-X systems, as well as in Linux.<h2><a class="anchor" name="windowsds">
+Windows (DirectSound):</a></h2>
+In order to compile <a class="el" href="classRtAudio.html">RtAudio</a> under Windows for the DirectSound API, you must have the header and source files for DirectSound version 5.0 or higher. As far as I know, there is no DirectSoundCapture support for Windows NT. Audio output latency with DirectSound can be reasonably good, especially since <a class="el" href="classRtAudio.html">RtAudio</a> version 3.0.2. Input audio latency still tends to be bad but better since version 3.0.2. <a class="el" href="classRtAudio.html">RtAudio</a> was originally developed with Visual C++ version 6.0 but has been tested with .NET.<p>
+The DirectSound version of <a class="el" href="classRtAudio.html">RtAudio</a> can be compiled with or without the UNICODE preprocessor definition.<h2><a class="anchor" name="windowsasio">
+Windows (ASIO):</a></h2>
+The Steinberg ASIO audio API allows only a single device driver to be loaded and accessed at a time. ASIO device drivers must be supplied by audio hardware manufacturers, though ASIO emulation is possible on top of systems with DirectSound drivers. The <em>numberOfBuffers</em> parameter to the <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> function has no affect in this implementation.<p>
+A number of ASIO source and header files are required for use with <a class="el" href="classRtAudio.html">RtAudio</a>. Specifically, an <a class="el" href="classRtAudio.html">RtAudio</a> project must include the following files: <code>asio.h,cpp; asiodrivers.h,cpp; asiolist.h,cpp; asiodrvr.h; asiosys.h; ginclude.h; iasiodrv.h; iasiothiscallresolver.h,cpp</code>. The Visual C++ projects found in <code>/tests/Windows/</code> compile both ASIO and DirectSound support.<p>
+The Steinberg provided <code>asiolist</code> class does not compile when the preprocessor definition UNICODE is defined. Note that this could be an issue when using <a class="el" href="classRtAudio.html">RtAudio</a> with Qt, though Qt programs appear to compile without the UNICODE definition (try <code>DEFINES -= UNICODE</code> in your .pro file). <a class="el" href="classRtAudio.html">RtAudio</a> with ASIO support has been tested using the MinGW compiler under Windows XP, as well as in the Visual Studio environment. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/bugs.html b/doc/html/bugs.html
new file mode 100644 (file)
index 0000000..27fecd8
--- /dev/null
@@ -0,0 +1,39 @@
+<html>
+<head>
+<title>RtAudio Bugs</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<center><h1>RtAudio Bug Tracker</h1></center>
+
+"Bugs" are considered to be problems that cause program crashes or unpredictable results.  Incomplete or unavailable features are tracked as <a href="updates.html">updates</a>.
+
+<h2>Reported (Unconfirmed) Bugs:</h2>
+
+<table border=1 cellpadding=10 cellspacing=0>
+<tr bgcolor="#C7CAFF"><td><b>#</b></td><td><b>Version</b></td><td><b>API</b></td><td><b>Description</b></td><td><b>Status</b></td></b></tr>
+
+<tr><td>1</td><td>3.03</td><td>CoreAudio</td><td>Do we need a run-time test for endianness given the new Intel Macs?</td><td>Not yet tested (GS)</td></tr>
+
+</table>
+
+<h2>Confirmed Bugs (Unfixed):</h2>
+
+<table border=1 cellpadding=10 cellspacing=0>
+<tr bgcolor="#C7CAFF"><td><b>#</b></td><td><b>Version</b></td><td><b>API</b></td><td><b>Description</b></td></tr>
+
+</table>
+
+<h2>Fixed Bugs:</h2>
+
+<table border=1 cellpadding=10 cellspacing=0>
+<tr bgcolor="#C7CAFF"><td><b>#</b></td><td><b>Version</b></td><td><b>API</b></td><td><b>Description</b></td></tr>
+<tr><td>1</td><td>4.0</td><td>Windows DS</td><td>Memory allocation bug in device querying</td></tr>
+<tr><td>2</td><td>4.0</td><td>All unices</td><td>Default pthread scheduling priority changed to SCHED_RR when defined</td></tr>
+<tr><td>3</td><td>4.0</td><td>ALSA</td><td>Changed sample rate setting to use <tt>snd_pcm_hw_params_set_rate_near()</tt> function</td></tr>
+<tr><td>4</td><td>4.0</td><td>CoreAudio</td><td>RtAudio checks a device's <i>internal</i> data format and sets it to the highest allowable bit rate.  For some stupid devices, like the Griffin iMic, the default format is 8-bit mono when the requested format and number of channels does not exist.  So, we need to query the device's capabilities using the kAudioStreamPropertyPhysicalFormats selector - i.e. ask a device for all of the channels/format/rate combination that it supports - and then enumerate through them to pick the best one.</td></tr>
+</table>
+
+
+</body>
+</html>
index 3e955061fdf3ed4ceca0b69b681853ef81f64c31..338a7811bd8f7b5c38351ab8efb879d7a68500b3 100644 (file)
@@ -1,44 +1,46 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtAudio Member List</h1>This is the complete list of members for <a class="el" href="classRtAudio.html">RtAudio</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a15">abortStream</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a7">cancelStreamCallback</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a12">closeStream</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a8">getDeviceCount</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a9">getDeviceInfo</a>(int device)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a10">getStreamBuffer</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w5">IRIX_AL</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a11">abortStream</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8">Api</a> enum name</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a8">closeStream</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#e0">getCompiledApi</a>(std::vector&lt; RtAudio::Api &gt; &amp;apis)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a2">getCurrentApi</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a6">getDefaultInputDevice</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a5">getDefaultOutputDevice</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a3">getDeviceCount</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a4">getDeviceInfo</a>(unsigned int device)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a15">getStreamLatency</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a14">getStreamTime</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a12">isStreamOpen</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a13">isStreamRunning</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w1">LINUX_ALSA</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w3">LINUX_JACK</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w2">LINUX_OSS</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w4">MACOSX_CORE</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a4">openStream</a>(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a5">openStream</a>(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a0">RtAudio</a>(RtAudioApi api=UNSPECIFIED)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a1">RtAudio</a>(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers, RtAudioApi api=UNSPECIFIED)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a2">RtAudio</a>(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers, RtAudioApi api=UNSPECIFIED)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8">RtAudioApi</a> enum name</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a6">setStreamCallback</a>(RtAudioCallback callback, void *userData)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a13">startStream</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a14">stopStream</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a11">tickStream</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a7">openStream</a>(RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData=NULL, RtAudio::StreamOptions *options=NULL)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a0">RtAudio</a>(RtAudio::Api api=UNSPECIFIED)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w7">RTAUDIO_DUMMY</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a16">showWarnings</a>(bool value=true)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a9">startStream</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a10">stopStream</a>(void)</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w3">UNIX_JACK</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w0">UNSPECIFIED</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w6">WINDOWS_ASIO</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w7">WINDOWS_DS</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a3">~RtAudio</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w5">WINDOWS_ASIO</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#w8w6">WINDOWS_DS</a> enum value</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtAudio.html#a1">~RtAudio</a>()</td><td><a class="el" href="classRtAudio.html">RtAudio</a></td><td></td></tr>
 </table><HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index 237c17ea18892ac0427bc4c29204948bc4978c4b..4b2b2cd5379f89960be59cec7d7af75df8ab4357 100644 (file)
@@ -1,11 +1,12 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtAudio Class Reference</h1><!-- doxytag: class="RtAudio" -->Realtime audio i/o C++ classes.  
 <a href="classRtAudio-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#w8">RtAudioApi</a> { <br>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#w8">Api</a> { <br>
 &nbsp;&nbsp;<a class="el" href="classRtAudio.html#w8w0">UNSPECIFIED</a>, 
 <a class="el" href="classRtAudio.html#w8w1">LINUX_ALSA</a>, 
 <a class="el" href="classRtAudio.html#w8w2">LINUX_OSS</a>, 
-<a class="el" href="classRtAudio.html#w8w3">LINUX_JACK</a>, 
+<a class="el" href="classRtAudio.html#w8w3">UNIX_JACK</a>, 
 <br>
 &nbsp;&nbsp;<a class="el" href="classRtAudio.html#w8w4">MACOSX_CORE</a>, 
-<a class="el" href="classRtAudio.html#w8w5">IRIX_AL</a>, 
-<a class="el" href="classRtAudio.html#w8w6">WINDOWS_ASIO</a>, 
-<a class="el" href="classRtAudio.html#w8w7">WINDOWS_DS</a>
+<a class="el" href="classRtAudio.html#w8w5">WINDOWS_ASIO</a>, 
+<a class="el" href="classRtAudio.html#w8w6">WINDOWS_DS</a>, 
+<a class="el" href="classRtAudio.html#w8w7">RTAUDIO_DUMMY</a>
 <br>
  }</td></tr>
 
 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Audio API specifier arguments.  <a href="classRtAudio.html#w8">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a0">RtAudio</a> (<a class="el" href="classRtAudio.html#w8">RtAudioApi</a> api=UNSPECIFIED)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a0">RtAudio</a> (<a class="el" href="classRtAudio.html#w8">RtAudio::Api</a> api=UNSPECIFIED)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The default class constructor.  <a href="#a0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a1">RtAudio</a> (int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers, <a class="el" href="classRtAudio.html#w8">RtAudioApi</a> api=UNSPECIFIED)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The class constructor.  <a href="#a0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a1">~RtAudio</a> ()  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A constructor which can be used to open a stream during instantiation.  <a href="#a1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a2">RtAudio</a> (int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers, <a class="el" href="classRtAudio.html#w8">RtAudioApi</a> api=UNSPECIFIED)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The destructor.  <a href="#a1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a2"></a><!-- doxytag: member="RtAudio::getCurrentApi" ref="a2" args="(void)" -->
+<a class="el" href="classRtAudio.html#w8">RtAudio::Api</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a2">getCurrentApi</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">An overloaded constructor which opens a stream and also returns <code>numberOfBuffers</code> parameter via pointer argument.  <a href="#a2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a3">~RtAudio</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the audio API specifier for the current instance of RtAudio. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a3">getDeviceCount</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The destructor.  <a href="#a3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a4">openStream</a> (int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public function that queries for the number of audio devices available.  <a href="#a3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a4">getDeviceInfo</a> (unsigned int device)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public method for opening a stream with the specified parameters.  <a href="#a4"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a5">openStream</a> (int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return an <a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> structure for a specified device number.  <a href="#a4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a5">getDefaultOutputDevice</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public method for opening a stream and also returning <code>numberOfBuffers</code> parameter via pointer argument.  <a href="#a5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a6">setStreamCallback</a> (RtAudioCallback callback, void *userData)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A function that returns the index of the default output device.  <a href="#a5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a6">getDefaultInputDevice</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public method which sets a user-defined callback function for a given stream.  <a href="#a6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a7">cancelStreamCallback</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A function that returns the index of the default input device.  <a href="#a6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a7">openStream</a> (<a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> *outputParameters, <a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> *inputParameters, <a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, unsigned int sampleRate, unsigned int *bufferFrames, <a class="el" href="RtAudio_8h.html#a15">RtAudioCallback</a> callback, void *userData=NULL, <a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options=NULL)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public method which cancels a callback process and function for the stream.  <a href="#a7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8"></a><!-- doxytag: member="RtAudio::getDeviceCount" ref="a8" args="(void)" -->
-int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a8">getDeviceCount</a> (void)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public function for opening a stream with the specified parameters.  <a href="#a7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a8">closeStream</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public method which returns the number of audio devices found. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a9">getDeviceInfo</a> (int device)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A function that closes a stream and frees any associated stream memory.  <a href="#a8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a9">startStream</a> (void)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return an <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure for a specified device number.  <a href="#a9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">char *const&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a10">getStreamBuffer</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A function that starts a stream.  <a href="#a9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a10">stopStream</a> (void)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A public method which returns a pointer to the buffer for an open stream.  <a href="#a10"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a11">tickStream</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Stop a stream, allowing any samples remaining in the output queue to be played.  <a href="#a10"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a11">abortStream</a> (void)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Public method used to trigger processing of input/output data for a stream.  <a href="#a11"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a12">closeStream</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Stop a stream, discarding any samples remaining in the input/output queue.  <a href="#a11"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a12"></a><!-- doxytag: member="RtAudio::isStreamOpen" ref="a12" args="(void)" -->
+bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a12">isStreamOpen</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Public method which closes a stream and frees any associated buffers.  <a href="#a12"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a13">startStream</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns true if a stream is open and false if not. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a13"></a><!-- doxytag: member="RtAudio::isStreamRunning" ref="a13" args="(void)" -->
+bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a13">isStreamRunning</a> (void)  throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Public method which starts a stream.  <a href="#a13"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a14">stopStream</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns true if the stream is running and false if it is stopped or not open. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a14">getStreamTime</a> (void)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Stop a stream, allowing any samples remaining in the queue to be played out and/or read in.  <a href="#a14"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a15">abortStream</a> ()</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the number of elapsed seconds since the stream was started.  <a href="#a14"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a15">getStreamLatency</a> (void)</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Stop a stream, discarding any samples remaining in the input/output queue.  <a href="#a15"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the internal stream latency in sample frames.  <a href="#a15"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a16"></a><!-- doxytag: member="RtAudio::showWarnings" ref="a16" args="(bool value=true)" -->
+void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#a16">showWarnings</a> (bool value=true)  throw ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Specify whether warning messages should be printed to stderr. <br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtAudio.html#e0">getCompiledApi</a> (std::vector&lt; <a class="el" href="classRtAudio.html#w8">RtAudio::Api</a> &gt; &amp;apis)  throw ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A static function to determine the available compiled audio APIs.  <a href="#e0"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html">DeviceInfo</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The public device information structure for returning queried values.  <a href="structRtAudio_1_1DeviceInfo.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamOptions.html">StreamOptions</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The structure for specifying stream options.  <a href="structRtAudio_1_1StreamOptions.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamParameters.html">StreamParameters</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The structure for specifying input or ouput stream parameters.  <a href="structRtAudio_1_1StreamParameters.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 Realtime audio i/o C++ classes. 
 <p>
-RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio), and Windows (DirectSound and ASIO) operating systems.<p>
-RtAudio WWW site: <a href="http://music.mcgill.ca/~gary/rtaudio/">http://music.mcgill.ca/~gary/rtaudio/</a><p>
-RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2005 Gary P. Scavone<p>
+RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound and ASIO) operating systems.<p>
+RtAudio WWW site: <a href="http://www.music.mcgill.ca/~gary/rtaudio/">http://www.music.mcgill.ca/~gary/rtaudio/</a><p>
+RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2007 Gary P. Scavone<p>
 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<p>
 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>
-Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version.<p>
+Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.<p>
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 <p>
 <hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="w8"></a><!-- doxytag: member="RtAudio::RtAudioApi" ref="w8" args="" --><p>
+<a class="anchor" name="w8"></a><!-- doxytag: member="RtAudio::Api" ref="w8" args="" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">enum <a class="el" href="classRtAudio.html#w8">RtAudio::RtAudioApi</a>          </td>
+          <td class="md" nowrap valign="top">enum <a class="el" href="classRtAudio.html#w8">RtAudio::Api</a>          </td>
         </tr>
       </table>
     </td>
@@ -123,23 +144,23 @@ Search for a working compiled API. </td></tr>
 The Advanced Linux Sound Architecture API. </td></tr>
 <tr><td valign="top"><em><a class="anchor" name="w8w2"></a><!-- doxytag: member="LINUX_OSS" ref="w8w2" args="" -->LINUX_OSS</em>&nbsp;</td><td>
 The Linux Open Sound System API. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w8w3"></a><!-- doxytag: member="LINUX_JACK" ref="w8w3" args="" -->LINUX_JACK</em>&nbsp;</td><td>
-The Linux Jack Low-Latency Audio Server API. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="w8w3"></a><!-- doxytag: member="UNIX_JACK" ref="w8w3" args="" -->UNIX_JACK</em>&nbsp;</td><td>
+The Jack Low-Latency Audio Server API. </td></tr>
 <tr><td valign="top"><em><a class="anchor" name="w8w4"></a><!-- doxytag: member="MACOSX_CORE" ref="w8w4" args="" -->MACOSX_CORE</em>&nbsp;</td><td>
 Macintosh OS-X Core Audio API. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w8w5"></a><!-- doxytag: member="IRIX_AL" ref="w8w5" args="" -->IRIX_AL</em>&nbsp;</td><td>
-The Irix Audio Library API. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w8w6"></a><!-- doxytag: member="WINDOWS_ASIO" ref="w8w6" args="" -->WINDOWS_ASIO</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w8w5"></a><!-- doxytag: member="WINDOWS_ASIO" ref="w8w5" args="" -->WINDOWS_ASIO</em>&nbsp;</td><td>
 The Steinberg Audio Stream I/O API. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w8w7"></a><!-- doxytag: member="WINDOWS_DS" ref="w8w7" args="" -->WINDOWS_DS</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w8w6"></a><!-- doxytag: member="WINDOWS_DS" ref="w8w6" args="" -->WINDOWS_DS</em>&nbsp;</td><td>
 The Microsoft Direct Sound API. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="w8w7"></a><!-- doxytag: member="RTAUDIO_DUMMY" ref="w8w7" args="" -->RTAUDIO_DUMMY</em>&nbsp;</td><td>
+A compilable but non-functional API. </td></tr>
 </table>
 </dl>
     </td>
   </tr>
 </table>
 <hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="a0"></a><!-- doxytag: member="RtAudio::RtAudio" ref="a0" args="(RtAudioApi api=UNSPECIFIED)" --><p>
+<a class="anchor" name="a0"></a><!-- doxytag: member="RtAudio::RtAudio" ref="a0" args="(RtAudio::Api api=UNSPECIFIED)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
@@ -147,10 +168,10 @@ The Microsoft Direct Sound API. </td></tr>
         <tr>
           <td class="md" nowrap valign="top">RtAudio::RtAudio           </td>
           <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top"><a class="el" href="classRtAudio.html#w8">RtAudioApi</a>&nbsp;</td>
+          <td class="md" nowrap valign="top"><a class="el" href="classRtAudio.html#w8">RtAudio::Api</a>&nbsp;</td>
           <td class="mdname1" valign="top" nowrap> <em>api</em> = <code>UNSPECIFIED</code>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
-          <td class="md" nowrap></td>
+          <td class="md" nowrap>  throw ()</td>
         </tr>
       </table>
     </td>
@@ -164,75 +185,23 @@ The Microsoft Direct Sound API. </td></tr>
     <td>
 
 <p>
-The default class constructor. 
+The class constructor. 
 <p>
-Probes the system to make sure at least one audio input/output device is available and determines the api-specific identifier for each device found. An <a class="el" href="classRtError.html">RtError</a> error can be thrown if no devices are found or if a memory allocation error occurs.<p>
+The constructor performs minor initialization tasks. No exceptions can be thrown.<p>
 If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems).    </td>
   </tr>
 </table>
-<a class="anchor" name="a1"></a><!-- doxytag: member="RtAudio::RtAudio" ref="a1" args="(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers, RtAudioApi api=UNSPECIFIED)" --><p>
+<a class="anchor" name="a1"></a><!-- doxytag: member="RtAudio::~RtAudio" ref="a1" args="()" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">RtAudio::RtAudio           </td>
+          <td class="md" nowrap valign="top">RtAudio::~RtAudio           </td>
           <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top">int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>RtAudioFormat&nbsp;</td>
-          <td class="mdname" nowrap> <em>format</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>sampleRate</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int *&nbsp;</td>
-          <td class="mdname" nowrap> <em>bufferSize</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>numberOfBuffers</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap><a class="el" href="classRtAudio.html#w8">RtAudioApi</a>&nbsp;</td>
-          <td class="mdname" nowrap> <em>api</em> = <code>UNSPECIFIED</code></td>
-        </tr>
-        <tr>
-          <td class="md"></td>
-          <td class="md">)&nbsp;</td>
-          <td class="md" colspan="2"></td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap>  throw ()</td>
         </tr>
       </table>
     </td>
@@ -246,75 +215,24 @@ If no API argument is specified and multiple API support has been compiled, the
     <td>
 
 <p>
-A constructor which can be used to open a stream during instantiation
+The destructor
 <p>
-The specified output and/or input device identifiers correspond to those enumerated via the <a class="el" href="classRtAudio.html#a9">getDeviceInfo()</a> method. If device = 0, the default or first available devices meeting the given parameters is selected. If an output or input channel value is zero, the corresponding device value is ignored. When a stream is successfully opened, its identifier is returned via the "streamId" pointer. An <a class="el" href="classRtError.html">RtError</a> can be thrown if no devices are found for the given parameters, if a memory allocation error occurs, or if a driver error occurs.<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classRtAudio.html#a4">openStream()</a></dd></dl>
-    </td>
+If a stream is running or open, it will be stopped and closed automatically.    </td>
   </tr>
 </table>
-<a class="anchor" name="a2"></a><!-- doxytag: member="RtAudio::RtAudio" ref="a2" args="(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers, RtAudioApi api=UNSPECIFIED)" --><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="e0"></a><!-- doxytag: member="RtAudio::getCompiledApi" ref="e0" args="(std::vector&lt; RtAudio::Api &gt; &amp;apis)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">RtAudio::RtAudio           </td>
+          <td class="md" nowrap valign="top">static void RtAudio::getCompiledApi           </td>
           <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top">int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>RtAudioFormat&nbsp;</td>
-          <td class="mdname" nowrap> <em>format</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>sampleRate</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int *&nbsp;</td>
-          <td class="mdname" nowrap> <em>bufferSize</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int *&nbsp;</td>
-          <td class="mdname" nowrap> <em>numberOfBuffers</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap><a class="el" href="classRtAudio.html#w8">RtAudioApi</a>&nbsp;</td>
-          <td class="mdname" nowrap> <em>api</em> = <code>UNSPECIFIED</code></td>
-        </tr>
-        <tr>
-          <td class="md"></td>
-          <td class="md">)&nbsp;</td>
-          <td class="md" colspan="2"></td>
+          <td class="md" nowrap valign="top">std::vector&lt; <a class="el" href="classRtAudio.html#w8">RtAudio::Api</a> &gt; &amp;&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>apis</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap>  throw ()<code> [static]</code></td>
         </tr>
       </table>
     </td>
@@ -328,22 +246,23 @@ The specified output and/or input device identifiers correspond to those enumera
     <td>
 
 <p>
-An overloaded constructor which opens a stream and also returns <code>numberOfBuffers</code> parameter via pointer argument
+A static function to determine the available compiled audio APIs
 <p>
-See the previous constructor call for details. This overloaded version differs only in that it takes a pointer argument for the <code>numberOfBuffers</code> parameter and returns the value used by the audio device (which may be different from that requested). Note that the <code>numberofBuffers</code> parameter is not used with the Linux Jack, Macintosh CoreAudio, and Windows ASIO APIs.    </td>
+The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems.    </td>
   </tr>
 </table>
-<a class="anchor" name="a3"></a><!-- doxytag: member="RtAudio::~RtAudio" ref="a3" args="()" --><p>
+<a class="anchor" name="a3"></a><!-- doxytag: member="RtAudio::getDeviceCount" ref="a3" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">RtAudio::~RtAudio           </td>
+          <td class="md" nowrap valign="top">unsigned int RtAudio::getDeviceCount           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
-          <td class="md" nowrap></td>
+          <td class="md" nowrap>  throw ()<code> [inline]</code></td>
         </tr>
       </table>
     </td>
@@ -357,157 +276,23 @@ See the previous constructor call for details. This overloaded version differs o
     <td>
 
 <p>
-The destructor
+A public function that queries for the number of audio devices available
 <p>
-Stops and closes an open stream and devices and deallocates buffer and structure memory.    </td>
+This function performs a system query of available devices each time it is called, thus supporting devices connected <em>after</em> instantiation. If a system error occurs during processing, a warning will be issued.    </td>
   </tr>
 </table>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="a4"></a><!-- doxytag: member="RtAudio::openStream" ref="a4" args="(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers)" --><p>
+<a class="anchor" name="a4"></a><!-- doxytag: member="RtAudio::getDeviceInfo" ref="a4" args="(unsigned int device)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::openStream           </td>
+          <td class="md" nowrap valign="top"><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> RtAudio::getDeviceInfo           </td>
           <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top">int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>RtAudioFormat&nbsp;</td>
-          <td class="mdname" nowrap> <em>format</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>sampleRate</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int *&nbsp;</td>
-          <td class="mdname" nowrap> <em>bufferSize</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>numberOfBuffers</em></td>
-        </tr>
-        <tr>
-          <td class="md"></td>
-          <td class="md">)&nbsp;</td>
-          <td class="md" colspan="2"></td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-</table>
-<table cellspacing="5" cellpadding="0" border="0">
-  <tr>
-    <td>
-      &nbsp;
-    </td>
-    <td>
-
-<p>
-A public method for opening a stream with the specified parameters. 
-<p>
-An <a class="el" href="classRtError.html">RtError</a> is thrown if a stream cannot be opened.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
-  <table border="0" cellspacing="2" cellpadding="0">
-    <tr><td valign="top"></td><td valign="top"><em>outputDevice,:</em>&nbsp;</td><td>If equal to 0, the default or first device found meeting the given parameters is opened. Otherwise, the device number should correspond to one of those enumerated via the <a class="el" href="classRtAudio.html#a9">getDeviceInfo()</a> method. </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>outputChannels,:</em>&nbsp;</td><td>The desired number of output channels. If equal to zero, the outputDevice identifier is ignored. </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>inputDevice,:</em>&nbsp;</td><td>If equal to 0, the default or first device found meeting the given parameters is opened. Otherwise, the device number should correspond to one of those enumerated via the <a class="el" href="classRtAudio.html#a9">getDeviceInfo()</a> method. </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>inputChannels,:</em>&nbsp;</td><td>The desired number of input channels. If equal to zero, the inputDevice identifier is ignored. </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>format,:</em>&nbsp;</td><td>An RtAudioFormat specifying the desired sample data format. </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>sampleRate,:</em>&nbsp;</td><td>The desired sample rate (sample frames per second). </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>*bufferSize,:</em>&nbsp;</td><td>A pointer value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined. </td></tr>
-    <tr><td valign="top"></td><td valign="top"><em>numberOfBuffers,:</em>&nbsp;</td><td>A value which can be used to help control device latency. More buffers typically result in more robust performance, though at a cost of greater latency. A value of zero can be specified, in which case the lowest allowable value is used.</td></tr>
-  </table>
-</dl>
-    </td>
-  </tr>
-</table>
-<a class="anchor" name="a5"></a><!-- doxytag: member="RtAudio::openStream" ref="a5" args="(int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers)" --><p>
-<table class="mdTable" cellpadding="2" cellspacing="0">
-  <tr>
-    <td class="mdRow">
-      <table cellpadding="0" cellspacing="0" border="0">
-        <tr>
-          <td class="md" nowrap valign="top">void RtAudio::openStream           </td>
-          <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top">int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>outputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputDevice</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>inputChannels</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>RtAudioFormat&nbsp;</td>
-          <td class="mdname" nowrap> <em>format</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int&nbsp;</td>
-          <td class="mdname" nowrap> <em>sampleRate</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int *&nbsp;</td>
-          <td class="mdname" nowrap> <em>bufferSize</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>int *&nbsp;</td>
-          <td class="mdname" nowrap> <em>numberOfBuffers</em></td>
-        </tr>
-        <tr>
-          <td class="md"></td>
-          <td class="md">)&nbsp;</td>
-          <td class="md" colspan="2"></td>
+          <td class="md" nowrap valign="top">unsigned int&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>device</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline]</code></td>
         </tr>
       </table>
     </td>
@@ -521,32 +306,23 @@ An <a class="el" href="classRtError.html">RtError</a> is thrown if a stream cann
     <td>
 
 <p>
-A public method for opening a stream and also returning <code>numberOfBuffers</code> parameter via pointer argument
+Return an <a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> structure for a specified device number
 <p>
-See the previous function call for details. This overloaded version differs only in that it takes a pointer argument for the <code>numberOfBuffers</code> parameter and returns the value used by the audio device (which may be different from that requested). Note that the <code>numberofBuffers</code> parameter is not used with the Linux Jack, Macintosh CoreAudio, and Windows ASIO APIs.    </td>
+Any device integer between 0 and <a class="el" href="classRtAudio.html#a3">getDeviceCount()</a> - 1 is valid. If an invalid argument is provided, an <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) will be thrown. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the corresponding "isDefault" member will have a value of "true".    </td>
   </tr>
 </table>
-<a class="anchor" name="a6"></a><!-- doxytag: member="RtAudio::setStreamCallback" ref="a6" args="(RtAudioCallback callback, void *userData)" --><p>
+<a class="anchor" name="a5"></a><!-- doxytag: member="RtAudio::getDefaultOutputDevice" ref="a5" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::setStreamCallback           </td>
+          <td class="md" nowrap valign="top">unsigned int RtAudio::getDefaultOutputDevice           </td>
           <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top">RtAudioCallback&nbsp;</td>
-          <td class="mdname" nowrap> <em>callback</em>, </td>
-        </tr>
-        <tr>
-          <td class="md" nowrap align="right"></td>
-          <td class="md"></td>
-          <td class="md" nowrap>void *&nbsp;</td>
-          <td class="mdname" nowrap> <em>userData</em></td>
-        </tr>
-        <tr>
-          <td class="md"></td>
-          <td class="md">)&nbsp;</td>
-          <td class="md" colspan="2"><code> [inline]</code></td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap>  throw ()<code> [inline]</code></td>
         </tr>
       </table>
     </td>
@@ -560,22 +336,23 @@ See the previous function call for details. This overloaded version differs only
     <td>
 
 <p>
-A public method which sets a user-defined callback function for a given stream
+A function that returns the index of the default output device
 <p>
-This method assigns a callback function to a previously opened stream for non-blocking stream functionality. A separate process is initiated, though the user function is called only when the stream is "running" (between calls to the <a class="el" href="classRtAudio.html#a13">startStream()</a> and <a class="el" href="classRtAudio.html#a14">stopStream()</a> methods, respectively). The callback process remains active for the duration of the stream and is automatically shutdown when the stream is closed (via the <a class="el" href="classRtAudio.html#a12">closeStream()</a> method or by object destruction). The callback process can also be shutdown and the user function de-referenced through an explicit call to the <a class="el" href="classRtAudio.html#a7">cancelStreamCallback()</a> method. Note that the stream can use only blocking or callback functionality at a particular time, though it is possible to alternate modes on the same stream through the use of the <a class="el" href="classRtAudio.html#a6">setStreamCallback()</a> and <a class="el" href="classRtAudio.html#a7">cancelStreamCallback()</a> methods (the blocking <a class="el" href="classRtAudio.html#a11">tickStream()</a> method can be used before a callback is set and/or after a callback is cancelled). An <a class="el" href="classRtError.html">RtError</a> will be thrown if called when no stream is open or a thread errors occurs.    </td>
+If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream.    </td>
   </tr>
 </table>
-<a class="anchor" name="a7"></a><!-- doxytag: member="RtAudio::cancelStreamCallback" ref="a7" args="()" --><p>
+<a class="anchor" name="a6"></a><!-- doxytag: member="RtAudio::getDefaultInputDevice" ref="a6" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::cancelStreamCallback           </td>
+          <td class="md" nowrap valign="top">unsigned int RtAudio::getDefaultInputDevice           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
-          <td class="md" nowrap><code> [inline]</code></td>
+          <td class="md" nowrap>  throw ()<code> [inline]</code></td>
         </tr>
       </table>
     </td>
@@ -589,23 +366,68 @@ This method assigns a callback function to a previously opened stream for non-bl
     <td>
 
 <p>
-A public method which cancels a callback process and function for the stream
+A function that returns the index of the default input device
 <p>
-This method shuts down a callback process and de-references the user function for the stream. Callback functionality can subsequently be restarted on the stream via the <a class="el" href="classRtAudio.html#a6">setStreamCallback()</a> method. An <a class="el" href="classRtError.html">RtError</a> will be thrown if called when no stream is open.    </td>
+If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream.    </td>
   </tr>
 </table>
-<a class="anchor" name="a9"></a><!-- doxytag: member="RtAudio::getDeviceInfo" ref="a9" args="(int device)" --><p>
+<a class="anchor" name="a7"></a><!-- doxytag: member="RtAudio::openStream" ref="a7" args="(RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData=NULL, RtAudio::StreamOptions *options=NULL)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top"><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> RtAudio::getDeviceInfo           </td>
+          <td class="md" nowrap valign="top">void RtAudio::openStream           </td>
           <td class="md" valign="top">(&nbsp;</td>
-          <td class="md" nowrap valign="top">int&nbsp;</td>
-          <td class="mdname1" valign="top" nowrap> <em>device</em>          </td>
-          <td class="md" valign="top">&nbsp;)&nbsp;</td>
-          <td class="md" nowrap><code> [inline]</code></td>
+          <td class="md" nowrap valign="top"><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> *&nbsp;</td>
+          <td class="mdname" nowrap> <em>outputParameters</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> *&nbsp;</td>
+          <td class="mdname" nowrap> <em>inputParameters</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap><a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a>&nbsp;</td>
+          <td class="mdname" nowrap> <em>format</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>unsigned int&nbsp;</td>
+          <td class="mdname" nowrap> <em>sampleRate</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>unsigned int *&nbsp;</td>
+          <td class="mdname" nowrap> <em>bufferFrames</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap><a class="el" href="RtAudio_8h.html#a15">RtAudioCallback</a>&nbsp;</td>
+          <td class="mdname" nowrap> <em>callback</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>void *&nbsp;</td>
+          <td class="mdname" nowrap> <em>userData</em> = <code>NULL</code>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap><a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *&nbsp;</td>
+          <td class="mdname" nowrap> <em>options</em> = <code>NULL</code></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
         </tr>
       </table>
     </td>
@@ -619,22 +441,36 @@ This method shuts down a callback process and de-references the user function fo
     <td>
 
 <p>
-Return an <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure for a specified device number
+A public function for opening a stream with the specified parameters
 <p>
-Any device integer between 1 and <a class="el" href="classRtAudio.html#a8">getDeviceCount()</a> is valid. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the "isDefault" member will have a value of "true". An <a class="el" href="classRtError.html">RtError</a> will be thrown for an invalid device argument.    </td>
+An <a class="el" href="classRtError.html">RtError</a> (type = SYSTEM_ERROR) is thrown if a stream cannot be opened with the specified parameters or an error occurs during processing. An <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) is thrown if any invalid device ID or channel number parameters are specified.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>outputParameters</em>&nbsp;</td><td>Specifies output stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For input-only streams, this argument should be NULL. The device ID is an index value between 0 and <a class="el" href="classRtAudio.html#a3">getDeviceCount()</a> - 1. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>inputParameters</em>&nbsp;</td><td>Specifies input stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For output-only streams, this argument should be NULL. The device ID is an index value between 0 and <a class="el" href="classRtAudio.html#a3">getDeviceCount()</a> - 1. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>An RtAudioFormat specifying the desired sample data format. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>sampleRate</em>&nbsp;</td><td>The desired sample rate (sample frames per second). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>*bufferFrames</em>&nbsp;</td><td>A pointer to a value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>callback</em>&nbsp;</td><td>A client-defined function that will be invoked when input data is available and/or output data is needed. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>userData</em>&nbsp;</td><td>An optional pointer to data that can be accessed from within the callback function. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>An optional pointer to a structure containing various global stream options, including a list of OR'ed RtAudioStreamFlags and a suggested number of stream buffers that can be used to control stream latency. More buffers typically result in more robust performance, though at a cost of greater latency. If a value of zero is specified, a system-specific median value is chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent.</td></tr>
+  </table>
+</dl>
+    </td>
   </tr>
 </table>
-<a class="anchor" name="a10"></a><!-- doxytag: member="RtAudio::getStreamBuffer" ref="a10" args="()" --><p>
+<a class="anchor" name="a8"></a><!-- doxytag: member="RtAudio::closeStream" ref="a8" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">char* const RtAudio::getStreamBuffer           </td>
+          <td class="md" nowrap valign="top">void RtAudio::closeStream           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
-          <td class="md" nowrap><code> [inline]</code></td>
+          <td class="md" nowrap>  throw ()<code> [inline]</code></td>
         </tr>
       </table>
     </td>
@@ -648,19 +484,20 @@ Any device integer between 1 and <a class="el" href="classRtAudio.html#a8">getDe
     <td>
 
 <p>
-A public method which returns a pointer to the buffer for an open stream
+A function that closes a stream and frees any associated stream memory
 <p>
-The user should fill and/or read the buffer data in interleaved format and then call the <a class="el" href="classRtAudio.html#a11">tickStream()</a> method. An <a class="el" href="classRtError.html">RtError</a> will be thrown if called when no stream is open.    </td>
+If a stream is not open, this function issues a warning and returns (no exception is thrown).    </td>
   </tr>
 </table>
-<a class="anchor" name="a11"></a><!-- doxytag: member="RtAudio::tickStream" ref="a11" args="()" --><p>
+<a class="anchor" name="a9"></a><!-- doxytag: member="RtAudio::startStream" ref="a9" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::tickStream           </td>
+          <td class="md" nowrap valign="top">void RtAudio::startStream           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
           <td class="md" nowrap><code> [inline]</code></td>
@@ -677,19 +514,20 @@ The user should fill and/or read the buffer data in interleaved format and then
     <td>
 
 <p>
-Public method used to trigger processing of input/output data for a stream. 
+A function that starts a stream. 
 <p>
-This method blocks until all buffer data is read/written. An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver error occurs or if called when no stream is open.    </td>
+An <a class="el" href="classRtError.html">RtError</a> (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already running.    </td>
   </tr>
 </table>
-<a class="anchor" name="a12"></a><!-- doxytag: member="RtAudio::closeStream" ref="a12" args="()" --><p>
+<a class="anchor" name="a10"></a><!-- doxytag: member="RtAudio::stopStream" ref="a10" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::closeStream           </td>
+          <td class="md" nowrap valign="top">void RtAudio::stopStream           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
           <td class="md" nowrap><code> [inline]</code></td>
@@ -706,19 +544,20 @@ This method blocks until all buffer data is read/written. An <a class="el" href=
     <td>
 
 <p>
-Public method which closes a stream and frees any associated buffers
+Stop a stream, allowing any samples remaining in the output queue to be played
 <p>
-If a stream is not open, this method issues a warning and returns (an <a class="el" href="classRtError.html">RtError</a> is not thrown).    </td>
+An <a class="el" href="classRtError.html">RtError</a> (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped.    </td>
   </tr>
 </table>
-<a class="anchor" name="a13"></a><!-- doxytag: member="RtAudio::startStream" ref="a13" args="()" --><p>
+<a class="anchor" name="a11"></a><!-- doxytag: member="RtAudio::abortStream" ref="a11" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::startStream           </td>
+          <td class="md" nowrap valign="top">void RtAudio::abortStream           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
           <td class="md" nowrap><code> [inline]</code></td>
@@ -735,19 +574,20 @@ If a stream is not open, this method issues a warning and returns (an <a class="
     <td>
 
 <p>
-Public method which starts a stream
+Stop a stream, discarding any samples remaining in the input/output queue
 <p>
-An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver error occurs or if called when no stream is open.    </td>
+An <a class="el" href="classRtError.html">RtError</a> (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped.    </td>
   </tr>
 </table>
-<a class="anchor" name="a14"></a><!-- doxytag: member="RtAudio::stopStream" ref="a14" args="()" --><p>
+<a class="anchor" name="a14"></a><!-- doxytag: member="RtAudio::getStreamTime" ref="a14" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::stopStream           </td>
+          <td class="md" nowrap valign="top">double RtAudio::getStreamTime           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
           <td class="md" nowrap><code> [inline]</code></td>
@@ -764,19 +604,20 @@ An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver
     <td>
 
 <p>
-Stop a stream, allowing any samples remaining in the queue to be played out and/or read in
+Returns the number of elapsed seconds since the stream was started
 <p>
-An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver error occurs or if called when no stream is open.    </td>
+If a stream is not open, an <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) will be thrown.    </td>
   </tr>
 </table>
-<a class="anchor" name="a15"></a><!-- doxytag: member="RtAudio::abortStream" ref="a15" args="()" --><p>
+<a class="anchor" name="a15"></a><!-- doxytag: member="RtAudio::getStreamLatency" ref="a15" args="(void)" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">void RtAudio::abortStream           </td>
+          <td class="md" nowrap valign="top">long RtAudio::getStreamLatency           </td>
           <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
           <td class="mdname1" valign="top" nowrap>          </td>
           <td class="md" valign="top">&nbsp;)&nbsp;</td>
           <td class="md" nowrap><code> [inline]</code></td>
@@ -793,9 +634,9 @@ An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver
     <td>
 
 <p>
-Stop a stream, discarding any samples remaining in the input/output queue
+Returns the internal stream latency in sample frames
 <p>
-An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver error occurs or if called when no stream is open.    </td>
+The stream latency refers to delay in audio input and/or output caused by internal buffering by the audio system and/or hardware. For duplex streams, the returned value will represent the sum of the input and output latencies. If a stream is not open, an <a class="el" href="classRtError.html">RtError</a> (type = INVALID_USE) will be thrown. If the API does not report latency, the return value will be zero.    </td>
   </tr>
 </table>
 <hr>The documentation for this class was generated from the following file:<ul>
@@ -803,8 +644,7 @@ An <a class="el" href="classRtError.html">RtError</a> will be thrown if a driver
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index fdb99ee9e6befeec089f8c755ecbe3cc72f869ee..9e99b2711146f9cf66553f6a87d37a425b9b9a1f 100644 (file)
@@ -1,37 +1,35 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtError Member List</h1>This is the complete list of members for <a class="el" href="classRtError.html">RtError</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w1">DEBUG_WARNING</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w8">DRIVER_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w6">DRIVER_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtError.html#a4">getMessage</a>(void)</td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#a5">getMessageString</a>(void)</td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline, virtual]</code></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtError.html#a3">getType</a>(void)</td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w4">INVALID_DEVICE</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w7">INVALID_PARAMETER</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w5">INVALID_STREAM</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w6">MEMORY_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w3">NO_DEVICES_FOUND</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w2">INVALID_DEVICE</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w4">INVALID_PARAMETER</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w5">INVALID_USE</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w3">MEMORY_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w1">NO_DEVICES_FOUND</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtError.html#a2">printMessage</a>(void)</td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline, virtual]</code></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtError.html#a0">RtError</a>(const std::string &amp;message, Type type=RtError::UNSPECIFIED)</td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w9">SYSTEM_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w10">THREAD_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11">Type</a> enum name</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w2">UNSPECIFIED</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="classRtError.html#w11w0">WARNING</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w7">SYSTEM_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w8">THREAD_ERROR</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9">Type</a> enum name</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#w9w0">UNSPECIFIED</a> enum value</td><td><a class="el" href="classRtError.html">RtError</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRtError.html#a5">what</a>(void) const </td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline, virtual]</code></td></tr>
   <tr class="memlist"><td><a class="el" href="classRtError.html#a1">~RtError</a>(void)</td><td><a class="el" href="classRtError.html">RtError</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index 23bfd0f2e388c47e21de04bcfc71d56e9fb31bfa..244c52f5e999e2f8f3287f33dd41789b32fbe93d 100644 (file)
@@ -1,11 +1,12 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtError Class Reference</h1><!-- doxytag: class="RtError" -->Exception handling class for <a class="el" href="classRtAudio.html">RtAudio</a> &amp; RtMidi.  
 <a href="classRtError-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#w11">Type</a> { <br>
-&nbsp;&nbsp;<a class="el" href="classRtError.html#w11w0">WARNING</a>, 
-<a class="el" href="classRtError.html#w11w1">DEBUG_WARNING</a>, 
-<a class="el" href="classRtError.html#w11w2">UNSPECIFIED</a>, 
-<a class="el" href="classRtError.html#w11w3">NO_DEVICES_FOUND</a>, 
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#w9">Type</a> { <br>
+&nbsp;&nbsp;<a class="el" href="classRtError.html#w9w0">UNSPECIFIED</a>, 
+<a class="el" href="classRtError.html#w9w1">NO_DEVICES_FOUND</a>, 
+<a class="el" href="classRtError.html#w9w2">INVALID_DEVICE</a>, 
+<a class="el" href="classRtError.html#w9w3">MEMORY_ERROR</a>, 
 <br>
-&nbsp;&nbsp;<a class="el" href="classRtError.html#w11w4">INVALID_DEVICE</a>, 
-<a class="el" href="classRtError.html#w11w5">INVALID_STREAM</a>, 
-<a class="el" href="classRtError.html#w11w6">MEMORY_ERROR</a>, 
-<a class="el" href="classRtError.html#w11w7">INVALID_PARAMETER</a>, 
+&nbsp;&nbsp;<a class="el" href="classRtError.html#w9w4">INVALID_PARAMETER</a>, 
+<a class="el" href="classRtError.html#w9w5">INVALID_USE</a>, 
+<a class="el" href="classRtError.html#w9w6">DRIVER_ERROR</a>, 
+<a class="el" href="classRtError.html#w9w7">SYSTEM_ERROR</a>, 
 <br>
-&nbsp;&nbsp;<a class="el" href="classRtError.html#w11w8">DRIVER_ERROR</a>, 
-<a class="el" href="classRtError.html#w11w9">SYSTEM_ERROR</a>, 
-<a class="el" href="classRtError.html#w11w10">THREAD_ERROR</a>
+&nbsp;&nbsp;<a class="el" href="classRtError.html#w9w8">THREAD_ERROR</a>
 <br>
  }</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Defined RtError types.  <a href="classRtError.html#w11">More...</a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Defined RtError types.  <a href="classRtError.html#w9">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0"></a><!-- doxytag: member="RtError::RtError" ref="a0" args="(const std::string &amp;message, Type type=RtError::UNSPECIFIED)" -->
-&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a0">RtError</a> (const std::string &amp;message, <a class="el" href="classRtError.html#w11">Type</a> type=RtError::UNSPECIFIED)</td></tr>
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a0">RtError</a> (const std::string &amp;message, <a class="el" href="classRtError.html#w9">Type</a> type=RtError::UNSPECIFIED)  throw ()</td></tr>
 
 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The constructor. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1"></a><!-- doxytag: member="RtError::~RtError" ref="a1" args="(void)" -->
-virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a1">~RtError</a> (void)</td></tr>
+virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a1">~RtError</a> (void)  throw ()</td></tr>
 
 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The destructor. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a2"></a><!-- doxytag: member="RtError::printMessage" ref="a2" args="(void)" -->
-virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a2">printMessage</a> (void)</td></tr>
+virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a2">printMessage</a> (void)  throw ()</td></tr>
 
 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Prints thrown error message to stderr. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3"></a><!-- doxytag: member="RtError::getType" ref="a3" args="(void)" -->
-virtual const <a class="el" href="classRtError.html#w11">Type</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a3">getType</a> (void)</td></tr>
+virtual const <a class="el" href="classRtError.html#w9">Type</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a3">getType</a> (void)  throw ()</td></tr>
 
 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the thrown error message type. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4"></a><!-- doxytag: member="RtError::getMessage" ref="a4" args="(void)" -->
-virtual const std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a4">getMessage</a> (void)</td></tr>
+virtual const std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a4">getMessage</a> (void)  throw ()</td></tr>
 
 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the thrown error message string. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5"></a><!-- doxytag: member="RtError::getMessageString" ref="a5" args="(void)" -->
-virtual const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a5">getMessageString</a> (void)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5"></a><!-- doxytag: member="RtError::what" ref="a5" args="(void) const " -->
+virtual const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRtError.html#a5">what</a> (void) const   throw ()</td></tr>
 
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the thrown error message as a C string. <br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the thrown error message as a c-style string. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 Exception handling class for <a class="el" href="classRtAudio.html">RtAudio</a> &amp; RtMidi. 
 <p>
-The RtError class is quite simple but it does allow errors to be "caught" by <a class="el" href="classRtError.html#w11">RtError::Type</a>. See the <a class="el" href="classRtAudio.html">RtAudio</a> and RtMidi documentation to know which methods can throw an RtError.
+The RtError class is quite simple but it does allow errors to be "caught" by <a class="el" href="classRtError.html#w9">RtError::Type</a>. See the <a class="el" href="classRtAudio.html">RtAudio</a> and RtMidi documentation to know which methods can throw an RtError.
 <p>
 <hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="w11"></a><!-- doxytag: member="RtError::Type" ref="w11" args="" --><p>
+<a class="anchor" name="w9"></a><!-- doxytag: member="RtError::Type" ref="w9" args="" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">enum <a class="el" href="classRtError.html#w11">RtError::Type</a>          </td>
+          <td class="md" nowrap valign="top">enum <a class="el" href="classRtError.html#w9">RtError::Type</a>          </td>
         </tr>
       </table>
     </td>
@@ -90,27 +89,23 @@ Defined RtError types.
 <p>
 <dl compact><dt><b>Enumerator: </b></dt><dd>
 <table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="w11w0"></a><!-- doxytag: member="WARNING" ref="w11w0" args="" -->WARNING</em>&nbsp;</td><td>
-A non-critical error. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w1"></a><!-- doxytag: member="DEBUG_WARNING" ref="w11w1" args="" -->DEBUG_WARNING</em>&nbsp;</td><td>
-A non-critical error which might be useful for debugging. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w2"></a><!-- doxytag: member="UNSPECIFIED" ref="w11w2" args="" -->UNSPECIFIED</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w0"></a><!-- doxytag: member="UNSPECIFIED" ref="w9w0" args="" -->UNSPECIFIED</em>&nbsp;</td><td>
 The default, unspecified error type. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w3"></a><!-- doxytag: member="NO_DEVICES_FOUND" ref="w11w3" args="" -->NO_DEVICES_FOUND</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w1"></a><!-- doxytag: member="NO_DEVICES_FOUND" ref="w9w1" args="" -->NO_DEVICES_FOUND</em>&nbsp;</td><td>
 No devices found on system. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w4"></a><!-- doxytag: member="INVALID_DEVICE" ref="w11w4" args="" -->INVALID_DEVICE</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w2"></a><!-- doxytag: member="INVALID_DEVICE" ref="w9w2" args="" -->INVALID_DEVICE</em>&nbsp;</td><td>
 An invalid device ID was specified. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w5"></a><!-- doxytag: member="INVALID_STREAM" ref="w11w5" args="" -->INVALID_STREAM</em>&nbsp;</td><td>
-An invalid stream ID was specified. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w6"></a><!-- doxytag: member="MEMORY_ERROR" ref="w11w6" args="" -->MEMORY_ERROR</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w3"></a><!-- doxytag: member="MEMORY_ERROR" ref="w9w3" args="" -->MEMORY_ERROR</em>&nbsp;</td><td>
 An error occured during memory allocation. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w7"></a><!-- doxytag: member="INVALID_PARAMETER" ref="w11w7" args="" -->INVALID_PARAMETER</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w4"></a><!-- doxytag: member="INVALID_PARAMETER" ref="w9w4" args="" -->INVALID_PARAMETER</em>&nbsp;</td><td>
 An invalid parameter was specified to a function. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w8"></a><!-- doxytag: member="DRIVER_ERROR" ref="w11w8" args="" -->DRIVER_ERROR</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w5"></a><!-- doxytag: member="INVALID_USE" ref="w9w5" args="" -->INVALID_USE</em>&nbsp;</td><td>
+The function was called incorrectly. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="w9w6"></a><!-- doxytag: member="DRIVER_ERROR" ref="w9w6" args="" -->DRIVER_ERROR</em>&nbsp;</td><td>
 A system driver error occured. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w9"></a><!-- doxytag: member="SYSTEM_ERROR" ref="w11w9" args="" -->SYSTEM_ERROR</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w7"></a><!-- doxytag: member="SYSTEM_ERROR" ref="w9w7" args="" -->SYSTEM_ERROR</em>&nbsp;</td><td>
 A system error occured. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="w11w10"></a><!-- doxytag: member="THREAD_ERROR" ref="w11w10" args="" -->THREAD_ERROR</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" name="w9w8"></a><!-- doxytag: member="THREAD_ERROR" ref="w9w8" args="" -->THREAD_ERROR</em>&nbsp;</td><td>
 A thread error occured. </td></tr>
 </table>
 </dl>
@@ -122,8 +117,7 @@ A thread error occured. </td></tr>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
diff --git a/doc/html/compiling.html b/doc/html/compiling.html
new file mode 100644 (file)
index 0000000..9346457
--- /dev/null
@@ -0,0 +1,42 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="compiling">Debugging &amp; Compiling</a></h1><h2><a class="anchor" name="debug">
+Debugging</a></h2>
+If you are having problems getting <a class="el" href="classRtAudio.html">RtAudio</a> to run on your system, make sure to pass a value of <em>true</em> to the <a class="el" href="classRtAudio.html#a16">RtAudio::showWarnings()</a> function (this is the default setting). A variety of warning messages will be displayed which may help in determining the problem. Also, try using the programs included in the <code>tests</code> directory. The program <code>probe</code> displays the queried capabilities of all hardware devices found for all APIs compiled. When using the ALSA API, further information can be displayed by defining the preprocessor definition __RTAUDIO_DEBUG__.<h2><a class="anchor" name="compile">
+Compiling</a></h2>
+In order to compile <a class="el" href="classRtAudio.html">RtAudio</a> for a specific OS and audio API, it is necessary to supply the appropriate preprocessor definition and library within the compiler statement: <p>
+<table border="2" cols="5" width="100%" cellspacing="3" cellpadding="3">
+<tr bgcolor="beige">
+<td width="5%"><b>OS:</b> </td><td width="5%"><b>Audio API:</b> </td><td width="5%"><b>C++ Class:</b> </td><td width="5%"><b>Preprocessor Definition:</b> </td><td width="5%"><b>Library or Framework:</b> </td><td><b>Example Compiler Statement:</b>  </td></tr>
+<tr>
+<td>Linux </td><td>ALSA </td><td>RtApiAlsa </td><td>__LINUX_ALSA__ </td><td><code>asound, pthread</code> </td><td><code>g++ -Wall -D__LINUX_ALSA__ -o probe probe.cpp RtAudio.cpp -lasound -lpthread</code>  </td></tr>
+<tr>
+<td>Linux </td><td>OSS </td><td>RtApiOss </td><td>__LINUX_OSS__ </td><td><code>pthread</code> </td><td><code>g++ -Wall -D__LINUX_OSS__ -o probe probe.cpp RtAudio.cpp -lpthread</code>  </td></tr>
+<tr>
+<td>Linux or Macintosh OS-X </td><td>Jack Audio Server </td><td>RtApiJack </td><td>__UNIX_JACK__ </td><td><code>jack, pthread</code> </td><td><code>g++ -Wall -D__UNIX_JACK__ -o probe probe.cpp RtAudio.cpp `pkg-config --cflags --libs jack` -lpthread</code> <p>
+</td></tr>
+<tr>
+<td>Macintosh OS-X </td><td>CoreAudio </td><td>RtApiCore </td><td>__MACOSX_CORE__ </td><td><code>pthread, CoreAudio</code> </td><td><code>g++ -Wall -D__MACOSX_CORE__ -o probe probe.cpp RtAudio.cpp -framework CoreAudio -lpthread</code>  </td></tr>
+<tr>
+<td>Windows </td><td>Direct Sound </td><td>RtApiDs </td><td>__WINDOWS_DS__ </td><td><code>dsound.lib (ver. 5.0 or higher), multithreaded</code> </td><td><em>compiler specific</em>  </td></tr>
+<tr>
+<td>Windows </td><td>ASIO </td><td>RtApiAsio </td><td>__WINDOWS_ASIO__ </td><td><em>various ASIO header and source files</em> </td><td><em>compiler specific</em>  </td></tr>
+</table>
+<p>
+The example compiler statements above could be used to compile the <code>probe.cpp</code> example file, assuming that <code>probe.cpp</code>, <code><a class="el" href="RtAudio_8h.html">RtAudio.h</a></code>, <code><a class="el" href="RtError_8h-source.html">RtError.h</a></code>, and <code>RtAudio.cpp</code> all exist in the same directory. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/duplex.html b/doc/html/duplex.html
new file mode 100644 (file)
index 0000000..5ea8165
--- /dev/null
@@ -0,0 +1,84 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="duplex">Duplex Mode</a></h1>Finally, it is easy to use <a class="el" href="classRtAudio.html">RtAudio</a> for simultaneous audio input/output, or duplex operation. In this example, we simply pass the input data back to the output.<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "<a class="code" href="RtAudio_8h.html">RtAudio.h</a>"</span>
+<span class="preprocessor">#include &lt;iostream&gt;</span>
+
+<span class="comment">// Pass-through function.</span>
+<span class="keywordtype">int</span> inout( <span class="keywordtype">void</span> *outputBuffer, <span class="keywordtype">void</span> *inputBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBufferFrames,
+           <span class="keywordtype">double</span> streamTime, <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> status, <span class="keywordtype">void</span> *data )
+{
+  <span class="comment">// Since the number of input and output channels is equal, we can do</span>
+  <span class="comment">// a simple buffer copy operation here.</span>
+  <span class="keywordflow">if</span> ( status ) std::cout &lt;&lt; <span class="stringliteral">"Stream over/underflow detected."</span> &lt;&lt; std::endl;
+
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *bytes = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *) data;
+  memcpy( outputBuffer, inputBuffer, *bytes );
+  <span class="keywordflow">return</span> 0;
+}
+
+<span class="keywordtype">int</span> main()
+{
+ <a class="code" href="classRtAudio.html">RtAudio</a> adac;
+  <span class="keywordflow">if</span> ( adac.<a class="code" href="classRtAudio.html#a3">getDeviceCount</a>() &lt; 1 ) {
+    std::cout &lt;&lt; <span class="stringliteral">"\nNo audio devices found!\n"</span>;
+    exit( 0 );
+  }
+
+  <span class="comment">// Set the same number of channels for both input and output.</span>
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferBytes, bufferFrames = 512;
+  <a class="code" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> iParams, oParams;
+  iParams.<a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a> = 0; <span class="comment">// first available device</span>
+  iParams.<a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a> = 2;
+  oParams.<a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a> = 0; <span class="comment">// first available device</span>
+  oParams.<a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a> = 2;
+
+  <span class="keywordflow">try</span> {
+    adac.<a class="code" href="classRtAudio.html#a7">openStream</a>( &amp;oParams, &amp;iParams, RTAUDIO_SINT32, 44100, &amp;bufferFrames, &amp;inout, (<span class="keywordtype">void</span> *)&amp;bufferBytes );
+  }
+  <span class="keywordflow">catch</span> ( <a class="code" href="classRtError.html">RtError</a>&amp; e ) {
+    e.<a class="code" href="classRtError.html#a2">printMessage</a>();
+    exit( 0 );
+  }
+
+  bufferBytes = bufferFrames * 2 * 4;
+
+  <span class="keywordflow">try</span> {
+    adac.<a class="code" href="classRtAudio.html#a9">startStream</a>();
+
+    <span class="keywordtype">char</span> input;
+    std::cout &lt;&lt; <span class="stringliteral">"\nRunning ... press &lt;enter&gt; to quit.\n"</span>;
+    std::cin.get(input);
+
+    <span class="comment">// Stop the stream.</span>
+    adac.<a class="code" href="classRtAudio.html#a10">stopStream</a>();
+  }
+  <span class="keywordflow">catch</span> ( <a class="code" href="classRtError.html">RtError</a>&amp; e ) {
+    e.<a class="code" href="classRtError.html#a2">printMessage</a>();
+    <span class="keywordflow">goto</span> cleanup;
+  }
+
+ cleanup:
+  <span class="keywordflow">if</span> ( adac.<a class="code" href="classRtAudio.html#a12">isStreamOpen</a>() ) adac.<a class="code" href="classRtAudio.html#a8">closeStream</a>();
+
+  <span class="keywordflow">return</span> 0;
+}
+</pre></div><p>
+In this example, audio recorded by the stream input will be played out during the next round of audio processing.<p>
+Note that a duplex stream can make use of two different devices (except when using the Linux Jack and Windows ASIO APIs). However, this may cause timing problems due to possible device clock variations, unless a common external "sync" is provided. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/errors.html b/doc/html/errors.html
new file mode 100644 (file)
index 0000000..d0f776a
--- /dev/null
@@ -0,0 +1,19 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="errors">Error Handling</a></h1><a class="el" href="classRtAudio.html">RtAudio</a> makes restrained use of C++ exceptions. That is, exceptions are thrown only when system errors occur that prevent further class operation or when the user makes invalid function calls. In other cases, a warning message may be displayed and an appropriate value is returned. For example, if a system error occurs when processing the <a class="el" href="classRtAudio.html#a3">RtAudio::getDeviceCount()</a> function, the return value is zero. In such a case, the user cannot expect to make use of most other <a class="el" href="classRtAudio.html">RtAudio</a> functions because no devices are available (and thus a stream cannot be opened). A client can call the function <a class="el" href="classRtAudio.html#a16">RtAudio::showWarnings()</a> with a boolean argument to enable or disable the printing of warning messages to <code>stderr</code>. By default, warning messages are displayed. There is a protected <a class="el" href="classRtAudio.html">RtAudio</a> method, error(), that can be modified to globally control how these messages are handled and reported. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
index eb980a17a68be25bd32818cbb012616a0e7e2527..c00be9f52d5edfe84dc666a4756c2c00c9ed744e 100644 (file)
@@ -1,22 +1,22 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <h1>RtAudio File List</h1>Here is a list of all documented files with brief descriptions:<table>
-  <tr><td class="indexkey"><b>RtAudio.h</b> <a href="RtAudio_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="RtAudio_8h.html">RtAudio.h</a> <a href="RtAudio_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
   <tr><td class="indexkey"><b>RtError.h</b> <a href="RtError_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
 </table>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index 870481dcfee277d706ffe9b862cc17b07d687b45..2593f8ded5e22b3c46659e39e6a9708bdddf26d4 100644 (file)
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <div class="qindex"><a class="qindexHL" href="functions.html">All</a> | <a class="qindex" href="functions_func.html">Functions</a> | <a class="qindex" href="functions_vars.html">Variables</a> | <a class="qindex" href="functions_enum.html">Enumerations</a> | <a class="qindex" href="functions_eval.html">Enumerator</a></div>
-<div class="qindex"><a class="qindex" href="#index_a">a</a> | <a class="qindex" href="#index_c">c</a> | <a class="qindex" href="#index_d">d</a> | <a class="qindex" href="#index_g">g</a> | <a class="qindex" href="#index_i">i</a> | <a class="qindex" href="#index_l">l</a> | <a class="qindex" href="#index_m">m</a> | <a class="qindex" href="#index_n">n</a> | <a class="qindex" href="#index_o">o</a> | <a class="qindex" href="#index_p">p</a> | <a class="qindex" href="#index_r">r</a> | <a class="qindex" href="#index_s">s</a> | <a class="qindex" href="#index_t">t</a> | <a class="qindex" href="#index_u">u</a> | <a class="qindex" href="#index_w">w</a> | <a class="qindex" href="#index_~">~</a></div>
+<div class="qindex"><a class="qindex" href="#index_a">a</a> | <a class="qindex" href="#index_c">c</a> | <a class="qindex" href="#index_d">d</a> | <a class="qindex" href="#index_f">f</a> | <a class="qindex" href="#index_g">g</a> | <a class="qindex" href="#index_i">i</a> | <a class="qindex" href="#index_l">l</a> | <a class="qindex" href="#index_m">m</a> | <a class="qindex" href="#index_n">n</a> | <a class="qindex" href="#index_o">o</a> | <a class="qindex" href="#index_p">p</a> | <a class="qindex" href="#index_r">r</a> | <a class="qindex" href="#index_s">s</a> | <a class="qindex" href="#index_t">t</a> | <a class="qindex" href="#index_u">u</a> | <a class="qindex" href="#index_w">w</a> | <a class="qindex" href="#index_~">~</a></div>
 
 <p>
 Here is a list of all documented class members with links to the class documentation for each member:
 <p>
 <h3><a class="anchor" name="index_a">- a -</a></h3><ul>
 <li>abortStream()
-: <a class="el" href="classRtAudio.html#a15">RtAudio</a></ul>
+: <a class="el" href="classRtAudio.html#a11">RtAudio</a><li>Api
+: <a class="el" href="classRtAudio.html#w8">RtAudio</a></ul>
 <h3><a class="anchor" name="index_c">- c -</a></h3><ul>
-<li>cancelStreamCallback()
-: <a class="el" href="classRtAudio.html#a7">RtAudio</a><li>closeStream()
-: <a class="el" href="classRtAudio.html#a12">RtAudio</a></ul>
+<li>closeStream()
+: <a class="el" href="classRtAudio.html#a8">RtAudio</a></ul>
 <h3><a class="anchor" name="index_d">- d -</a></h3><ul>
-<li>DEBUG_WARNING
-: <a class="el" href="classRtError.html#w11w1">RtError</a><li>DRIVER_ERROR
-: <a class="el" href="classRtError.html#w11w8">RtError</a><li>duplexChannels
-: <a class="el" href="structRtAudioDeviceInfo.html#o4">RtAudioDeviceInfo</a></ul>
+<li>deviceId
+: <a class="el" href="structRtAudio_1_1StreamParameters.html#o0">RtAudio::StreamParameters</a><li>DRIVER_ERROR
+: <a class="el" href="classRtError.html#w9w6">RtError</a><li>duplexChannels
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o4">RtAudio::DeviceInfo</a></ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>firstChannel
+: <a class="el" href="structRtAudio_1_1StreamParameters.html#o2">RtAudio::StreamParameters</a><li>flags
+: <a class="el" href="structRtAudio_1_1StreamOptions.html#o0">RtAudio::StreamOptions</a></ul>
 <h3><a class="anchor" name="index_g">- g -</a></h3><ul>
-<li>getDeviceCount()
-: <a class="el" href="classRtAudio.html#a8">RtAudio</a><li>getDeviceInfo()
-: <a class="el" href="classRtAudio.html#a9">RtAudio</a><li>getMessage()
-: <a class="el" href="classRtError.html#a4">RtError</a><li>getMessageString()
-: <a class="el" href="classRtError.html#a5">RtError</a><li>getStreamBuffer()
-: <a class="el" href="classRtAudio.html#a10">RtAudio</a><li>getType()
+<li>getCompiledApi()
+: <a class="el" href="classRtAudio.html#e0">RtAudio</a><li>getCurrentApi()
+: <a class="el" href="classRtAudio.html#a2">RtAudio</a><li>getDefaultInputDevice()
+: <a class="el" href="classRtAudio.html#a6">RtAudio</a><li>getDefaultOutputDevice()
+: <a class="el" href="classRtAudio.html#a5">RtAudio</a><li>getDeviceCount()
+: <a class="el" href="classRtAudio.html#a3">RtAudio</a><li>getDeviceInfo()
+: <a class="el" href="classRtAudio.html#a4">RtAudio</a><li>getMessage()
+: <a class="el" href="classRtError.html#a4">RtError</a><li>getStreamLatency()
+: <a class="el" href="classRtAudio.html#a15">RtAudio</a><li>getStreamTime()
+: <a class="el" href="classRtAudio.html#a14">RtAudio</a><li>getType()
 : <a class="el" href="classRtError.html#a3">RtError</a></ul>
 <h3><a class="anchor" name="index_i">- i -</a></h3><ul>
 <li>inputChannels
-: <a class="el" href="structRtAudioDeviceInfo.html#o3">RtAudioDeviceInfo</a><li>INVALID_DEVICE
-: <a class="el" href="classRtError.html#w11w4">RtError</a><li>INVALID_PARAMETER
-: <a class="el" href="classRtError.html#w11w7">RtError</a><li>INVALID_STREAM
-: <a class="el" href="classRtError.html#w11w5">RtError</a><li>IRIX_AL
-: <a class="el" href="classRtAudio.html#w8w5">RtAudio</a><li>isDefault
-: <a class="el" href="structRtAudioDeviceInfo.html#o5">RtAudioDeviceInfo</a></ul>
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o3">RtAudio::DeviceInfo</a><li>INVALID_DEVICE
+: <a class="el" href="classRtError.html#w9w2">RtError</a><li>INVALID_PARAMETER
+: <a class="el" href="classRtError.html#w9w4">RtError</a><li>INVALID_USE
+: <a class="el" href="classRtError.html#w9w5">RtError</a><li>isDefaultInput
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o6">RtAudio::DeviceInfo</a><li>isDefaultOutput
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o5">RtAudio::DeviceInfo</a><li>isStreamOpen()
+: <a class="el" href="classRtAudio.html#a12">RtAudio</a><li>isStreamRunning()
+: <a class="el" href="classRtAudio.html#a13">RtAudio</a></ul>
 <h3><a class="anchor" name="index_l">- l -</a></h3><ul>
 <li>LINUX_ALSA
-: <a class="el" href="classRtAudio.html#w8w1">RtAudio</a><li>LINUX_JACK
-: <a class="el" href="classRtAudio.html#w8w3">RtAudio</a><li>LINUX_OSS
+: <a class="el" href="classRtAudio.html#w8w1">RtAudio</a><li>LINUX_OSS
 : <a class="el" href="classRtAudio.html#w8w2">RtAudio</a></ul>
 <h3><a class="anchor" name="index_m">- m -</a></h3><ul>
 <li>MACOSX_CORE
 : <a class="el" href="classRtAudio.html#w8w4">RtAudio</a><li>MEMORY_ERROR
-: <a class="el" href="classRtError.html#w11w6">RtError</a></ul>
+: <a class="el" href="classRtError.html#w9w3">RtError</a></ul>
 <h3><a class="anchor" name="index_n">- n -</a></h3><ul>
 <li>name
-: <a class="el" href="structRtAudioDeviceInfo.html#o0">RtAudioDeviceInfo</a><li>nativeFormats
-: <a class="el" href="structRtAudioDeviceInfo.html#o7">RtAudioDeviceInfo</a><li>NO_DEVICES_FOUND
-: <a class="el" href="classRtError.html#w11w3">RtError</a></ul>
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o1">RtAudio::DeviceInfo</a><li>nativeFormats
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o8">RtAudio::DeviceInfo</a><li>nChannels
+: <a class="el" href="structRtAudio_1_1StreamParameters.html#o1">RtAudio::StreamParameters</a><li>NO_DEVICES_FOUND
+: <a class="el" href="classRtError.html#w9w1">RtError</a><li>numberOfBuffers
+: <a class="el" href="structRtAudio_1_1StreamOptions.html#o1">RtAudio::StreamOptions</a></ul>
 <h3><a class="anchor" name="index_o">- o -</a></h3><ul>
 <li>openStream()
-: <a class="el" href="classRtAudio.html#a5">RtAudio</a><li>outputChannels
-: <a class="el" href="structRtAudioDeviceInfo.html#o2">RtAudioDeviceInfo</a></ul>
+: <a class="el" href="classRtAudio.html#a7">RtAudio</a><li>outputChannels
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o2">RtAudio::DeviceInfo</a></ul>
 <h3><a class="anchor" name="index_p">- p -</a></h3><ul>
 <li>printMessage()
 : <a class="el" href="classRtError.html#a2">RtError</a><li>probed
-: <a class="el" href="structRtAudioDeviceInfo.html#o1">RtAudioDeviceInfo</a></ul>
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o0">RtAudio::DeviceInfo</a></ul>
 <h3><a class="anchor" name="index_r">- r -</a></h3><ul>
 <li>RtAudio()
-: <a class="el" href="classRtAudio.html#a2">RtAudio</a><li>RtAudioApi
-: <a class="el" href="classRtAudio.html#w8">RtAudio</a><li>RtError()
+: <a class="el" href="classRtAudio.html#a0">RtAudio</a><li>RTAUDIO_DUMMY
+: <a class="el" href="classRtAudio.html#w8w7">RtAudio</a><li>RtError()
 : <a class="el" href="classRtError.html#a0">RtError</a></ul>
 <h3><a class="anchor" name="index_s">- s -</a></h3><ul>
 <li>sampleRates
-: <a class="el" href="structRtAudioDeviceInfo.html#o6">RtAudioDeviceInfo</a><li>setStreamCallback()
-: <a class="el" href="classRtAudio.html#a6">RtAudio</a><li>startStream()
-: <a class="el" href="classRtAudio.html#a13">RtAudio</a><li>stopStream()
-: <a class="el" href="classRtAudio.html#a14">RtAudio</a><li>SYSTEM_ERROR
-: <a class="el" href="classRtError.html#w11w9">RtError</a></ul>
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o7">RtAudio::DeviceInfo</a><li>showWarnings()
+: <a class="el" href="classRtAudio.html#a16">RtAudio</a><li>startStream()
+: <a class="el" href="classRtAudio.html#a9">RtAudio</a><li>stopStream()
+: <a class="el" href="classRtAudio.html#a10">RtAudio</a><li>streamName
+: <a class="el" href="structRtAudio_1_1StreamOptions.html#o2">RtAudio::StreamOptions</a><li>SYSTEM_ERROR
+: <a class="el" href="classRtError.html#w9w7">RtError</a></ul>
 <h3><a class="anchor" name="index_t">- t -</a></h3><ul>
 <li>THREAD_ERROR
-: <a class="el" href="classRtError.html#w11w10">RtError</a><li>tickStream()
-: <a class="el" href="classRtAudio.html#a11">RtAudio</a><li>Type
-: <a class="el" href="classRtError.html#w11">RtError</a></ul>
+: <a class="el" href="classRtError.html#w9w8">RtError</a><li>Type
+: <a class="el" href="classRtError.html#w9">RtError</a></ul>
 <h3><a class="anchor" name="index_u">- u -</a></h3><ul>
-<li>UNSPECIFIED
-: <a class="el" href="classRtError.html#w11w2">RtError</a>, <a class="el" href="classRtAudio.html#w8w0">RtAudio</a></ul>
+<li>UNIX_JACK
+: <a class="el" href="classRtAudio.html#w8w3">RtAudio</a><li>UNSPECIFIED
+: <a class="el" href="classRtError.html#w9w0">RtError</a>, <a class="el" href="classRtAudio.html#w8w0">RtAudio</a></ul>
 <h3><a class="anchor" name="index_w">- w -</a></h3><ul>
-<li>WARNING
-: <a class="el" href="classRtError.html#w11w0">RtError</a><li>WINDOWS_ASIO
-: <a class="el" href="classRtAudio.html#w8w6">RtAudio</a><li>WINDOWS_DS
-: <a class="el" href="classRtAudio.html#w8w7">RtAudio</a></ul>
+<li>what()
+: <a class="el" href="classRtError.html#a5">RtError</a><li>WINDOWS_ASIO
+: <a class="el" href="classRtAudio.html#w8w5">RtAudio</a><li>WINDOWS_DS
+: <a class="el" href="classRtAudio.html#w8w6">RtAudio</a></ul>
 <h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
 <li>~RtAudio()
-: <a class="el" href="classRtAudio.html#a3">RtAudio</a><li>~RtError()
+: <a class="el" href="classRtAudio.html#a1">RtAudio</a><li>~RtError()
 : <a class="el" href="classRtError.html#a1">RtError</a></ul>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index 66b9fa818edf1f5b8183050e5eef954497eae22b..1e61aa3e041f00610a33eedaf3bdc9ba4d303d97 100644 (file)
@@ -1,25 +1,25 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <div class="qindex"><a class="qindex" href="functions.html">All</a> | <a class="qindex" href="functions_func.html">Functions</a> | <a class="qindex" href="functions_vars.html">Variables</a> | <a class="qindexHL" href="functions_enum.html">Enumerations</a> | <a class="qindex" href="functions_eval.html">Enumerator</a></div>
 
 <p>
 <ul>
-<li>RtAudioApi
+<li>Api
 : <a class="el" href="classRtAudio.html#w8">RtAudio</a><li>Type
-: <a class="el" href="classRtError.html#w11">RtError</a></ul>
+: <a class="el" href="classRtError.html#w9">RtError</a></ul>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index be92deb65c76c39176cdc2fde6b6758f5d33a0ca..ffa73207f9e66cd70e2d4ec27f9485f76e17a51d 100644 (file)
@@ -1,41 +1,39 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <div class="qindex"><a class="qindex" href="functions.html">All</a> | <a class="qindex" href="functions_func.html">Functions</a> | <a class="qindex" href="functions_vars.html">Variables</a> | <a class="qindex" href="functions_enum.html">Enumerations</a> | <a class="qindexHL" href="functions_eval.html">Enumerator</a></div>
 
 <p>
 <ul>
-<li>DEBUG_WARNING
-: <a class="el" href="classRtError.html#w11w1">RtError</a><li>DRIVER_ERROR
-: <a class="el" href="classRtError.html#w11w8">RtError</a><li>INVALID_DEVICE
-: <a class="el" href="classRtError.html#w11w4">RtError</a><li>INVALID_PARAMETER
-: <a class="el" href="classRtError.html#w11w7">RtError</a><li>INVALID_STREAM
-: <a class="el" href="classRtError.html#w11w5">RtError</a><li>IRIX_AL
-: <a class="el" href="classRtAudio.html#w8w5">RtAudio</a><li>LINUX_ALSA
-: <a class="el" href="classRtAudio.html#w8w1">RtAudio</a><li>LINUX_JACK
-: <a class="el" href="classRtAudio.html#w8w3">RtAudio</a><li>LINUX_OSS
+<li>DRIVER_ERROR
+: <a class="el" href="classRtError.html#w9w6">RtError</a><li>INVALID_DEVICE
+: <a class="el" href="classRtError.html#w9w2">RtError</a><li>INVALID_PARAMETER
+: <a class="el" href="classRtError.html#w9w4">RtError</a><li>INVALID_USE
+: <a class="el" href="classRtError.html#w9w5">RtError</a><li>LINUX_ALSA
+: <a class="el" href="classRtAudio.html#w8w1">RtAudio</a><li>LINUX_OSS
 : <a class="el" href="classRtAudio.html#w8w2">RtAudio</a><li>MACOSX_CORE
 : <a class="el" href="classRtAudio.html#w8w4">RtAudio</a><li>MEMORY_ERROR
-: <a class="el" href="classRtError.html#w11w6">RtError</a><li>NO_DEVICES_FOUND
-: <a class="el" href="classRtError.html#w11w3">RtError</a><li>SYSTEM_ERROR
-: <a class="el" href="classRtError.html#w11w9">RtError</a><li>THREAD_ERROR
-: <a class="el" href="classRtError.html#w11w10">RtError</a><li>UNSPECIFIED
-: <a class="el" href="classRtError.html#w11w2">RtError</a>, <a class="el" href="classRtAudio.html#w8w0">RtAudio</a><li>WARNING
-: <a class="el" href="classRtError.html#w11w0">RtError</a><li>WINDOWS_ASIO
-: <a class="el" href="classRtAudio.html#w8w6">RtAudio</a><li>WINDOWS_DS
-: <a class="el" href="classRtAudio.html#w8w7">RtAudio</a></ul>
+: <a class="el" href="classRtError.html#w9w3">RtError</a><li>NO_DEVICES_FOUND
+: <a class="el" href="classRtError.html#w9w1">RtError</a><li>RTAUDIO_DUMMY
+: <a class="el" href="classRtAudio.html#w8w7">RtAudio</a><li>SYSTEM_ERROR
+: <a class="el" href="classRtError.html#w9w7">RtError</a><li>THREAD_ERROR
+: <a class="el" href="classRtError.html#w9w8">RtError</a><li>UNIX_JACK
+: <a class="el" href="classRtAudio.html#w8w3">RtAudio</a><li>UNSPECIFIED
+: <a class="el" href="classRtError.html#w9w0">RtError</a>, <a class="el" href="classRtAudio.html#w8w0">RtAudio</a><li>WINDOWS_ASIO
+: <a class="el" href="classRtAudio.html#w8w5">RtAudio</a><li>WINDOWS_DS
+: <a class="el" href="classRtAudio.html#w8w6">RtAudio</a></ul>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index 633c14eba925d4e9120c3d39d4fb870c81ad4d1e..23922913175e9468fdc5554f048d7826dde353d4 100644 (file)
@@ -1,11 +1,12 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <div class="qindex"><a class="qindex" href="functions.html">All</a> | <a class="qindexHL" href="functions_func.html">Functions</a> | <a class="qindex" href="functions_vars.html">Variables</a> | <a class="qindex" href="functions_enum.html">Enumerations</a> | <a class="qindex" href="functions_eval.html">Enumerator</a></div>
 <p>
 <ul>
 <li>abortStream()
-: <a class="el" href="classRtAudio.html#a15">RtAudio</a><li>cancelStreamCallback()
-: <a class="el" href="classRtAudio.html#a7">RtAudio</a><li>closeStream()
-: <a class="el" href="classRtAudio.html#a12">RtAudio</a><li>getDeviceCount()
-: <a class="el" href="classRtAudio.html#a8">RtAudio</a><li>getDeviceInfo()
-: <a class="el" href="classRtAudio.html#a9">RtAudio</a><li>getMessage()
-: <a class="el" href="classRtError.html#a4">RtError</a><li>getMessageString()
-: <a class="el" href="classRtError.html#a5">RtError</a><li>getStreamBuffer()
-: <a class="el" href="classRtAudio.html#a10">RtAudio</a><li>getType()
-: <a class="el" href="classRtError.html#a3">RtError</a><li>openStream()
-: <a class="el" href="classRtAudio.html#a5">RtAudio</a><li>printMessage()
+: <a class="el" href="classRtAudio.html#a11">RtAudio</a><li>closeStream()
+: <a class="el" href="classRtAudio.html#a8">RtAudio</a><li>getCompiledApi()
+: <a class="el" href="classRtAudio.html#e0">RtAudio</a><li>getCurrentApi()
+: <a class="el" href="classRtAudio.html#a2">RtAudio</a><li>getDefaultInputDevice()
+: <a class="el" href="classRtAudio.html#a6">RtAudio</a><li>getDefaultOutputDevice()
+: <a class="el" href="classRtAudio.html#a5">RtAudio</a><li>getDeviceCount()
+: <a class="el" href="classRtAudio.html#a3">RtAudio</a><li>getDeviceInfo()
+: <a class="el" href="classRtAudio.html#a4">RtAudio</a><li>getMessage()
+: <a class="el" href="classRtError.html#a4">RtError</a><li>getStreamLatency()
+: <a class="el" href="classRtAudio.html#a15">RtAudio</a><li>getStreamTime()
+: <a class="el" href="classRtAudio.html#a14">RtAudio</a><li>getType()
+: <a class="el" href="classRtError.html#a3">RtError</a><li>isStreamOpen()
+: <a class="el" href="classRtAudio.html#a12">RtAudio</a><li>isStreamRunning()
+: <a class="el" href="classRtAudio.html#a13">RtAudio</a><li>openStream()
+: <a class="el" href="classRtAudio.html#a7">RtAudio</a><li>printMessage()
 : <a class="el" href="classRtError.html#a2">RtError</a><li>RtAudio()
-: <a class="el" href="classRtAudio.html#a2">RtAudio</a><li>RtError()
-: <a class="el" href="classRtError.html#a0">RtError</a><li>setStreamCallback()
-: <a class="el" href="classRtAudio.html#a6">RtAudio</a><li>startStream()
-: <a class="el" href="classRtAudio.html#a13">RtAudio</a><li>stopStream()
-: <a class="el" href="classRtAudio.html#a14">RtAudio</a><li>tickStream()
-: <a class="el" href="classRtAudio.html#a11">RtAudio</a><li>~RtAudio()
-: <a class="el" href="classRtAudio.html#a3">RtAudio</a><li>~RtError()
+: <a class="el" href="classRtAudio.html#a0">RtAudio</a><li>RtError()
+: <a class="el" href="classRtError.html#a0">RtError</a><li>showWarnings()
+: <a class="el" href="classRtAudio.html#a16">RtAudio</a><li>startStream()
+: <a class="el" href="classRtAudio.html#a9">RtAudio</a><li>stopStream()
+: <a class="el" href="classRtAudio.html#a10">RtAudio</a><li>what()
+: <a class="el" href="classRtError.html#a5">RtError</a><li>~RtAudio()
+: <a class="el" href="classRtAudio.html#a1">RtAudio</a><li>~RtError()
 : <a class="el" href="classRtError.html#a1">RtError</a></ul>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
index 3096b37d9e1d21f9ed560ad0b1642bb433eae98f..2a1821967a9d5182b9e800bfe95dbaa7c5fa4060 100644 (file)
@@ -1,31 +1,38 @@
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
 <div class="qindex"><a class="qindex" href="functions.html">All</a> | <a class="qindex" href="functions_func.html">Functions</a> | <a class="qindexHL" href="functions_vars.html">Variables</a> | <a class="qindex" href="functions_enum.html">Enumerations</a> | <a class="qindex" href="functions_eval.html">Enumerator</a></div>
 
 <p>
 <ul>
-<li>duplexChannels
-: <a class="el" href="structRtAudioDeviceInfo.html#o4">RtAudioDeviceInfo</a><li>inputChannels
-: <a class="el" href="structRtAudioDeviceInfo.html#o3">RtAudioDeviceInfo</a><li>isDefault
-: <a class="el" href="structRtAudioDeviceInfo.html#o5">RtAudioDeviceInfo</a><li>name
-: <a class="el" href="structRtAudioDeviceInfo.html#o0">RtAudioDeviceInfo</a><li>nativeFormats
-: <a class="el" href="structRtAudioDeviceInfo.html#o7">RtAudioDeviceInfo</a><li>outputChannels
-: <a class="el" href="structRtAudioDeviceInfo.html#o2">RtAudioDeviceInfo</a><li>probed
-: <a class="el" href="structRtAudioDeviceInfo.html#o1">RtAudioDeviceInfo</a><li>sampleRates
-: <a class="el" href="structRtAudioDeviceInfo.html#o6">RtAudioDeviceInfo</a></ul>
+<li>deviceId
+: <a class="el" href="structRtAudio_1_1StreamParameters.html#o0">RtAudio::StreamParameters</a><li>duplexChannels
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o4">RtAudio::DeviceInfo</a><li>firstChannel
+: <a class="el" href="structRtAudio_1_1StreamParameters.html#o2">RtAudio::StreamParameters</a><li>flags
+: <a class="el" href="structRtAudio_1_1StreamOptions.html#o0">RtAudio::StreamOptions</a><li>inputChannels
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o3">RtAudio::DeviceInfo</a><li>isDefaultInput
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o6">RtAudio::DeviceInfo</a><li>isDefaultOutput
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o5">RtAudio::DeviceInfo</a><li>name
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o1">RtAudio::DeviceInfo</a><li>nativeFormats
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o8">RtAudio::DeviceInfo</a><li>nChannels
+: <a class="el" href="structRtAudio_1_1StreamParameters.html#o1">RtAudio::StreamParameters</a><li>numberOfBuffers
+: <a class="el" href="structRtAudio_1_1StreamOptions.html#o1">RtAudio::StreamOptions</a><li>outputChannels
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o2">RtAudio::DeviceInfo</a><li>probed
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o0">RtAudio::DeviceInfo</a><li>sampleRates
+: <a class="el" href="structRtAudio_1_1DeviceInfo.html#o7">RtAudio::DeviceInfo</a><li>streamName
+: <a class="el" href="structRtAudio_1_1StreamOptions.html#o2">RtAudio::StreamOptions</a></ul>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
diff --git a/doc/html/globals.html b/doc/html/globals.html
new file mode 100644 (file)
index 0000000..a63f84d
--- /dev/null
@@ -0,0 +1,28 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="qindex"><a class="qindexHL" href="globals.html">All</a> | <a class="qindex" href="globals_type.html">Typedefs</a></div>
+Here is a list of all documented file members with links to the documentation:
+<p>
+<ul>
+<li>RtAudioCallback
+: <a class="el" href="RtAudio_8h.html#a15">RtAudio.h</a><li>RtAudioFormat
+: <a class="el" href="RtAudio_8h.html#a1">RtAudio.h</a><li>RtAudioStreamFlags
+: <a class="el" href="RtAudio_8h.html#a8">RtAudio.h</a><li>RtAudioStreamStatus
+: <a class="el" href="RtAudio_8h.html#a12">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/globals_enum.html b/doc/html/globals_enum.html
new file mode 100644 (file)
index 0000000..340698c
--- /dev/null
@@ -0,0 +1,25 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Tutorial</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="qindex"><a class="qindex" href="globals.html">All</a> | <a class="qindex" href="globals_type.html">Typedefs</a> | <a class="qindexHL" href="globals_enum.html">Enumerations</a> | <a class="qindex" href="globals_eval.html">Enumerator</a></div>
+
+<p>
+<ul>
+<li>RtAudioApi
+: <a class="el" href="RtAudio_8h.html#a24">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;2001-2006 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>
+</HTML>
diff --git a/doc/html/globals_eval.html b/doc/html/globals_eval.html
new file mode 100644 (file)
index 0000000..94d360b
--- /dev/null
@@ -0,0 +1,33 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Tutorial</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="qindex"><a class="qindex" href="globals.html">All</a> | <a class="qindex" href="globals_type.html">Typedefs</a> | <a class="qindex" href="globals_enum.html">Enumerations</a> | <a class="qindexHL" href="globals_eval.html">Enumerator</a></div>
+
+<p>
+<ul>
+<li>IRIX_AL
+: <a class="el" href="RtAudio_8h.html#a24a20">RtAudio.h</a><li>LINUX_ALSA
+: <a class="el" href="RtAudio_8h.html#a24a16">RtAudio.h</a><li>LINUX_JACK
+: <a class="el" href="RtAudio_8h.html#a24a18">RtAudio.h</a><li>LINUX_OSS
+: <a class="el" href="RtAudio_8h.html#a24a17">RtAudio.h</a><li>MACOSX_CORE
+: <a class="el" href="RtAudio_8h.html#a24a19">RtAudio.h</a><li>RTAUDIO_DUMMY
+: <a class="el" href="RtAudio_8h.html#a24a23">RtAudio.h</a><li>UNSPECIFIED
+: <a class="el" href="RtAudio_8h.html#a24a15">RtAudio.h</a><li>WINDOWS_ASIO
+: <a class="el" href="RtAudio_8h.html#a24a21">RtAudio.h</a><li>WINDOWS_DS
+: <a class="el" href="RtAudio_8h.html#a24a22">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;2001-2006 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>
+</HTML>
diff --git a/doc/html/globals_type.html b/doc/html/globals_type.html
new file mode 100644 (file)
index 0000000..c2595f9
--- /dev/null
@@ -0,0 +1,28 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="qindex"><a class="qindex" href="globals.html">All</a> | <a class="qindexHL" href="globals_type.html">Typedefs</a></div>
+
+<p>
+<ul>
+<li>RtAudioCallback
+: <a class="el" href="RtAudio_8h.html#a15">RtAudio.h</a><li>RtAudioFormat
+: <a class="el" href="RtAudio_8h.html#a1">RtAudio.h</a><li>RtAudioStreamFlags
+: <a class="el" href="RtAudio_8h.html#a8">RtAudio.h</a><li>RtAudioStreamStatus
+: <a class="el" href="RtAudio_8h.html#a12">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
index 8cc5c2748fbff80199336b876fc5e221b175d69d..125e928c61722e9e5621b5310c37776d99512f0b 100644 (file)
 <HTML>
 <HEAD>
-<TITLE>The RtAudio Tutorial</TITLE>
+<TITLE>The RtAudio Home Page</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
-<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
 <HR>
 <!-- Generated by Doxygen 1.4.4 -->
-<h1>The <a class="el" href="classRtAudio.html">RtAudio</a> Tutorial </h1>
+<h1>The <a class="el" href="classRtAudio.html">RtAudio</a> Home Page </h1>
 <p>
-<center><a class="el" href="index.html#intro">Introduction</a> &nbsp;&nbsp; <a class="el" href="index.html#changes">What's New (Version 3.0)</a> &nbsp;&nbsp;<a class="el" href="index.html#download">Download</a> &nbsp;&nbsp; <a class="el" href="index.html#start">Getting Started</a> &nbsp;&nbsp; <a class="el" href="index.html#error">Error Handling</a> &nbsp;&nbsp; <a class="el" href="index.html#probing">Probing Device Capabilities</a> &nbsp;&nbsp; <a class="el" href="index.html#settings">Device Settings</a> &nbsp;&nbsp; <a class="el" href="index.html#playbackb">Playback (blocking functionality)</a> &nbsp;&nbsp; <a class="el" href="index.html#playbackc">Playback (callback functionality)</a> &nbsp;&nbsp; <a class="el" href="index.html#recording">Recording</a> &nbsp;&nbsp; <a class="el" href="index.html#duplex">Duplex Mode</a> &nbsp;&nbsp; <a class="el" href="index.html#multi">Using Simultaneous Multiple APIs</a> &nbsp;&nbsp; <a class="el" href="index.html#methods">Summary of Methods</a> &nbsp;&nbsp; <a class="el" href="index.html#compiling">Compiling</a> &nbsp;&nbsp; <a class="el" href="index.html#debug">Debugging</a> &nbsp;&nbsp; <a class="el" href="index.html#apinotes">API Notes</a> &nbsp;&nbsp; <a class="el" href="index.html#wishlist">Possible Future Changes</a> &nbsp;&nbsp; <a class="el" href="index.html#acknowledge">Acknowledgements</a> &nbsp;&nbsp; <a class="el" href="index.html#license">License</a></center><h2><a class="anchor" name="intro">
-Introduction</a></h2>
-<a class="el" href="classRtAudio.html">RtAudio</a> is a set of C++ classes which provide a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, JACK, and OSS), Macintosh OS X, SGI, and Windows (DirectSound and ASIO) operating systems. <a class="el" href="classRtAudio.html">RtAudio</a> significantly simplifies the process of interacting with computer audio hardware. It was designed with the following goals:<p>
+<h3 align="center">4.0 </h3><a class="el" href="classRtAudio.html">RtAudio</a> is a set of C++ classes that provide a common API (Application Programming Interface) for realtime audio input/output across Linux, Macintosh OS-X and Windows (DirectSound and ASIO) operating systems. <a class="el" href="classRtAudio.html">RtAudio</a> significantly simplifies the process of interacting with computer audio hardware. It was designed with the following objectives:<p>
 <ul>
 <li>
-object oriented C++ design </li>
+object-oriented C++ design </li>
 <li>
 simple, common API across all supported platforms </li>
 <li>
-only two header files and one source file for easy inclusion in programming projects </li>
+only one source and two header files for easy inclusion in programming projects </li>
 <li>
 allow simultaneous multi-api support </li>
 <li>
-blocking functionality </li>
+support dynamic connection of devices </li>
 <li>
-callback functionality </li>
+provide extensive audio device parameter control </li>
 <li>
-extensive audio device parameter control </li>
+allow audio device capability probing </li>
 <li>
-audio device capability probing </li>
-<li>
-automatic internal conversion for data format, channel number compensation, de-interleaving, and byte-swapping </li>
+automatic internal conversion for data format, channel number compensation, (de)interleaving, and byte-swapping </li>
 </ul>
 <p>
-<a class="el" href="classRtAudio.html">RtAudio</a> incorporates the concept of audio streams, which represent audio output (playback) and/or input (recording). Available audio devices and their capabilities can be enumerated and then specified when opening a stream. Where applicable, multiple API support can be compiled and a particular API specified when creating an <a class="el" href="classRtAudio.html">RtAudio</a> instance. See the <a class="el" href="index.html#apinotes">API Notes</a> section for information specific to each of the supported audio APIs.<p>
-The <a class="el" href="classRtAudio.html">RtAudio</a> API provides both blocking (synchronous) and callback (asynchronous) functionality. Callbacks are typically used in conjunction with graphical user interfaces (GUI). Blocking functionality is often necessary for explicit control of multiple input/output stream synchronization or when audio must be synchronized with other system events.<h2><a class="anchor" name="changes">
-What's New (Version 3.0)</a></h2>
-<a class="el" href="classRtAudio.html">RtAudio</a> now allows simultaneous multi-api support. For example, you can compile <a class="el" href="classRtAudio.html">RtAudio</a> to provide both DirectSound and ASIO support on Windows platforms or ALSA, JACK, and OSS support on Linux platforms. This was accomplished by creating an abstract base class, RtApi, with subclasses for each supported API (RtApiAlsa, RtApiJack, RtApiOss, RtApiDs, RtApiAsio, RtApiCore, and RtApiAl). The class <a class="el" href="classRtAudio.html">RtAudio</a> is now a "controller" which creates an instance of an RtApi subclass based on the user's API choice via an optional <a class="el" href="classRtAudio.html#w8">RtAudio::RtAudioApi</a> instantiation argument. If no API is specified, <a class="el" href="classRtAudio.html">RtAudio</a> attempts to make a "logical" API selection.<p>
-Support for the JACK low-latency audio server has been added with this version of <a class="el" href="classRtAudio.html">RtAudio</a>. It is necessary to have the JACK server running before creating an instance of <a class="el" href="classRtAudio.html">RtAudio</a>.<p>
-Several API changes have been made in version 3.0 of <a class="el" href="classRtAudio.html">RtAudio</a> in an effort to provide more consistent behavior across all supported audio APIs. The most significant of these changes is that multiple stream support from a single <a class="el" href="classRtAudio.html">RtAudio</a> instance has been discontinued. As a result, stream identifier input arguments are no longer required. Also, the RtAudio::streamWillBlock() function was poorly supported by most APIs and has been deprecated (though the function still exists in those subclasses of RtApi that do allow it to be implemented).<p>
-The <a class="el" href="classRtAudio.html#a9">RtAudio::getDeviceInfo()</a> function was modified to return a globally defined <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure. This structure is a simplified version of the previous RTAUDIO_DEVICE structure. In addition, the RTAUDIO_FORMAT structure was renamed RtAudioFormat and defined globally within <a class="el" href="RtAudio_8h-source.html">RtAudio.h</a>. These changes were made for clarity and to better conform with standard C++ programming practices.<p>
-The <a class="el" href="classRtError.html">RtError</a> class declaration and definition have been extracted to a separate file (<a class="el" href="RtError_8h-source.html">RtError.h</a>). This was done in preparation for a new release of the RtMidi class (planned for Summer 2004).<h2><a class="anchor" name="download">
-Download</a></h2>
-Latest Release (18 November 2005): <a href="http://music.mcgill.ca/~gary/rtaudio/release/rtaudio-3.0.3.tar.gz">Version 3.0.3</a><h2><a class="anchor" name="start">
-Getting Started</a></h2>
-With version 3.0, it is now possible to compile multiple API support on a given platform and to specify an API choice during class instantiation. In the examples that follow, no API will be specified (in which case, <a class="el" href="classRtAudio.html">RtAudio</a> attempts to select the most "logical" available API).<p>
-The first thing that must be done when using <a class="el" href="classRtAudio.html">RtAudio</a> is to create an instance of the class. The default constructor scans the underlying audio system to verify that at least one device is available. <a class="el" href="classRtAudio.html">RtAudio</a> often uses C++ exceptions to report errors, necessitating try/catch blocks around most member functions. The following code example demonstrates default object construction and destruction:<p>
-<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="keywordtype">int</span> main()
-{
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Default RtAudio constructor</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    <span class="comment">// Handle the exception here</span>
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-  }
-
-  <span class="comment">// Clean up</span>
-  <span class="keyword">delete</span> audio;
-}
-</pre></div><p>
-Obviously, this example doesn't demonstrate any of the real functionality of <a class="el" href="classRtAudio.html">RtAudio</a>. However, all uses of <a class="el" href="classRtAudio.html">RtAudio</a> must begin with a constructor (either default or overloaded varieties) and must end with class destruction. Further, it is necessary that all class methods that can throw a C++ exception be called within a try/catch block.<h2><a class="anchor" name="error">
-Error Handling</a></h2>
-<a class="el" href="classRtAudio.html">RtAudio</a> uses a C++ exception handler called <a class="el" href="classRtError.html">RtError</a>, which is declared and defined in <a class="el" href="RtError_8h-source.html">RtError.h</a>. The <a class="el" href="classRtError.html">RtError</a> class is quite simple but it does allow errors to be "caught" by <a class="el" href="classRtError.html#w11">RtError::Type</a>. Almost all <a class="el" href="classRtAudio.html">RtAudio</a> methods can "throw" an <a class="el" href="classRtError.html">RtError</a>, most typically if a driver error occurs or a stream function is called when no stream is open. There are a number of cases within <a class="el" href="classRtAudio.html">RtAudio</a> where warning messages may be displayed but an exception is not thrown. There is a protected <a class="el" href="classRtAudio.html">RtAudio</a> method, error(), that can be modified to globally control how these messages are handled and reported. By default, error messages are not automatically displayed in <a class="el" href="classRtAudio.html">RtAudio</a> unless the preprocessor definition __RTAUDIO_DEBUG__ is defined. Messages associated with caught exceptions can be displayed with, for example, the <a class="el" href="classRtError.html#a2">RtError::printMessage()</a> function.<h2><a class="anchor" name="probing">
-Probing Device Capabilities</a></h2>
-A programmer may wish to query the available audio device capabilities before deciding which to use. The following example outlines how this can be done.<p>
-<div class="fragment"><pre class="fragment"><span class="comment">// probe.cpp</span>
-
-<span class="preprocessor">#include &lt;iostream&gt;</span>
-<span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="keywordtype">int</span> main()
-{
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Default RtAudio constructor</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    exit(EXIT_FAILURE);
-  }
-
-  <span class="comment">// Determine the number of devices available</span>
-  <span class="keywordtype">int</span> devices = audio-&gt;<a class="code" href="classRtAudio.html#a8">getDeviceCount</a>();
-
-  <span class="comment">// Scan through devices for various capabilities</span>
-  <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> info;
-  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=1; i&lt;=devices; i++) {
-
-    <span class="keywordflow">try</span> {
-      info = audio-&gt;<a class="code" href="classRtAudio.html#a9">getDeviceInfo</a>(i);
-    }
-    <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-      error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-      <span class="keywordflow">break</span>;
-    }
-
-    <span class="comment">// Print, for example, the maximum number of output channels for each device</span>
-    std::cout &lt;&lt; <span class="stringliteral">"device = "</span> &lt;&lt; i;
-    std::cout &lt;&lt; <span class="stringliteral">": maximum output channels = "</span> &lt;&lt; info.<a class="code" href="structRtAudioDeviceInfo.html#o2">outputChannels</a> &lt;&lt; <span class="stringliteral">"\n"</span>;
-  }
-
-  <span class="comment">// Clean up</span>
-  <span class="keyword">delete</span> audio;
-
-  <span class="keywordflow">return</span> 0;
-}
-</pre></div><p>
-The <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure is defined in <a class="el" href="RtAudio_8h-source.html">RtAudio.h</a> and provides a variety of information useful in assessing the capabilities of a device:<p>
-<div class="fragment"><pre class="fragment">  <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a>{
-    std::string name;             <span class="comment">// Character string device identifier.</span>
-    <span class="keywordtype">bool</span> probed;                  <span class="comment">// true if the device capabilities were successfully probed.</span>
-    <span class="keywordtype">int</span> outputChannels;           <span class="comment">// Maximum output channels supported by device.</span>
-    <span class="keywordtype">int</span> inputChannels;            <span class="comment">// Maximum input channels supported by device.</span>
-    <span class="keywordtype">int</span> duplexChannels;           <span class="comment">// Maximum simultaneous input/output channels supported by device.</span>
-    <span class="keywordtype">bool</span> isDefault;               <span class="comment">// true if this is the default output or input device.</span>
-    std::vector&lt;int&gt; sampleRates; <span class="comment">// Supported sample rates.</span>
-    RtAudioFormat nativeFormats;  <span class="comment">// Bit mask of supported data formats.</span>
-  };
-</pre></div><p>
-The following data formats are defined and fully supported by <a class="el" href="classRtAudio.html">RtAudio</a>:<p>
-<div class="fragment"><pre class="fragment">  <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> RtAudioFormat;
-  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT8;   <span class="comment">// Signed 8-bit integer</span>
-  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT16;  <span class="comment">// Signed 16-bit integer</span>
-  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT24;  <span class="comment">// Signed 24-bit integer (upper 3 bytes of 32-bit signed integer.)</span>
-  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT32;  <span class="comment">// Signed 32-bit integer</span>
-  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_FLOAT32; <span class="comment">// 32-bit float normalized between +/- 1.0</span>
-  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_FLOAT64; <span class="comment">// 64-bit double normalized between +/- 1.0</span>
-</pre></div><p>
-The <em>nativeFormats</em> member of the <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure is a bit mask of the above formats that are natively supported by the device. However, <a class="el" href="classRtAudio.html">RtAudio</a> will automatically provide format conversion if a particular format is not natively supported. When the <em>probed</em> member of the <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure is false, the remaining structure members are undefined and the device is probably unuseable.<p>
-While some audio devices may require a minimum channel value greater than one, <a class="el" href="classRtAudio.html">RtAudio</a> will provide automatic channel number compensation when the number of channels set by the user is less than that required by the device. Channel compensation is <em>NOT</em> possible when the number of channels set by the user is greater than that supported by the device.<p>
-It should be noted that the capabilities reported by a device driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. For this reason, <a class="el" href="classRtAudio.html">RtAudio</a> does not typically rely on the queried values when attempting to open a stream.<h2><a class="anchor" name="settings">
-Device Settings</a></h2>
-The next step in using <a class="el" href="classRtAudio.html">RtAudio</a> is to open a stream with particular device and parameter settings.<p>
-<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="keywordtype">int</span> main()
-{
-  <span class="keywordtype">int</span> channels = 2;
-  <span class="keywordtype">int</span> sampleRate = 44100;
-  <span class="keywordtype">int</span> bufferSize = 256;  <span class="comment">// 256 sample frames</span>
-  <span class="keywordtype">int</span> nBuffers = 4;      <span class="comment">// number of internal buffers used by device</span>
-  <span class="keywordtype">int</span> device = 0;        <span class="comment">// 0 indicates the default or first available device</span>
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Instantiate RtAudio and open a stream within a try/catch block</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    exit(EXIT_FAILURE);
-  }
-
-  <span class="keywordflow">try</span> {
-    audio-&gt;<a class="code" href="classRtAudio.html#a4">openStream</a>(device, channels, 0, 0, RTAUDIO_FLOAT32,
-                      sampleRate, &amp;bufferSize, nBuffers);
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    <span class="comment">// Perhaps try other parameters?</span>
-  }
-
-  <span class="comment">// Clean up</span>
-  <span class="keyword">delete</span> audio;
-
-  <span class="keywordflow">return</span> 0;
-}
-</pre></div><p>
-The <a class="el" href="classRtAudio.html#a4">RtAudio::openStream()</a> method attempts to open a stream with a specified set of parameter values. In this case, we attempt to open a two channel playback stream with the default output device, 32-bit floating point data, a sample rate of 44100 Hz, a frame rate of 256 sample frames per read/write, and 4 internal device buffers. When device = 0, <a class="el" href="classRtAudio.html">RtAudio</a> first attempts to open the default audio device with the given parameters. If that attempt fails, <a class="el" href="classRtAudio.html">RtAudio</a> searches through the remaining available devices in an effort to find a device that will meet the given parameters. If all attempts are unsuccessful, an <a class="el" href="classRtError.html">RtError</a> is thrown. When a non-zero device value is specified, an attempt is made to open that device <em>ONLY</em> (device = 1 specifies the first identified device, as reported by <a class="el" href="classRtAudio.html#a9">RtAudio::getDeviceInfo()</a>).<p>
-<a class="el" href="classRtAudio.html">RtAudio</a> provides four signed integer and two floating point data formats that can be specified using the RtAudioFormat parameter values mentioned earlier. If the opened device does not natively support the given format, <a class="el" href="classRtAudio.html">RtAudio</a> will automatically perform the necessary data format conversion.<p>
-The <em>bufferSize</em> parameter specifies the desired number of sample frames that will be written to and/or read from a device per write/read operation. The <em>nBuffers</em> parameter is used in setting the underlying device buffer parameters. Both the <em>bufferSize</em> and <em>nBuffers</em> parameters can be used to control stream latency though there is no guarantee that the passed values will be those used by a device (the <em>nBuffers</em> parameter is ignored when using the OS X CoreAudio, Linux Jack, and the Windows ASIO APIs). In general, lower values for both parameters will produce less latency but perhaps less robust performance. Both parameters can be specified with values of zero, in which case the smallest allowable values will be used. The <em>bufferSize</em> parameter is passed as a pointer and the actual value used by the stream is set during the device setup procedure. <em>bufferSize</em> values should be a power of two. Optimal and allowable buffer values tend to vary between systems and devices. Check the <a class="el" href="index.html#apinotes">API Notes</a> section for general guidelines.<p>
-As noted earlier, the device capabilities reported by a driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. Because of this, <a class="el" href="classRtAudio.html">RtAudio</a> does not attempt to query a device's capabilities or use previously reported values when opening a device. Instead, <a class="el" href="classRtAudio.html">RtAudio</a> simply attempts to set the given parameters on a specified device and then checks whether the setup is successful or not.<h2><a class="anchor" name="playbackb">
-Playback (blocking functionality)</a></h2>
-Once the device is open for playback, there are only a few final steps necessary for realtime audio output. We'll first provide an example (blocking functionality) and then discuss the details.<p>
-<div class="fragment"><pre class="fragment"><span class="comment">// playback.cpp</span>
-
-<span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="keywordtype">int</span> main()
-{
-  <span class="keywordtype">int</span> count;
-  <span class="keywordtype">int</span> channels = 2;
-  <span class="keywordtype">int</span> sampleRate = 44100;
-  <span class="keywordtype">int</span> bufferSize = 256;  <span class="comment">// 256 sample frames</span>
-  <span class="keywordtype">int</span> nBuffers = 4;      <span class="comment">// number of internal buffers used by device</span>
-  <span class="keywordtype">float</span> *buffer;
-  <span class="keywordtype">int</span> device = 0;        <span class="comment">// 0 indicates the default or first available device</span>
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Open a stream during RtAudio instantiation</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>(device, channels, 0, 0, RTAUDIO_FLOAT32,
-                        sampleRate, &amp;bufferSize, nBuffers);
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    exit(EXIT_FAILURE);
-  }
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Get a pointer to the stream buffer</span>
-    buffer = (<span class="keywordtype">float</span> *) audio-&gt;<a class="code" href="classRtAudio.html#a10">getStreamBuffer</a>();
-
-    <span class="comment">// Start the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a13">startStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    <span class="keywordflow">goto</span> cleanup;
-  }
-
-  <span class="comment">// An example loop that runs for 40000 sample frames</span>
-  count = 0;
-  <span class="keywordflow">while</span> (count &lt; 40000) {
-    <span class="comment">// Generate your samples and fill the buffer with bufferSize sample frames of data</span>
-    ...
-
-    <span class="comment">// Trigger the output of the data buffer</span>
-    <span class="keywordflow">try</span> {
-      audio-&gt;<a class="code" href="classRtAudio.html#a11">tickStream</a>();
-    }
-    <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-      error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-      <span class="keywordflow">goto</span> cleanup;
-    }
-
-    count += bufferSize;
-  }
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Stop and close the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a14">stopStream</a>();
-    audio-&gt;<a class="code" href="classRtAudio.html#a12">closeStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-  }
-
- cleanup:
-  <span class="keyword">delete</span> audio;
-
-  <span class="keywordflow">return</span> 0;
-}
-</pre></div><p>
-The first thing to notice in this example is that we attempt to open a stream during class instantiation with an overloaded constructor. This constructor simply combines the functionality of the default constructor, used earlier, and the <a class="el" href="classRtAudio.html#a4">RtAudio::openStream()</a> method. Again, we have specified a device value of 0, indicating that the default or first available device meeting the given parameters should be used. An attempt is made to open the stream with the specified <em>bufferSize</em> value. However, it is possible that the device will not accept this value, in which case the closest allowable size is used and returned via the pointer value. The constructor can fail if no available devices are found, or a memory allocation or device driver error occurs. Note that you should not call the <a class="el" href="classRtAudio.html">RtAudio</a> destructor if an exception is thrown during instantiation.<p>
-Assuming the constructor is successful, it is necessary to get a pointer to the buffer, provided by <a class="el" href="classRtAudio.html">RtAudio</a>, for use in feeding data to/from the opened stream. Note that the user should <em>NOT</em> attempt to deallocate the stream buffer memory ... memory management for the stream buffer will be automatically controlled by <a class="el" href="classRtAudio.html">RtAudio</a>. After starting the stream with <a class="el" href="classRtAudio.html#a13">RtAudio::startStream()</a>, one simply fills that buffer, which is of length equal to the returned <em>bufferSize</em> value, with interleaved audio data (in the specified format) for playback. Finally, a call to the <a class="el" href="classRtAudio.html#a11">RtAudio::tickStream()</a> routine triggers a blocking write call for the stream.<p>
-In general, one should call the <a class="el" href="classRtAudio.html#a14">RtAudio::stopStream()</a> and <a class="el" href="classRtAudio.html#a12">RtAudio::closeStream()</a> methods after finishing with a stream. However, both methods will implicitly be called during object destruction if necessary.<h2><a class="anchor" name="playbackc">
-Playback (callback functionality)</a></h2>
-The primary difference in using <a class="el" href="classRtAudio.html">RtAudio</a> with callback functionality involves the creation of a user-defined callback function. Here is an example that produces a sawtooth waveform for playback.<p>
-<div class="fragment"><pre class="fragment"><span class="preprocessor">#include &lt;iostream&gt;</span>
-<span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="comment">// Two-channel sawtooth wave generator.</span>
-<span class="keywordtype">int</span> sawtooth(<span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> bufferSize, <span class="keywordtype">void</span> *data)
-{
-  <span class="keywordtype">int</span> i, j;
-  <span class="keywordtype">double</span> *my_buffer = (<span class="keywordtype">double</span> *) buffer;
-  <span class="keywordtype">double</span> *my_data = (<span class="keywordtype">double</span> *) data;
-
-  <span class="comment">// Write interleaved audio data.</span>
-  <span class="keywordflow">for</span> (i=0; i&lt;bufferSize; i++) {
-    <span class="keywordflow">for</span> (j=0; j&lt;2; j++) {
-      *my_buffer++ = my_data[j];
-
-      my_data[j] += 0.005 * (j+1+(j*0.1));
-      <span class="keywordflow">if</span> (my_data[j] &gt;= 1.0) my_data[j] -= 2.0;
-    }
-  }
-
-  <span class="keywordflow">return</span> 0;
-}
-
-<span class="keywordtype">int</span> main()
-{
-  <span class="keywordtype">int</span> channels = 2;
-  <span class="keywordtype">int</span> sampleRate = 44100;
-  <span class="keywordtype">int</span> bufferSize = 256;  <span class="comment">// 256 sample frames</span>
-  <span class="keywordtype">int</span> nBuffers = 4;      <span class="comment">// number of internal buffers used by device</span>
-  <span class="keywordtype">int</span> device = 0;        <span class="comment">// 0 indicates the default or first available device</span>
-  <span class="keywordtype">double</span> data[2];
-  <span class="keywordtype">char</span> input;
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Open a stream during RtAudio instantiation</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>(device, channels, 0, 0, RTAUDIO_FLOAT64,
-                        sampleRate, &amp;bufferSize, nBuffers);
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    exit(EXIT_FAILURE);
-  }
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Set the stream callback function</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a6">setStreamCallback</a>(&amp;sawtooth, (<span class="keywordtype">void</span> *)data);
-
-    <span class="comment">// Start the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a13">startStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    <span class="keywordflow">goto</span> cleanup;
-  }
-
-  std::cout &lt;&lt; <span class="stringliteral">"\nPlaying ... press &lt;enter&gt; to quit.\n"</span>;
-  std::cin.get(input);
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Stop and close the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a14">stopStream</a>();
-    audio-&gt;<a class="code" href="classRtAudio.html#a12">closeStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-  }
-
- cleanup:
-  <span class="keyword">delete</span> audio;
-
-  <span class="keywordflow">return</span> 0;
-}
-</pre></div><p>
-After opening the device in exactly the same way as the previous example (except with a data format change), we must set our callback function for the stream using <a class="el" href="classRtAudio.html#a6">RtAudio::setStreamCallback()</a>. When the underlying audio API uses blocking calls (OSS, ALSA, SGI, and Windows DirectSound), this method will spawn a new process (or thread) that automatically calls the callback function when more data is needed. Callback-based audio APIs (OS X CoreAudio Linux Jack, and ASIO) implement their own event notification schemes. Note that the callback function is called only when the stream is "running" (between calls to the <a class="el" href="classRtAudio.html#a13">RtAudio::startStream()</a> and <a class="el" href="classRtAudio.html#a14">RtAudio::stopStream()</a> methods). The last argument to <a class="el" href="classRtAudio.html#a6">RtAudio::setStreamCallback()</a> is a pointer to arbitrary data that you wish to access from within your callback function.<p>
-In this example, we stop the stream with an explicit call to <a class="el" href="classRtAudio.html#a14">RtAudio::stopStream()</a>. When using callback functionality, it is also possible to stop a stream by returning a non-zero value from the callback function.<p>
-Once set with <a class="el" href="classRtAudio.html#a6">RtAudio::setStreamCallback</a>, the callback process exists for the life of the stream (until the stream is closed with <a class="el" href="classRtAudio.html#a12">RtAudio::closeStream()</a> or the <a class="el" href="classRtAudio.html">RtAudio</a> instance is deleted). It is possible to disassociate a callback function and cancel its process for an open stream using the <a class="el" href="classRtAudio.html#a7">RtAudio::cancelStreamCallback()</a> method. The stream can then be used with blocking functionality or a new callback can be associated with it.<h2><a class="anchor" name="recording">
-Recording</a></h2>
-Using <a class="el" href="classRtAudio.html">RtAudio</a> for audio input is almost identical to the way it is used for playback. Here's the blocking playback example rewritten for recording:<p>
-<div class="fragment"><pre class="fragment"><span class="comment">// record.cpp</span>
-
-<span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="keywordtype">int</span> main()
-{
-  <span class="keywordtype">int</span> count;
-  <span class="keywordtype">int</span> channels = 2;
-  <span class="keywordtype">int</span> sampleRate = 44100;
-  <span class="keywordtype">int</span> bufferSize = 256;  <span class="comment">// 256 sample frames</span>
-  <span class="keywordtype">int</span> nBuffers = 4;      <span class="comment">// number of internal buffers used by device</span>
-  <span class="keywordtype">float</span> *buffer;
-  <span class="keywordtype">int</span> device = 0;        <span class="comment">// 0 indicates the default or first available device</span>
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Instantiate RtAudio and open a stream.</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>(&amp;stream, 0, 0, device, channels,
-                        RTAUDIO_FLOAT32, sampleRate, &amp;bufferSize, nBuffers);
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    exit(EXIT_FAILURE);
-  }
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Get a pointer to the stream buffer</span>
-    buffer = (<span class="keywordtype">float</span> *) audio-&gt;<a class="code" href="classRtAudio.html#a10">getStreamBuffer</a>();
-
-    <span class="comment">// Start the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a13">startStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    <span class="keywordflow">goto</span> cleanup;
-  }
-
-  <span class="comment">// An example loop that runs for about 40000 sample frames</span>
-  count = 0;
-  <span class="keywordflow">while</span> (count &lt; 40000) {
-
-    <span class="comment">// Read a buffer of data</span>
-    <span class="keywordflow">try</span> {
-      audio-&gt;<a class="code" href="classRtAudio.html#a11">tickStream</a>();
-    }
-    <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-      error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-      <span class="keywordflow">goto</span> cleanup;
-    }
-
-    <span class="comment">// Process the input samples (bufferSize sample frames) that were read</span>
-    ...
-
-    count += bufferSize;
-  }
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Stop the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a14">stopStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-  }
-
- cleanup:
-  <span class="keyword">delete</span> audio;
-
-  <span class="keywordflow">return</span> 0;
-}
-</pre></div><p>
-In this example, the stream was opened for recording with a non-zero <em>inputChannels</em> value. The only other difference between this example and that for playback involves the order of data processing in the loop, where it is necessary to first read a buffer of input data before manipulating it.<h2><a class="anchor" name="duplex">
-Duplex Mode</a></h2>
-Finally, it is easy to use <a class="el" href="classRtAudio.html">RtAudio</a> for simultaneous audio input/output, or duplex operation. In this example, we use a callback function and simply scale the input data before sending it back to the output.<p>
-<div class="fragment"><pre class="fragment"><span class="comment">// duplex.cpp</span>
-
-<span class="preprocessor">#include &lt;iostream&gt;</span>
-<span class="preprocessor">#include "RtAudio.h"</span>
-
-<span class="comment">// Pass-through function.</span>
-<span class="keywordtype">int</span> scale(<span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> bufferSize, <span class="keywordtype">void</span> *)
-{
-  <span class="comment">// Note: do nothing here for pass through.</span>
-  <span class="keywordtype">double</span> *my_buffer = (<span class="keywordtype">double</span> *) buffer;
-
-  <span class="comment">// Scale input data for output.</span>
-  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;bufferSize; i++) {
-    <span class="comment">// Do for two channels.</span>
-    *my_buffer++ *= 0.5;
-    *my_buffer++ *= 0.5;
-  }
-
-  <span class="keywordflow">return</span> 0;
-}
-
-<span class="keywordtype">int</span> main()
-{
-  <span class="keywordtype">int</span> channels = 2;
-  <span class="keywordtype">int</span> sampleRate = 44100;
-  <span class="keywordtype">int</span> bufferSize = 256;  <span class="comment">// 256 sample frames</span>
-  <span class="keywordtype">int</span> nBuffers = 4;      <span class="comment">// number of internal buffers used by device</span>
-  <span class="keywordtype">int</span> device = 0;        <span class="comment">// 0 indicates the default or first available device</span>
-  <span class="keywordtype">char</span> input;
-  <a class="code" href="classRtAudio.html">RtAudio</a> *audio = 0;
-
-  <span class="comment">// Open a stream during RtAudio instantiation</span>
-  <span class="keywordflow">try</span> {
-    audio = <span class="keyword">new</span> <a class="code" href="classRtAudio.html">RtAudio</a>(device, channels, device, channels, RTAUDIO_FLOAT64,
-                        sampleRate, &amp;bufferSize, nBuffers);
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    exit(EXIT_FAILURE);
-  }
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Set the stream callback function</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a6">setStreamCallback</a>(&amp;scale, NULL);
-
-    <span class="comment">// Start the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a13">startStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-    <span class="keywordflow">goto</span> cleanup;
-  }
-
-  std::cout &lt;&lt; <span class="stringliteral">"\nRunning duplex ... press &lt;enter&gt; to quit.\n"</span>;
-  std::cin.get(input);
-
-  <span class="keywordflow">try</span> {
-    <span class="comment">// Stop and close the stream</span>
-    audio-&gt;<a class="code" href="classRtAudio.html#a14">stopStream</a>();
-    audio-&gt;<a class="code" href="classRtAudio.html#a12">closeStream</a>();
-  }
-  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a> &amp;error) {
-    error.<a class="code" href="classRtError.html#a2">printMessage</a>();
-  }
-
- cleanup:
-  <span class="keyword">delete</span> audio;
-
-  <span class="keywordflow">return</span> 0;
-}
-</pre></div><p>
-When an <a class="el" href="classRtAudio.html">RtAudio</a> stream is running in duplex mode (nonzero input <em>AND</em> output channels), the audio write (playback) operation always occurs before the audio read (record) operation. This sequence allows the use of a single buffer to store both output and input data.<p>
-As we see with this example, the write-read sequence of operations does not preclude the use of <a class="el" href="classRtAudio.html">RtAudio</a> in situations where input data is first processed and then output through a duplex stream. When the stream buffer is first allocated, it is initialized with zeros, which produces no audible result when output to the device. In this example, anything recorded by the audio stream input will be scaled and played out during the next round of audio processing.<p>
-Note that duplex operation can also be achieved by opening one output stream instance and one input stream instance using the same or different devices. However, there may be timing problems when attempting to use two different devices, due to possible device clock variations, unless a common external "sync" is provided. This becomes even more difficult to achieve using two separate callback streams because it is not possible to <em>explicitly</em> control the calling order of the callback functions.<h2><a class="anchor" name="multi">
-Using Simultaneous Multiple APIs</a></h2>
-Because support for each audio API is encapsulated in a specific RtApi subclass, it is possible to compile and instantiate multiple API-specific subclasses on a given operating system. For example, one can compile both the RtApiDs and RtApiAsio classes on Windows operating systems by providing the appropriate preprocessor definitions, include files, and libraries for each. In a run-time situation, one might first attempt to determine whether any ASIO device drivers exist. This can be done by specifying the api argument <a class="el" href="classRtAudio.html#w8w6">RtAudio::WINDOWS_ASIO</a> when attempting to create an instance of <a class="el" href="classRtAudio.html">RtAudio</a>. If an <a class="el" href="classRtError.html">RtError</a> is thrown (indicating no available drivers), then an instance of <a class="el" href="classRtAudio.html">RtAudio</a> with the api argument <a class="el" href="classRtAudio.html#w8w7">RtAudio::WINDOWS_DS</a> can be created. Alternately, if no api argument is specified, <a class="el" href="classRtAudio.html">RtAudio</a> will first look for ASIO drivers and then DirectSound drivers (on Linux systems, the default API search order is Jack, Alsa, and finally OSS). In theory, it should also be possible to have separate instances of <a class="el" href="classRtAudio.html">RtAudio</a> open at the same time with different underlying audio API support, though this has not been tested. It is difficult to know how well different audio APIs can simultaneously coexist on a given operating system. In particular, it is most unlikely that the same device could be simultaneously controlled with two different audio APIs.<h2><a class="anchor" name="methods">
-Summary of Methods</a></h2>
-The following is a short summary of public methods (not including constructors and the destructor) provided by <a class="el" href="classRtAudio.html">RtAudio</a>:<p>
-<ul>
-<li>
-<a class="el" href="classRtAudio.html#a4">RtAudio::openStream()</a>: opens a stream with the specified parameters. </li>
-<li>
-<a class="el" href="classRtAudio.html#a6">RtAudio::setStreamCallback()</a>: sets a user-defined callback function for the stream. </li>
-<li>
-<a class="el" href="classRtAudio.html#a7">RtAudio::cancelStreamCallback()</a>: cancels a callback process and function for the stream. </li>
-<li>
-<a class="el" href="classRtAudio.html#a8">RtAudio::getDeviceCount()</a>: returns the number of audio devices available. </li>
-<li>
-<a class="el" href="classRtAudio.html#a9">RtAudio::getDeviceInfo()</a>: returns an <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> structure for a specified device. </li>
-<li>
-<a class="el" href="classRtAudio.html#a10">RtAudio::getStreamBuffer()</a>: returns a pointer to the stream buffer. </li>
-<li>
-<a class="el" href="classRtAudio.html#a11">RtAudio::tickStream()</a>: triggers processing of input/output data for the stream (blocking). </li>
-<li>
-<a class="el" href="classRtAudio.html#a12">RtAudio::closeStream()</a>: closes the stream (implicitly called during object destruction). </li>
-<li>
-<a class="el" href="classRtAudio.html#a13">RtAudio::startStream()</a>: (re)starts the stream, typically after it has been stopped with either stopStream() or abortStream() or after first opening the stream. </li>
-<li>
-<a class="el" href="classRtAudio.html#a14">RtAudio::stopStream()</a>: stops the stream, allowing any remaining samples in the queue to be played out and/or read in. This does not implicitly call <a class="el" href="classRtAudio.html#a12">RtAudio::closeStream()</a>. </li>
-<li>
-<a class="el" href="classRtAudio.html#a15">RtAudio::abortStream()</a>: stops the stream, discarding any remaining samples in the queue. This does not implicitly call closeStream(). </li>
-</ul>
-<h2><a class="anchor" name="compiling">
-Compiling</a></h2>
-In order to compile <a class="el" href="classRtAudio.html">RtAudio</a> for a specific OS and audio API, it is necessary to supply the appropriate preprocessor definition and library within the compiler statement: <p>
-<table border="2" cols="5" width="100%" cellspacing="3" cellpadding="3">
-<tr bgcolor="beige">
-<td width="5%"><b>OS:</b> </td><td width="5%"><b>Audio API:</b> </td><td width="5%"><b>C++ Class:</b> </td><td width="5%"><b>Preprocessor Definition:</b> </td><td width="5%"><b>Library or Framework:</b> </td><td><b>Example Compiler Statement:</b>  </td></tr>
-<tr>
-<td>Linux </td><td>ALSA </td><td>RtApiAlsa </td><td>__LINUX_ALSA__ </td><td><code>asound, pthread</code> </td><td><code>g++ -Wall -D__LINUX_ALSA__ -o probe probe.cpp RtAudio.cpp -lasound -lpthread</code>  </td></tr>
-<tr>
-<td>Linux </td><td>Jack Audio Server </td><td>RtApiJack </td><td>__LINUX_JACK__ </td><td><code>jack, pthread</code> </td><td><code>g++ -Wall -D__LINUX_JACK__ -o probe probe.cpp RtAudio.cpp `pkg-config --cflags --libs jack` -lpthread</code>  </td></tr>
-<tr>
-<td>Linux </td><td>OSS </td><td>RtApiOss </td><td>__LINUX_OSS__ </td><td><code>pthread</code> </td><td><code>g++ -Wall -D__LINUX_OSS__ -o probe probe.cpp RtAudio.cpp -lpthread</code>  </td></tr>
-<tr>
-<td>Macintosh OS X </td><td>CoreAudio </td><td>RtApiCore </td><td>__MACOSX_CORE__ </td><td><code>pthread, stdc++, CoreAudio</code> </td><td><code>g++ -Wall -D__MACOSX_CORE__ -o probe probe.cpp RtAudio.cpp -framework CoreAudio -lpthread</code>  </td></tr>
-<tr>
-<td>Irix </td><td>AL </td><td>RtApiAl </td><td>__IRIX_AL__ </td><td><code>audio, pthread</code> </td><td><code>CC -Wall -D__IRIX_AL__ -o probe probe.cpp RtAudio.cpp -laudio -lpthread</code>  </td></tr>
-<tr>
-<td>Windows </td><td>Direct Sound </td><td>RtApiDs </td><td>__WINDOWS_DS__ </td><td><code>dsound.lib (ver. 5.0 or higher), multithreaded</code> </td><td><em>compiler specific</em>  </td></tr>
-<tr>
-<td>Windows </td><td>ASIO </td><td>RtApiAsio </td><td>__WINDOWS_ASIO__ </td><td><em>various ASIO header and source files</em> </td><td><em>compiler specific</em>  </td></tr>
-</table>
+<a class="el" href="classRtAudio.html">RtAudio</a> incorporates the concept of audio streams, which represent audio output (playback) and/or input (recording). Available audio devices and their capabilities can be enumerated and then specified when opening a stream. Where applicable, multiple API support can be compiled and a particular API specified when creating an <a class="el" href="classRtAudio.html">RtAudio</a> instance. See the <a class="el" href="apinotes.html">API Notes</a> section for information specific to each of the supported audio APIs.<h2><a class="anchor" name="whatsnew">
+What's New (Version 4.0)</a></h2>
+<a class="el" href="classRtAudio.html">RtAudio</a> V4 represents a significant rewrite of the code and includes a number of API and functionality changes form previous versions. A partial list of the changes includes:<ul>
+<li>new support for non-interleaved user data</li><li>additional input/output parameter specifications, including channel offset</li><li>new support for dynamic connection of devices</li><li>new support for stream time</li><li>revised callback arguments, including separate input and output buffer arguments</li><li>revised C++ exception handling</li><li>updated support for OSS version 4.0</li><li>discontinued support of blocking functionality</li><li>discontinued support of SGI</li></ul>
 <p>
-The example compiler statements above could be used to compile the <code>probe.cpp</code> example file, assuming that <code>probe.cpp</code>, <code><a class="el" href="RtAudio_8h-source.html">RtAudio.h</a></code>, <code><a class="el" href="RtError_8h-source.html">RtError.h</a></code>, and <code>RtAudio.cpp</code> all exist in the same directory.<h2><a class="anchor" name="debug">
-Debugging</a></h2>
-If you are having problems getting <a class="el" href="classRtAudio.html">RtAudio</a> to run on your system, try passing the preprocessor definition <code>__RTAUDIO_DEBUG__</code> to the compiler (or uncomment the definition at the bottom of <a class="el" href="RtAudio_8h-source.html">RtAudio.h</a>). A variety of warning messages will be displayed that may help in determining the problem. Also try using the programs included in the <code>test</code> directory. The program <code>info</code> displays the queried capabilities of all hardware devices found.<h2><a class="anchor" name="apinotes">
-API Notes</a></h2>
-<a class="el" href="classRtAudio.html">RtAudio</a> is designed to provide a common API across the various supported operating systems and audio libraries. Despite that, some issues should be mentioned with regard to each.<h3><a class="anchor" name="linux">
-Linux:</a></h3>
-<a class="el" href="classRtAudio.html">RtAudio</a> for Linux was developed under Redhat distributions 7.0 - Fedora. Three different audio APIs are supported on Linux platforms: OSS, <a href="http://www.alsa-project.org/">ALSA</a>, and <a href="http://jackit.sourceforge.net/">Jack</a>. The OSS API has existed for at least 6 years and the Linux kernel is distributed with free versions of OSS audio drivers. Therefore, a generic Linux system is most likely to have OSS support (though the availability and quality of OSS drivers for new hardware is decreasing). The ALSA API, although relatively new, is now part of the Linux development kernel and offers significantly better functionality than the OSS API. <a class="el" href="classRtAudio.html">RtAudio</a> provides support for the 1.0 and higher versions of ALSA. Jack, which is still in development, is a low-latency audio server, written primarily for the GNU/Linux operating system. It can connect a number of different applications to an audio device, as well as allow them to share audio between themselves. Input/output latency on the order of 15 milliseconds can typically be achieved using any of the Linux APIs by fine-tuning the <a class="el" href="classRtAudio.html">RtAudio</a> buffer parameters (without kernel modifications). Latencies on the order of 5 milliseconds or less can be achieved using a low-latency kernel patch and increasing FIFO scheduling priority. The pthread library, which is used for callback functionality, is a standard component of all Linux distributions.<p>
-The ALSA library includes OSS emulation support. That means that you can run programs compiled for the OSS API even when using the ALSA drivers and library. It should be noted however that OSS emulation under ALSA is not perfect. Specifically, channel number queries seem to consistently produce invalid results. While OSS emulation is successful for the majority of <a class="el" href="classRtAudio.html">RtAudio</a> tests, it is recommended that the native ALSA implementation of <a class="el" href="classRtAudio.html">RtAudio</a> be used on systems that have ALSA drivers installed.<p>
-The ALSA implementation of <a class="el" href="classRtAudio.html">RtAudio</a> makes no use of the ALSA "plug" interface. All necessary data format conversions, channel compensation, de-interleaving, and byte-swapping is handled by internal <a class="el" href="classRtAudio.html">RtAudio</a> routines.<p>
-The Jack API is based on a callback scheme. <a class="el" href="classRtAudio.html">RtAudio</a> provides blocking functionality, in addition to callback functionality, within the context of that behavior. It should be noted, however, that the best performance is achieved when using RtAudio's callback functionality with the Jack API. At the moment, only one <a class="el" href="classRtAudio.html">RtAudio</a> instance can be connected to the Jack server. Because <a class="el" href="classRtAudio.html">RtAudio</a> does not provide a mechanism for allowing the user to specify particular channels (or ports) of a device, it simply opens the first <em>N</em> enumerated Jack ports for input/output.<h3><a class="anchor" name="macosx">
-Macintosh OS X (CoreAudio):</a></h3>
-The Apple CoreAudio API is based on a callback scheme. <a class="el" href="classRtAudio.html">RtAudio</a> provides blocking functionality, in addition to callback functionality, within the context of that behavior. CoreAudio is designed to use a separate callback procedure for each of its audio devices. A single <a class="el" href="classRtAudio.html">RtAudio</a> duplex stream using two different devices is supported, though it cannot be guaranteed to always behave correctly because we cannot synchronize these two callbacks. This same functionality might be achieved with better synchrony by creating separate instances of <a class="el" href="classRtAudio.html">RtAudio</a> for each device and making use of <a class="el" href="classRtAudio.html">RtAudio</a> blocking calls (i.e. <a class="el" href="classRtAudio.html#a11">RtAudio::tickStream()</a>). The <em>numberOfBuffers</em> parameter to the <a class="el" href="classRtAudio.html#a4">RtAudio::openStream()</a> function has no affect in this implementation.<p>
-It is not possible to have multiple instances of <a class="el" href="classRtAudio.html">RtAudio</a> accessing the same CoreAudio device.<h3><a class="anchor" name="irix">
-Irix (SGI):</a></h3>
-The Irix version of <a class="el" href="classRtAudio.html">RtAudio</a> was written and tested on an SGI Indy running Irix version 6.5.4 and the newer "al" audio library. <a class="el" href="classRtAudio.html">RtAudio</a> does not compile under Irix version 6.3, mainly because the C++ compiler is too old. Despite the relatively slow speed of the Indy, <a class="el" href="classRtAudio.html">RtAudio</a> was found to behave quite well and input/output latency was very good. No problems were found with respect to using the pthread library.<h3><a class="anchor" name="windowsds">
-Windows (DirectSound):</a></h3>
-In order to compile <a class="el" href="classRtAudio.html">RtAudio</a> under Windows for the DirectSound API, you must have the header and source files for DirectSound version 5.0 or higher. As far as I know, there is no DirectSoundCapture support for Windows NT. Audio output latency with DirectSound can be reasonably good, especially since <a class="el" href="classRtAudio.html">RtAudio</a> version 3.0.2. Input audio latency still tends to be bad but better since version 3.0.2. <a class="el" href="classRtAudio.html">RtAudio</a> was originally developed with Visual C++ version 6.0 but has been tested with .NET.<p>
-The DirectSound version of <a class="el" href="classRtAudio.html">RtAudio</a> can be compiled with or without the UNICODE preprocessor definition.<h3><a class="anchor" name="windowsasio">
-Windows (ASIO):</a></h3>
-The Steinberg ASIO audio API is based on a callback scheme. In addition, the API allows only a single device driver to be loaded and accessed at a time. ASIO device drivers must be supplied by audio hardware manufacturers, though ASIO emulation is possible on top of systems with DirectSound drivers. The <em>numberOfBuffers</em> parameter to the <a class="el" href="classRtAudio.html#a4">RtAudio::openStream()</a> function has no affect in this implementation.<p>
-A number of ASIO source and header files are required for use with <a class="el" href="classRtAudio.html">RtAudio</a>. Specifically, an <a class="el" href="classRtAudio.html">RtAudio</a> project must include the following files: <code>asio.h,cpp; asiodrivers.h,cpp; asiolist.h,cpp; asiodrvr.h; asiosys.h; ginclude.h; iasiodrv.h; iasiothiscallresolver.h,cpp</code>. The Visual C++ projects found in <code>/tests/Windows/</code> compile both ASIO and DirectSound support.<p>
-The Steinberg provided <code>asiolist</code> class does not compile when the preprocessor definition UNICODE is defined. Note that this could be an issue when using <a class="el" href="classRtAudio.html">RtAudio</a> with Qt, though Qt programs appear to compile without the UNICODE definition (try <code>DEFINES -= UNICODE</code> in your .pro file). <a class="el" href="classRtAudio.html">RtAudio</a> with ASIO support has been tested using the MinGW compiler under Windows XP, as well as in the Visual Studio environment.<h2><a class="anchor" name="wishlist">
-Possible Future Changes</a></h2>
-There are a few issues that still need to be addressed in future versions of <a class="el" href="classRtAudio.html">RtAudio</a>, including:<p>
-<ul>
-<li>
-Provide a mechanism so the user can "pre-fill" audio output buffers to allow precise measurement of an acoustic response; </li>
-<li>
-Allow the user to read / write non-interleaved data to / from the audio buffer; </li>
-<li>
-Further support in Windows OS for multi-channel (&gt;2) input / output. This is currently only possible with ASIO interface (in large part due to limitations with the DirectSound API). But perhaps a port to the WinMM API should be investigated? </li>
-<li>
-Investigate the possibility of allowing the user to select specific channels of a soundcard. For example, if an audio device supports 8 channels and the user wishes to send data out channels 7-8 only, it is currently necessary to open all 8 channels and write the two channels of output data to the correct positions in each audio frame of an interleaved data buffer. </li>
-</ul>
-<h2><a class="anchor" name="acknowledge">
-Acknowledgements</a></h2>
-Many thanks to the following people for providing bug fixes and improvements: <ul>
-<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>
-</ul>
-<p>
-The <a class="el" href="classRtAudio.html">RtAudio</a> API incorporates many of the concepts developed in the PortAudio project by Phil Burk and Ross Bencina. Early development also incorporated ideas from Bill Schottstaedt's sndlib. The CCRMA SoundWire group provided valuable feedback during the API proposal stages.<p>
-The early 2.0 version of <a class="el" href="classRtAudio.html">RtAudio</a> was slowly developed over the course of many months while in residence at the Institut Universitari de L'Audiovisual (IUA) in Barcelona, Spain and the Laboratory of Acoustics and Audio Signal Processing at the Helsinki University of Technology, Finland. Much subsequent development happened while working at the Center for Computer Research in Music and Acoustics (CCRMA) at Stanford University. The most recent version of <a class="el" href="classRtAudio.html">RtAudio</a> was finished while working as an assistant professor of <a href="http://www.music.mcgill.ca/musictech/">Music Technology</a> at <a href="http://www.mcgill.ca/">McGill University</a>. This work was supported in part by the United States Air Force Office of Scientific Research (grant #F49620-99-1-0293).<h2><a class="anchor" name="license">
-License</a></h2>
-<a class="el" href="classRtAudio.html">RtAudio</a>: a realtime audio i/o C++ classes<br>
- Copyright (c) 2001-2005 Gary P. Scavone<p>
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<p>
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>
-Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version.<p>
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. <HR>
+Devices are now re-enumerated every time the <a class="el" href="classRtAudio.html#a3">RtAudio::getDeviceCount()</a>, <a class="el" href="classRtAudio.html#a4">RtAudio::getDeviceInfo()</a>, and <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> functions are called. This allows for the proper identification of hot-pluggable (USB, Firewire, ...) devices while a given <a class="el" href="classRtAudio.html">RtAudio</a> instance exists.<h2><a class="anchor" name="download">
+Download</a></h2>
+Latest Release (7 August 2007): <a href="http://music.mcgill.ca/~gary/rtaudio/release/rtaudio-4.0.0.tar.gz">Version 4.0.0</a><h2><a class="anchor" name="documentation">
+Documentation Links</a></h2>
+<ol type=1>
+<li><a class="el" href="errors.html">Error Handling</a></li><li><a class="el" href="probe.html">Probing Device Capabilities</a></li><li><a class="el" href="settings.html">Device Settings</a></li><li><a class="el" href="playback.html">Playback</a></li><li><a class="el" href="recording.html">Recording</a></li><li><a class="el" href="duplex.html">Duplex Mode</a></li><li><a class="el" href="multi.html">Using Simultaneous Multiple APIs</a></li><li><a class="el" href="compiling.html">Debugging &amp; Compiling</a></li><li><a class="el" href="apinotes.html">API Notes</a></li><li><a class="el" href="acknowledge.html">Acknowledgements</a></li><li><a class="el" href="license.html">License</a></li><li><a href="bugs.html">Bug Tracker</a></li><li><a href="updates.html">Possible Updates</a></li><li><a href="http://sourceforge.net/projects/rtaudio">RtAudio at SourceForge</a> </li></ol>
+<HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;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>
 </table>
 
 </BODY>
diff --git a/doc/html/license.html b/doc/html/license.html
new file mode 100644 (file)
index 0000000..82bc787
--- /dev/null
@@ -0,0 +1,24 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="license">License</a></h1><a class="el" href="classRtAudio.html">RtAudio</a>: a set of realtime audio i/o C++ classes<br>
+ Copyright (c) 2001-2007 Gary P. Scavone<p>
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<p>
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>
+Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.<p>
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/multi.html b/doc/html/multi.html
new file mode 100644 (file)
index 0000000..371aa8a
--- /dev/null
@@ -0,0 +1,20 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="multi">Using Simultaneous Multiple APIs</a></h1>Because support for each audio API is encapsulated in a specific RtApi subclass, it is possible to compile and instantiate multiple API-specific subclasses on a given operating system. For example, one can compile both the RtApiDs and RtApiAsio classes on Windows operating systems by providing the appropriate preprocessor definitions, include files, and libraries for each. In a run-time situation, one might first attempt to determine whether any ASIO device drivers exist. This can be done by specifying the api argument <a class="el" href="classRtAudio.html#w8w5">RtAudio::WINDOWS_ASIO</a> when attempting to create an instance of <a class="el" href="classRtAudio.html">RtAudio</a>. If no available devices are found, then an instance of <a class="el" href="classRtAudio.html">RtAudio</a> with the api argument <a class="el" href="classRtAudio.html#w8w6">RtAudio::WINDOWS_DS</a> can be created. Alternately, if no api argument is specified, <a class="el" href="classRtAudio.html">RtAudio</a> will first look for an ASIO instance and then a DirectSound instance (on Linux systems, the default API search order is Jack, Alsa, and finally OSS). In theory, it should also be possible to have separate instances of <a class="el" href="classRtAudio.html">RtAudio</a> open at the same time with different underlying audio API support, though this has not been tested. It is difficult to know how well different audio APIs can simultaneously coexist on a given operating system. In particular, it is unlikely that the same device could be simultaneously controlled with two different audio APIs.<p>
+The static function <a class="el" href="classRtAudio.html#e0">RtAudio::getCompiledApi()</a> is provided to determine the available compiled API support. The function <a class="el" href="classRtAudio.html#a2">RtAudio::getCurrentApi()</a> indicates the API selected for a given <a class="el" href="classRtAudio.html">RtAudio</a> instance. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/pages.html b/doc/html/pages.html
new file mode 100644 (file)
index 0000000..3f9ce29
--- /dev/null
@@ -0,0 +1,43 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudio Related Pages</h1>Here is a list of all related documentation pages:<ul>
+<li><a class="el" href="acknowledge.html">Acknowledgements</a>
+
+<li><a class="el" href="apinotes.html">API Notes</a>
+
+<li><a class="el" href="compiling.html">Debugging &amp; Compiling</a>
+
+<li><a class="el" href="duplex.html">Duplex Mode</a>
+
+<li><a class="el" href="errors.html">Error Handling</a>
+
+<li><a class="el" href="license.html">License</a>
+
+<li><a class="el" href="multi.html">Using Simultaneous Multiple APIs</a>
+
+<li><a class="el" href="playback.html">Playback</a>
+
+<li><a class="el" href="probe.html">Probing Device Capabilities</a>
+
+<li><a class="el" href="recording.html">Recording</a>
+
+<li><a class="el" href="settings.html">Device Settings</a>
+
+</ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/playback.html b/doc/html/playback.html
new file mode 100644 (file)
index 0000000..9a7e918
--- /dev/null
@@ -0,0 +1,91 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="playback">Playback</a></h1>In this example, we provide a complete program that demonstrates the use of <a class="el" href="classRtAudio.html">RtAudio</a> for audio playback. Our program produces a two-channel sawtooth waveform for output.<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "<a class="code" href="RtAudio_8h.html">RtAudio.h</a>"</span>
+<span class="preprocessor">#include &lt;iostream&gt;</span>
+
+<span class="comment">// Two-channel sawtooth wave generator.</span>
+<span class="keywordtype">int</span> saw( <span class="keywordtype">void</span> *outputBuffer, <span class="keywordtype">void</span> *inputBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBufferFrames,
+         <span class="keywordtype">double</span> streamTime, <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> status, <span class="keywordtype">void</span> *userData )
+{
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, j;
+  <span class="keywordtype">double</span> *buffer = (<span class="keywordtype">double</span> *) outputBuffer;
+  <span class="keywordtype">double</span> *lastValues = (<span class="keywordtype">double</span> *) userData;
+
+  <span class="keywordflow">if</span> ( status )
+    std::cout &lt;&lt; <span class="stringliteral">"Stream underflow detected!"</span> &lt;&lt; std::endl;
+
+  <span class="comment">// Write interleaved audio data.</span>
+  <span class="keywordflow">for</span> ( i=0; i&lt;nBufferFrames; i++ ) {
+    <span class="keywordflow">for</span> ( j=0; j&lt;2; j++ ) {
+      *buffer++ = lastValues[j];
+
+      lastValues[j] += 0.005 * (j+1+(j*0.1));
+      <span class="keywordflow">if</span> ( lastValues[j] &gt;= 1.0 ) lastValues[j] -= 2.0;
+    }
+  }
+
+  <span class="keywordflow">return</span> 0;
+}
+
+<span class="keywordtype">int</span> main()
+{
+  <a class="code" href="classRtAudio.html">RtAudio</a> dac;
+  <span class="keywordflow">if</span> ( dac.<a class="code" href="classRtAudio.html#a3">getDeviceCount</a>() &lt; 1 ) {
+    std::cout &lt;&lt; <span class="stringliteral">"\nNo audio devices found!\n"</span>;
+    exit( 0 );
+  }
+
+  <a class="code" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> parameters;
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a> = dac.<a class="code" href="classRtAudio.html#a5">getDefaultOutputDevice</a>();
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a> = 2;
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o2">firstChannel</a> = 0;
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate = 44100;
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 256; <span class="comment">// 256 sample frames</span>
+  <span class="keywordtype">double</span> data[2];
+
+  <span class="keywordflow">try</span> {
+    dac.<a class="code" href="classRtAudio.html#a7">openStream</a>( &amp;parameters, NULL, RTAUDIO_FLOAT64,
+                    sampleRate, &amp;bufferFrames, &amp;saw, (<span class="keywordtype">void</span> *)&amp;data );
+    dac.<a class="code" href="classRtAudio.html#a9">startStream</a>();
+  }
+  <span class="keywordflow">catch</span> ( <a class="code" href="classRtError.html">RtError</a>&amp; e ) {
+    e.<a class="code" href="classRtError.html#a2">printMessage</a>();
+    exit( 0 );
+  }
+  
+  <span class="keywordtype">char</span> input;
+  std::cout &lt;&lt; <span class="stringliteral">"\nPlaying ... press &lt;enter&gt; to quit.\n"</span>;
+  std::cin.get( input );
+
+  <span class="keywordflow">try</span> {
+    <span class="comment">// Stop the stream</span>
+    dac.<a class="code" href="classRtAudio.html#a10">stopStream</a>();
+  }
+  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a>&amp; e) {
+    e.<a class="code" href="classRtError.html#a2">printMessage</a>();
+  }
+
+  <span class="keywordflow">if</span> ( dac.<a class="code" href="classRtAudio.html#a12">isStreamOpen</a>() ) dac.<a class="code" href="classRtAudio.html#a8">closeStream</a>();
+
+  <span class="keywordflow">return</span> 0;
+}
+</pre></div><p>
+We open the stream in exactly the same way as the previous example (except with a data format change) and specify the address of our callback function <em>"saw()"</em>. The callback function will automatically be invoked when the underlying audio system needs data for output. Note that the callback function is called only when the stream is "running" (between calls to the <a class="el" href="classRtAudio.html#a9">RtAudio::startStream()</a> and <a class="el" href="classRtAudio.html#a10">RtAudio::stopStream()</a> functions). We can also pass a pointer value to the <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> function that is made available in the callback function. In this way, it is possible to gain access to arbitrary data created in our <em>main()</em> function from within the globally defined callback function.<p>
+In this example, we stop the stream with an explicit call to <a class="el" href="classRtAudio.html#a10">RtAudio::stopStream()</a>. It is also possible to stop a stream by returning a non-zero value from the callback function. A return value of 1 will cause the stream to finish draining its internal buffers and then halt (equivalent to calling the <a class="el" href="classRtAudio.html#a10">RtAudio::stopStream()</a> function). A return value of 2 will cause the stream to stop immediately (equivalent to calling the <a class="el" href="classRtAudio.html#a11">RtAudio::abortStream()</a> function). <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/probe.html b/doc/html/probe.html
new file mode 100644 (file)
index 0000000..245a7c3
--- /dev/null
@@ -0,0 +1,72 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="probe">Probing Device Capabilities</a></h1>A programmer may wish to query the available audio device capabilities before deciding which to use. The following example outlines how this can be done.<p>
+<div class="fragment"><pre class="fragment"><span class="comment">// probe.cpp</span>
+
+<span class="preprocessor">#include &lt;iostream&gt;</span>
+<span class="preprocessor">#include "<a class="code" href="RtAudio_8h.html">RtAudio.h</a>"</span>
+
+<span class="keywordtype">int</span> main()
+{
+  <a class="code" href="classRtAudio.html">RtAudio</a> audio;
+
+  <span class="comment">// Determine the number of devices available</span>
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> devices = audio.<a class="code" href="classRtAudio.html#a3">getDeviceCount</a>();
+
+  <span class="comment">// Scan through devices for various capabilities</span>
+  <a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> info;
+  <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=1; i&lt;=devices; i++ ) {
+
+    info = audio.<a class="code" href="classRtAudio.html#a4">getDeviceInfo</a>( i );
+
+    <span class="keywordflow">if</span> ( info.<a class="code" href="structRtAudio_1_1DeviceInfo.html#o0">probed</a> == <span class="keyword">true</span> ) {
+      <span class="comment">// Print, for example, the maximum number of output channels for each device</span>
+      std::cout &lt;&lt; <span class="stringliteral">"device = "</span> &lt;&lt; i;
+      std::cout &lt;&lt; <span class="stringliteral">": maximum output channels = "</span> &lt;&lt; info.<a class="code" href="structRtAudio_1_1DeviceInfo.html#o2">outputChannels</a> &lt;&lt; <span class="stringliteral">"\n"</span>;
+    }
+  }
+
+  <span class="keywordflow">return</span> 0;
+}
+</pre></div><p>
+The <a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> structure is defined in <a class="el" href="RtAudio_8h.html">RtAudio.h</a> and provides a variety of information useful in assessing the capabilities of a device:<p>
+<div class="fragment"><pre class="fragment">  <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> {
+    <span class="keywordtype">bool</span> probed;                  <span class="comment">// true if the device capabilities were successfully probed.</span>
+    std::string name;             <span class="comment">// Character string device identifier.</span>
+    <span class="keywordtype">int</span> outputChannels;           <span class="comment">// Maximum output channels supported by device.</span>
+    <span class="keywordtype">int</span> inputChannels;            <span class="comment">// Maximum input channels supported by device.</span>
+    <span class="keywordtype">int</span> duplexChannels;           <span class="comment">// Maximum simultaneous input/output channels supported by device.</span>
+    <span class="keywordtype">bool</span> isDefaultOutput;         <span class="comment">// true if this is the default output device.</span>
+    <span class="keywordtype">bool</span> isDefaultInput;          <span class="comment">// true if this is the default input device.</span>
+    std::vector&lt;int&gt; sampleRates; <span class="comment">// Supported sample rates.</span>
+    <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> nativeFormats;  <span class="comment">// Bit mask of supported data formats.</span>
+  };
+</pre></div><p>
+The following data formats are defined and fully supported by <a class="el" href="classRtAudio.html">RtAudio</a>:<p>
+<div class="fragment"><pre class="fragment">  <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a>;
+  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT8;   <span class="comment">// Signed 8-bit integer</span>
+  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT16;  <span class="comment">// Signed 16-bit integer</span>
+  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT24;  <span class="comment">// Signed 24-bit integer (lower 3 bytes of 32-bit signed integer.)</span>
+  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_SINT32;  <span class="comment">// Signed 32-bit integer</span>
+  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_FLOAT32; <span class="comment">// 32-bit float normalized between +/- 1.0</span>
+  <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat  RTAUDIO_FLOAT64; <span class="comment">// 64-bit double normalized between +/- 1.0</span>
+</pre></div><p>
+The <code>nativeFormats</code> member of the <a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> structure is a bit mask of the above formats which are natively supported by the device. However, <a class="el" href="classRtAudio.html">RtAudio</a> will automatically provide format conversion if a particular format is not natively supported. When the <code>probed</code> member of the <a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a> structure is false, the remaining structure members are undefined and the device is probably unusable.<p>
+Some audio devices may require a minimum channel value greater than one. <a class="el" href="classRtAudio.html">RtAudio</a> will provide automatic channel number compensation when the number of channels set by the user is less than that required by the device. Channel compensation is <em>NOT</em> possible when the number of channels set by the user is greater than that supported by the device.<p>
+It should be noted that the capabilities reported by a device driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. For this reason, <a class="el" href="classRtAudio.html">RtAudio</a> does not rely on the queried values when attempting to open a stream. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/recording.html b/doc/html/recording.html
new file mode 100644 (file)
index 0000000..47c0178
--- /dev/null
@@ -0,0 +1,76 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="recording">Recording</a></h1>Using <a class="el" href="classRtAudio.html">RtAudio</a> for audio input is almost identical to the way it is used for playback. Here's the blocking playback example rewritten for recording:<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "<a class="code" href="RtAudio_8h.html">RtAudio.h</a>"</span>
+<span class="preprocessor">#include &lt;iostream&gt;</span>
+
+<span class="keywordtype">int</span> record( <span class="keywordtype">void</span> *outputBuffer, <span class="keywordtype">void</span> *inputBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBufferFrames,
+         <span class="keywordtype">double</span> streamTime, <a class="code" href="RtAudio_8h.html#a12">RtAudioStreamStatus</a> status, <span class="keywordtype">void</span> *userData )
+{
+  <span class="keywordflow">if</span> ( status )
+    std::cout &lt;&lt; <span class="stringliteral">"Stream overflow detected!"</span> &lt;&lt; std::endl;
+
+  <span class="comment">// Do something with the data in the "inputBuffer" buffer.</span>
+
+  <span class="keywordflow">return</span> 0;
+}
+
+<span class="keywordtype">int</span> main()
+{
+  <a class="code" href="classRtAudio.html">RtAudio</a> adc;
+  <span class="keywordflow">if</span> ( adc.<a class="code" href="classRtAudio.html#a3">getDeviceCount</a>() &lt; 1 ) {
+    std::cout &lt;&lt; <span class="stringliteral">"\nNo audio devices found!\n"</span>;
+    exit( 0 );
+  }
+
+  <a class="code" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> parameters;
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a> = adc.<a class="code" href="classRtAudio.html#a6">getDefaultInputDevice</a>();
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a> = 2;
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o2">firstChannel</a> = 0;
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate = 44100;
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 256; <span class="comment">// 256 sample frames</span>
+
+  <span class="keywordflow">try</span> {
+    adc.<a class="code" href="classRtAudio.html#a7">openStream</a>( NULL, &amp;parameters, RTAUDIO_SINT16,
+                    sampleRate, &amp;bufferFrames, &amp;record );
+    adc.<a class="code" href="classRtAudio.html#a9">startStream</a>();
+  }
+  <span class="keywordflow">catch</span> ( <a class="code" href="classRtError.html">RtError</a>&amp; e ) {
+    e.<a class="code" href="classRtError.html#a2">printMessage</a>();
+    exit( 0 );
+  }
+  
+  <span class="keywordtype">char</span> input;
+  std::cout &lt;&lt; <span class="stringliteral">"\nRecording ... press &lt;enter&gt; to quit.\n"</span>;
+  std::cin.get( input );
+
+  <span class="keywordflow">try</span> {
+    <span class="comment">// Stop the stream</span>
+    adc.<a class="code" href="classRtAudio.html#a10">stopStream</a>();
+  }
+  <span class="keywordflow">catch</span> (<a class="code" href="classRtError.html">RtError</a>&amp; e) {
+    e.<a class="code" href="classRtError.html#a2">printMessage</a>();
+  }
+
+  <span class="keywordflow">if</span> ( adc.<a class="code" href="classRtAudio.html#a12">isStreamOpen</a>() ) adc.<a class="code" href="classRtAudio.html#a8">closeStream</a>();
+
+  <span class="keywordflow">return</span> 0;
+}
+</pre></div><p>
+In this example, we pass the address of the stream parameter structure as the second argument of the <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> function and pass a NULL value for the output stream parameters. In this example, the <em>record()</em> callback function performs no specific operations. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/settings.html b/doc/html/settings.html
new file mode 100644 (file)
index 0000000..a95ad8d
--- /dev/null
@@ -0,0 +1,53 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1><a class="anchor" name="settings">Device Settings</a></h1>The next step in using <a class="el" href="classRtAudio.html">RtAudio</a> is to open a stream with particular device and parameter settings.<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "<a class="code" href="RtAudio_8h.html">RtAudio.h</a>"</span>
+
+<span class="keywordtype">int</span> main()
+{
+  <a class="code" href="classRtAudio.html">RtAudio</a> dac;
+  <span class="keywordflow">if</span> ( dac.<a class="code" href="classRtAudio.html#a3">getDeviceCount</a>() == 0 ) exit( 0 );
+
+  <a class="code" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a> parameters;
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a> = dac.<a class="code" href="classRtAudio.html#a5">getDefaultOutputDevice</a>();
+  parameters.<a class="code" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a> = 2;
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate = 44100;
+  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 256; <span class="comment">// 256 sample frames</span>
+
+  <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> options;
+  options.<a class="code" href="structRtAudio_1_1StreamOptions.html#o0">flags</a> = RTAUDIO_NONINTERLEAVED;
+
+  <span class="keywordflow">try</span> {
+    dac.<a class="code" href="classRtAudio.html#a7">openStream</a>( &amp;parameters, NULL, RTAUDIO_FLOAT32,
+                    sampleRate, &amp;bufferFrames, &amp;myCallback, NULL, &amp;options );
+  }
+  <span class="keywordflow">catch</span> ( <a class="code" href="classRtError.html">RtError</a>&amp; e ) {
+    std::cout &lt;&lt; <span class="charliteral">'\n'</span> &lt;&lt; e.<a class="code" href="classRtError.html#a4">getMessage</a>() &lt;&lt; <span class="charliteral">'\n'</span> &lt;&lt; std::endl;
+    exit( 0 );
+  }
+  
+  <span class="keywordflow">return</span> 0;
+}
+</pre></div><p>
+The <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> function attempts to open a stream with a specified set of parameter values. In the above example, we attempt to open a two channel playback stream using the default output device, 32-bit floating point data, a sample rate of 44100 Hz, and a frame rate of 256 sample frames per output buffer. If the user specifies an invalid parameter value (such as a device id greater than or equal to the number of enumerated devices), an <a class="el" href="classRtError.html">RtError</a> is thrown of type = INVALID_USE. If a system error occurs or the device does not support the specified parameter values, an <a class="el" href="classRtError.html">RtError</a> of type = SYSTEM_ERROR is thrown. In either case, a descriptive error message is bundled with the exception and can be queried with the <a class="el" href="classRtError.html#a4">RtError::getMessage()</a> or <a class="el" href="classRtError.html#a5">RtError::what()</a> functions.<p>
+<a class="el" href="classRtAudio.html">RtAudio</a> provides four signed integer and two floating point data formats which can be specified using the RtAudioFormat parameter values mentioned earlier. If the opened device does not natively support the given format, <a class="el" href="classRtAudio.html">RtAudio</a> will automatically perform the necessary data format conversion.<p>
+The <code>bufferFrames</code> parameter specifies the desired number of sample frames that will be written to and/or read from a device per write/read operation. This parameter can be used to control stream latency though there is no guarantee that the passed value will be that used by a device. In general, a lower <code>bufferFrames</code> value will produce less latency but perhaps less robust performance. A value of zero can be specified, in which case the smallest allowable value will be used. The <code>bufferFrames</code> parameter is passed as a pointer and the actual value used by the stream is set during the device setup procedure. <code>bufferFrames</code> values should be a power of two. Optimal and allowable buffer values tend to vary between systems and devices. Stream latency can also be controlled via the optional <a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> member <code>numberOfBuffers</code> (not used in the example above), though this tends to be more system dependent. In particular, the <code>numberOfBuffers</code> parameter is ignored when using the OS-X Core Audio, Jack, and the Windows ASIO APIs.<p>
+As noted earlier, the device capabilities reported by a driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. Because of this, <a class="el" href="classRtAudio.html">RtAudio</a> does not attempt to query a device's capabilities or use previously reported values when opening a device. Instead, <a class="el" href="classRtAudio.html">RtAudio</a> simply attempts to set the given parameters on a specified device and then checks whether the setup is successful or not.<p>
+The RtAudioCallback parameter above is a pointer to a user-defined function that will be called whenever the audio system is ready for new output data or has new input data to be read. Further details on the use of a callback function are provided in the next section.<p>
+Several stream options are available to fine-tune the behavior of an audio stream. In the example above, we specify that data will be written by the user in a <em>non-interleaved</em> format via the <a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> member <code>flags</code>. That is, all <code>bufferFrames</code> of the first channel should be written consecutively, followed by all <code>bufferFrames</code> of the second channel. By default (when no option is specified), <a class="el" href="classRtAudio.html">RtAudio</a> expects data to be written in an <em>interleaved</em> format. <HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
index 294b63b84f8f3706c9650a90e2ea0c0ec749679e..68a0841f095da3c9bdfda7f9b040c5ee4deb1c00 100644 (file)
@@ -2,6 +2,7 @@
 <HEAD>
 <TITLE>The RtAudio Tutorial</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
 <h1>RtAudioDeviceInfo Member List</h1>This is the complete list of members for <a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a>, including all inherited members.<p><table>
   <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o4">duplexChannels</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o3">inputChannels</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o5">isDefault</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o6">isDefaultInput</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o5">isDefaultOutput</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o0">name</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o7">nativeFormats</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o8">nativeFormats</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o2">outputChannels</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
   <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o1">probed</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o6">sampleRates</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudioDeviceInfo.html#o7">sampleRates</a></td><td><a class="el" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a></td><td></td></tr>
 </table><HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;2001-2006 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>
index ae1c6a94c4d4194b5a775406adce3f23c284ad26..c67fbea2ce38c42c7d6bb4988c6dc53af333dee7 100644 (file)
@@ -2,6 +2,7 @@
 <HEAD>
 <TITLE>The RtAudio Tutorial</TITLE>
 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 <CENTER>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o4">duplexChannels</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o5">isDefault</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o5">isDefaultOutput</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">std::vector&lt; int &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o6">sampleRates</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o6">isDefaultInput</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">RtAudioFormat&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o7">nativeFormats</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::vector&lt; int &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o7">sampleRates</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioDeviceInfo.html#o8">nativeFormats</a></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
@@ -152,13 +155,36 @@ Maximum input channels supported by device.     </td>
 Maximum simultaneous input/output channels supported by device.     </td>
   </tr>
 </table>
-<a class="anchor" name="o5"></a><!-- doxytag: member="RtAudioDeviceInfo::isDefault" ref="o5" args="" --><p>
+<a class="anchor" name="o5"></a><!-- doxytag: member="RtAudioDeviceInfo::isDefaultOutput" ref="o5" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">bool <a class="el" href="structRtAudioDeviceInfo.html#o5">RtAudioDeviceInfo::isDefaultOutput</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+true if this is the default output device.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o6"></a><!-- doxytag: member="RtAudioDeviceInfo::isDefaultInput" ref="o6" args="" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">bool <a class="el" href="structRtAudioDeviceInfo.html#o5">RtAudioDeviceInfo::isDefault</a>          </td>
+          <td class="md" nowrap valign="top">bool <a class="el" href="structRtAudioDeviceInfo.html#o6">RtAudioDeviceInfo::isDefaultInput</a>          </td>
         </tr>
       </table>
     </td>
@@ -172,16 +198,16 @@ Maximum simultaneous input/output channels supported by device.     </td>
     <td>
 
 <p>
-true if this is the default output or input device.     </td>
+true if this is the default input device.     </td>
   </tr>
 </table>
-<a class="anchor" name="o6"></a><!-- doxytag: member="RtAudioDeviceInfo::sampleRates" ref="o6" args="" --><p>
+<a class="anchor" name="o7"></a><!-- doxytag: member="RtAudioDeviceInfo::sampleRates" ref="o7" args="" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">std::vector&lt;int&gt; <a class="el" href="structRtAudioDeviceInfo.html#o6">RtAudioDeviceInfo::sampleRates</a>          </td>
+          <td class="md" nowrap valign="top">std::vector&lt;int&gt; <a class="el" href="structRtAudioDeviceInfo.html#o7">RtAudioDeviceInfo::sampleRates</a>          </td>
         </tr>
       </table>
     </td>
@@ -198,13 +224,13 @@ true if this is the default output or input device.     </td>
 Supported sample rates (queried from list of standard rates).     </td>
   </tr>
 </table>
-<a class="anchor" name="o7"></a><!-- doxytag: member="RtAudioDeviceInfo::nativeFormats" ref="o7" args="" --><p>
+<a class="anchor" name="o8"></a><!-- doxytag: member="RtAudioDeviceInfo::nativeFormats" ref="o8" args="" --><p>
 <table class="mdTable" cellpadding="2" cellspacing="0">
   <tr>
     <td class="mdRow">
       <table cellpadding="0" cellspacing="0" border="0">
         <tr>
-          <td class="md" nowrap valign="top">RtAudioFormat <a class="el" href="structRtAudioDeviceInfo.html#o7">RtAudioDeviceInfo::nativeFormats</a>          </td>
+          <td class="md" nowrap valign="top"><a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a> <a class="el" href="structRtAudioDeviceInfo.html#o8">RtAudioDeviceInfo::nativeFormats</a>          </td>
         </tr>
       </table>
     </td>
@@ -226,8 +252,7 @@ Bit mask of supported data formats.     </td>
 <HR>
 
 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
-  <td>&copy;2001-2005 Gary P. Scavone, McGill University. All Rights Reserved.<br>
-  Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
+  <td>&copy;2001-2006 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/html/structRtAudioStreamParameters-members.html b/doc/html/structRtAudioStreamParameters-members.html
new file mode 100644 (file)
index 0000000..bf46aed
--- /dev/null
@@ -0,0 +1,23 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Tutorial</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudioStreamParameters Member List</h1>This is the complete list of members for <a class="el" href="structRtAudioStreamParameters.html">RtAudioStreamParameters</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="structRtAudioStreamParameters.html#o0">deviceId</a></td><td><a class="el" href="structRtAudioStreamParameters.html">RtAudioStreamParameters</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudioStreamParameters.html#o2">firstChannel</a></td><td><a class="el" href="structRtAudioStreamParameters.html">RtAudioStreamParameters</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudioStreamParameters.html#o1">nChannels</a></td><td><a class="el" href="structRtAudioStreamParameters.html">RtAudioStreamParameters</a></td><td></td></tr>
+</table><HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;2001-2006 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>
+</HTML>
diff --git a/doc/html/structRtAudioStreamParameters.html b/doc/html/structRtAudioStreamParameters.html
new file mode 100644 (file)
index 0000000..a61cf7b
--- /dev/null
@@ -0,0 +1,109 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Tutorial</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudioStreamParameters Struct Reference</h1><!-- doxytag: class="RtAudioStreamParameters" -->The structure for specifying input or ouput stream parameters.  
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="RtAudio_8h-source.html">RtAudio.h</a>&gt;</code>
+<p>
+<a href="structRtAudioStreamParameters-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioStreamParameters.html#o0">deviceId</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioStreamParameters.html#o1">nChannels</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudioStreamParameters.html#o2">firstChannel</a></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The structure for specifying input or ouput stream parameters. 
+<p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="o0"></a><!-- doxytag: member="RtAudioStreamParameters::deviceId" ref="o0" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">int <a class="el" href="structRtAudioStreamParameters.html#o0">RtAudioStreamParameters::deviceId</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Device index (0 to getDeviceCount() - 1).     </td>
+  </tr>
+</table>
+<a class="anchor" name="o1"></a><!-- doxytag: member="RtAudioStreamParameters::nChannels" ref="o1" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">int <a class="el" href="structRtAudioStreamParameters.html#o1">RtAudioStreamParameters::nChannels</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Number of channels.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o2"></a><!-- doxytag: member="RtAudioStreamParameters::firstChannel" ref="o2" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">int <a class="el" href="structRtAudioStreamParameters.html#o2">RtAudioStreamParameters::firstChannel</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+First channel index on device (default = 0).     </td>
+  </tr>
+</table>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="RtAudio_8h-source.html">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;2001-2006 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>
+</HTML>
diff --git a/doc/html/structRtAudio_1_1DeviceInfo-members.html b/doc/html/structRtAudio_1_1DeviceInfo-members.html
new file mode 100644 (file)
index 0000000..a8651f2
--- /dev/null
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudio::DeviceInfo Member List</h1>This is the complete list of members for <a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o4">duplexChannels</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o3">inputChannels</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o6">isDefaultInput</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o5">isDefaultOutput</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o1">name</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o8">nativeFormats</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o2">outputChannels</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o0">probed</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1DeviceInfo.html#o7">sampleRates</a></td><td><a class="el" href="structRtAudio_1_1DeviceInfo.html">RtAudio::DeviceInfo</a></td><td></td></tr>
+</table><HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/structRtAudio_1_1DeviceInfo.html b/doc/html/structRtAudio_1_1DeviceInfo.html
new file mode 100644 (file)
index 0000000..9b795f1
--- /dev/null
@@ -0,0 +1,261 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="nav">
+<a class="el" href="classRtAudio.html">RtAudio</a>::<a class="el" href="structRtAudio_1_1DeviceInfo.html">DeviceInfo</a></div>
+<h1>RtAudio::DeviceInfo Struct Reference</h1><!-- doxytag: class="RtAudio::DeviceInfo" -->The public device information structure for returning queried values.  
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="RtAudio_8h-source.html">RtAudio.h</a>&gt;</code>
+<p>
+<a href="structRtAudio_1_1DeviceInfo-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o0">probed</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o1">name</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o2">outputChannels</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o3">inputChannels</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o4">duplexChannels</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o5">isDefaultOutput</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o6">isDefaultInput</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::vector&lt; unsigned int &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o7">sampleRates</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1DeviceInfo.html#o8">nativeFormats</a></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The public device information structure for returning queried values. 
+<p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="o0"></a><!-- doxytag: member="RtAudio::DeviceInfo::probed" ref="o0" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">bool <a class="el" href="structRtAudio_1_1DeviceInfo.html#o0">RtAudio::DeviceInfo::probed</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+true if the device capabilities were successfully probed.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o1"></a><!-- doxytag: member="RtAudio::DeviceInfo::name" ref="o1" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">std::string <a class="el" href="structRtAudio_1_1DeviceInfo.html#o1">RtAudio::DeviceInfo::name</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Character string device identifier.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o2"></a><!-- doxytag: member="RtAudio::DeviceInfo::outputChannels" ref="o2" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1DeviceInfo.html#o2">RtAudio::DeviceInfo::outputChannels</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Maximum output channels supported by device.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o3"></a><!-- doxytag: member="RtAudio::DeviceInfo::inputChannels" ref="o3" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1DeviceInfo.html#o3">RtAudio::DeviceInfo::inputChannels</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Maximum input channels supported by device.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o4"></a><!-- doxytag: member="RtAudio::DeviceInfo::duplexChannels" ref="o4" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1DeviceInfo.html#o4">RtAudio::DeviceInfo::duplexChannels</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Maximum simultaneous input/output channels supported by device.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o5"></a><!-- doxytag: member="RtAudio::DeviceInfo::isDefaultOutput" ref="o5" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">bool <a class="el" href="structRtAudio_1_1DeviceInfo.html#o5">RtAudio::DeviceInfo::isDefaultOutput</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+true if this is the default output device.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o6"></a><!-- doxytag: member="RtAudio::DeviceInfo::isDefaultInput" ref="o6" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">bool <a class="el" href="structRtAudio_1_1DeviceInfo.html#o6">RtAudio::DeviceInfo::isDefaultInput</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+true if this is the default input device.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o7"></a><!-- doxytag: member="RtAudio::DeviceInfo::sampleRates" ref="o7" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">std::vector&lt;unsigned int&gt; <a class="el" href="structRtAudio_1_1DeviceInfo.html#o7">RtAudio::DeviceInfo::sampleRates</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Supported sample rates (queried from list of standard rates).     </td>
+  </tr>
+</table>
+<a class="anchor" name="o8"></a><!-- doxytag: member="RtAudio::DeviceInfo::nativeFormats" ref="o8" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"><a class="el" href="RtAudio_8h.html#a1">RtAudioFormat</a> <a class="el" href="structRtAudio_1_1DeviceInfo.html#o8">RtAudio::DeviceInfo::nativeFormats</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Bit mask of supported data formats.     </td>
+  </tr>
+</table>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="RtAudio_8h-source.html">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/structRtAudio_1_1StreamOptions-members.html b/doc/html/structRtAudio_1_1StreamOptions-members.html
new file mode 100644 (file)
index 0000000..109162a
--- /dev/null
@@ -0,0 +1,23 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudio::StreamOptions Member List</h1>This is the complete list of members for <a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1StreamOptions.html#o0">flags</a></td><td><a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1StreamOptions.html#o1">numberOfBuffers</a></td><td><a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1StreamOptions.html#o2">streamName</a></td><td><a class="el" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a></td><td></td></tr>
+</table><HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/structRtAudio_1_1StreamOptions.html b/doc/html/structRtAudio_1_1StreamOptions.html
new file mode 100644 (file)
index 0000000..244cc66
--- /dev/null
@@ -0,0 +1,121 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="nav">
+<a class="el" href="classRtAudio.html">RtAudio</a>::<a class="el" href="structRtAudio_1_1StreamOptions.html">StreamOptions</a></div>
+<h1>RtAudio::StreamOptions Struct Reference</h1><!-- doxytag: class="RtAudio::StreamOptions" -->The structure for specifying stream options.  
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="RtAudio_8h-source.html">RtAudio.h</a>&gt;</code>
+<p>
+<a href="structRtAudio_1_1StreamOptions-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamOptions.html#o0">flags</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamOptions.html#o1">numberOfBuffers</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamOptions.html#o2">streamName</a></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The structure for specifying stream options. 
+<p>
+The following flags can be OR'ed together to allow a client to make changes to the default stream behavior:<p>
+<ul>
+<li><em>RTAUDIO_NONINTERLEAVED:</em> Use non-interleaved buffers (default = interleaved).</li><li><em>RTAUDIO_MINIMIZE_LATENCY:</em> Attempt to set stream parameters for lowest possible latency.</li><li><em>RTAUDIO_HOG_DEVICE:</em> Attempt grab device for exclusive use.</li></ul>
+<p>
+By default, <a class="el" href="classRtAudio.html">RtAudio</a> streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the <a class="el" href="classRtAudio.html#a7">openStream()</a> function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with <code>nFrames</code> samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index <code>nFrames</code> (assuming the <code>buffer</code> pointer was recast to the correct data type for the stream).<p>
+Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, <a class="el" href="classRtAudio.html">RtAudio</a> will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the <a class="el" href="classRtAudio.html#a7">openStream()</a> function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance.<p>
+If the RTAUDIO_HOG_DEVICE flag is set, <a class="el" href="classRtAudio.html">RtAudio</a> will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs.<p>
+The <code>numberOfBuffers</code> parameter can be used to control stream latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs only. A value of two is usually the smallest allowed. Larger numbers can potentially result in more robust stream performance, though likely at the cost of stream latency. The value set by the user is replaced during execution of the <a class="el" href="classRtAudio.html#a7">RtAudio::openStream()</a> function by the value actually used by the system.<p>
+The <code>streamName</code> parameter can be used to set the client name when using the Jack API. By default, the client name is set to RtApiJack. However, if you wish to create multiple instances of <a class="el" href="classRtAudio.html">RtAudio</a> with Jack, each instance must have a unique client name.
+<p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="o0"></a><!-- doxytag: member="RtAudio::StreamOptions::flags" ref="o0" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"><a class="el" href="RtAudio_8h.html#a8">RtAudioStreamFlags</a> <a class="el" href="structRtAudio_1_1StreamOptions.html#o0">RtAudio::StreamOptions::flags</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE).     </td>
+  </tr>
+</table>
+<a class="anchor" name="o1"></a><!-- doxytag: member="RtAudio::StreamOptions::numberOfBuffers" ref="o1" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1StreamOptions.html#o1">RtAudio::StreamOptions::numberOfBuffers</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Number of stream buffers.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o2"></a><!-- doxytag: member="RtAudio::StreamOptions::streamName" ref="o2" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">std::string <a class="el" href="structRtAudio_1_1StreamOptions.html#o2">RtAudio::StreamOptions::streamName</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+A stream name (currently used only in Jack).     </td>
+  </tr>
+</table>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="RtAudio_8h-source.html">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/structRtAudio_1_1StreamParameters-members.html b/doc/html/structRtAudio_1_1StreamParameters-members.html
new file mode 100644 (file)
index 0000000..638b8ba
--- /dev/null
@@ -0,0 +1,23 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<h1>RtAudio::StreamParameters Member List</h1>This is the complete list of members for <a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a></td><td><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1StreamParameters.html#o2">firstChannel</a></td><td><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a></td><td><a class="el" href="structRtAudio_1_1StreamParameters.html">RtAudio::StreamParameters</a></td><td></td></tr>
+</table><HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/structRtAudio_1_1StreamParameters.html b/doc/html/structRtAudio_1_1StreamParameters.html
new file mode 100644 (file)
index 0000000..05ebd0e
--- /dev/null
@@ -0,0 +1,111 @@
+<HTML>
+<HEAD>
+<TITLE>The RtAudio Home Page</TITLE>
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+<LINK REL="SHORTCUT ICON" HREF="http://www.music.mcgill.ca/~gary/favicon.ico">
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
+<HR>
+<!-- Generated by Doxygen 1.4.4 -->
+<div class="nav">
+<a class="el" href="classRtAudio.html">RtAudio</a>::<a class="el" href="structRtAudio_1_1StreamParameters.html">StreamParameters</a></div>
+<h1>RtAudio::StreamParameters Struct Reference</h1><!-- doxytag: class="RtAudio::StreamParameters" -->The structure for specifying input or ouput stream parameters.  
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="RtAudio_8h-source.html">RtAudio.h</a>&gt;</code>
+<p>
+<a href="structRtAudio_1_1StreamParameters-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamParameters.html#o0">deviceId</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamParameters.html#o1">nChannels</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structRtAudio_1_1StreamParameters.html#o2">firstChannel</a></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The structure for specifying input or ouput stream parameters. 
+<p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="o0"></a><!-- doxytag: member="RtAudio::StreamParameters::deviceId" ref="o0" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1StreamParameters.html#o0">RtAudio::StreamParameters::deviceId</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Device index (0 to <a class="el" href="classRtAudio.html#a3">getDeviceCount()</a> - 1).     </td>
+  </tr>
+</table>
+<a class="anchor" name="o1"></a><!-- doxytag: member="RtAudio::StreamParameters::nChannels" ref="o1" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1StreamParameters.html#o1">RtAudio::StreamParameters::nChannels</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Number of channels.     </td>
+  </tr>
+</table>
+<a class="anchor" name="o2"></a><!-- doxytag: member="RtAudio::StreamParameters::firstChannel" ref="o2" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">unsigned int <a class="el" href="structRtAudio_1_1StreamParameters.html#o2">RtAudio::StreamParameters::firstChannel</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+First channel index on device (default = 0).     </td>
+  </tr>
+</table>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="RtAudio_8h-source.html">RtAudio.h</a></ul>
+<HR>
+
+<table><tr><td><img src="../images/mcgill.gif" width=165></td>
+  <td>&copy;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>
+</table>
+
+</BODY>
+</HTML>
diff --git a/doc/html/updates.html b/doc/html/updates.html
new file mode 100644 (file)
index 0000000..55e4639
--- /dev/null
@@ -0,0 +1,81 @@
+<html>
+<head>
+<title>RtAudio Updates</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<center><h1>RtAudio Update Tracker</h1></center>
+
+<h2>Needed Updates & Possible New Features:</h2>
+
+<table border=1 cellpadding=10 cellspacing=0>
+<tr bgcolor="#C7CAFF"><td><b>#</b></td><td><b>Description</b></td><td><b>Status</b></td></b></tr>
+
+<tr><td>1</td><td>Check implementation of various stream options (RTAUDIO_HOG_DEVICE, ...) to verify proper implementation.</td><td>UC</td></tr>
+<tr><td>2</td><td>Do API-specific implementations of stream time where possible.</td><td>UC</td></tr>
+<tr><td>3</td><td>Better support for multichannel (>2) audio devices in Windows DirectSound API.</td><td>UC</td></tr>
+<tr><td>4</td><td>Mixer support to set the input volume, output volume, and select the input source (e.g., "Mic" vs "Line In") via following new methods:
+<ul>
+<li><tt>double getStreamOutputVolume()</tt>:   // returns value between 0.0 and 1.0</li>
+<li><tt>void setStreamOutputVolume( double volume )</tt>:  // volume should be value between 0.0 and 1.0</li>
+<li><tt>double getStreamInputVolume()</tt>:   // returns value between 0.0 and 1.0</li>
+<li><tt>void setStreamInputVolume( double volume )</tt>:  // volume should be value between 0.0 and 1.0</li>
+<li><tt>void getStreamInputSources( std::vector&lt;std::string&gt;& sources )</tt>:  // returns a vector of strings with source names</li>
+<li><tt>void setStreamInputSource( unsigned int index )</tt>: // source index is value between 0 and sources.size()-1, as determined from function above</li>
+</ul></td><td>UC<a href="#4"><sup>4</sup></a></td></tr>
+<tr><td>5</td><td>Robust support for full-duplex with different devices.  Provide well-defined behavior if the devices get out of sync, with input taking precedence, so no incoming samples are lost (if possible).</td><td>UC</td></tr>
+<tr><td>6</td><td>More sophisticated querying of device capabilities - for example, it'd be nice to figure out that a device supports either 4 channels of 16-bit or 2 channels of 24-bit audio.</td><td>UC</td></tr>
+
+
+</table>
+
+<p>
+<b>Status Codes:</b>
+<p>
+<table border=1 cellpadding=10 cellspacing=0>
+<tr><td>UC</td><td>Under Consideration</td></tr>
+<tr><td>API?</td><td>Approved but need to determine API change</td></tr>
+</table>
+
+
+<h2>Recently Added Features:</h2>
+
+<table border=1 cellpadding=10 cellspacing=0>
+<tr bgcolor="#C7CAFF"><td><b>#</b></td><td><b>Description</b></td><td width="20%"><b>Solution</b></td><td><b>Version</b></td></tr>
+
+<tr><td>1</td><td>Stream time support - ability to query the stream and find out the exact time since the stream was started, according to that device's clock.  For APIs where this is not supported, this is estimated based on a count of the bytes that have been sent and the known latency.</td><td><a href="#1"><sup>1</sup></a>New <tt>getStreamTime()</tt> function (DM)</td><td>4.0</td></tr>
+
+<tr><td>2</td><td>Ability to determine whether stream is currently running.</td><td>New <tt>bool isStreamRunning()</tt> function (DM)</td><td>4.0</td></tr>
+
+<tr><td>3</td><td>NetBSD support added to Linux OSS API.</td><td>__NetBSD__ must be defined (Emmanuel Dreyfus)</td><td>4.0</td></tr>
+
+<tr><td>4</td><td>Added function to return available compiled APIs</td><td>New <tt>getCompiledApi()</tt> function (GS)</td><td>4.0</td></tr>
+
+<tr><td>5</td><td>Changed <tt>isDefault</tt> member of RtAudioDeviceInfo structure to <tt>isDefaultOutput</tt> and <tt>isDefaultInput</tt> to be able to distinguish between default input and output devices.</td><td>Modified <tt>RtAudioDeviceInfo</tt> structure (GS)</td><td>4.0</td></tr>
+
+<tr><td>6</td><td>Added function to return current API for RtAudio instance</td><td>New <tt>getCurrentApi()</tt> function (GS)</td><td>4.0</td></tr>
+
+<tr><td>7</td><td>Added function to return current stream device(s) index</td><td>New <tt>getStreamDevice()</tt> function (GS)</td><td>4.0</td></tr>
+
+<tr><td>8</td><td>Dummy version that compiles without API compiler flag but does nothing</td><td>New <tt>RtApiDummy</tt> class (GS)</td><td>4.0</td></tr>
+
+<tr><td>9</td><td>Ability to query device latency.</td><td><a href="#2"><sup>2</sup></a>New <tt>getStreamLatency()</tt> function (GS)</td><td>4.0</td></tr>
+
+<tr><td>10</td><td>Choice of opening a device in exclusive or non-exclusive mode.  If opening in non-exclusive mode, try to use the device as-is without changing its sample rate, etc - this is good when users want to use two audio devices at once.</td><td><a href="#3"><sup>3</sup></a>New RtAudio::StreamOptions structure and parameters</td><td>4.0</td></tr>
+
+</table>
+
+<h2>Details:</h2>
+
+<a name="1"><sup>1</sup></a>Currently implemented by incrementing a counter every time the tickStream() or callback function is called.  If the gettimeofday() function is available (right now it is enabled for all Unix-like systems but not Windows), it also records the time of each tickStream() call.  Then, when you call getStreamTime(), it adds the elapsed time since the last tickStream also.  This makes the playback counter pretty smooth, but accurate.  The intent is that now we could implement something more accurate on platforms that support it - but this is a reasonable baseline.  One thing to watch out for: asking OSS for the stream time is problematic; on some devices the counter is only 16-bit and wraps around frequently, and on some devices it will sometimes return bogus values.
+<P>
+<P>
+<a name="2"><sup>2</sup></a>This function could not be implemented for all APIs.  If the function returns a value of zero, it should be assumed to be invalid.
+<P>
+<P>
+<a name="3"><sup>3</sup></a>This implementation does not attempt to leave a device as-is.  However, the flag <tt>RTAUDIO_HOG_DEVICE</tt> is provided to attempt to grab exclusive use of a device.
+<P>
+<P>
+<a name="4"><sup>4</sup></a>I actually coded this up for OS-X Core Audio.  However, I found it bloated the code and presented a number of interface problems that did more harm than good.  Thus, it is currently not being considered further (GS).
+</body>
+</html>