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"
+ CFLAGS=$CFLAGS" -DHAVE_GETTIMEOFDAY"
fi
fi
+CFLAGS="$CFLAGS $cflags"
+
# Checks for package options and external software
ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
echo "${ECHO_T}using OSS" >&6
audio_apis=-D__LINUX_OSS__
- cflags=$cflags" -lossaudio"
+ CFLAGS=$CFLAGS" -lossaudio"
echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5
echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6
{ (exit 1); exit 1; }; }
fi
- LIBS="`pkg-config --cflags --libs jack` $TEMP_LIBS -lasound"
+ LIBS="`pkg-config --CFLAGS --libs jack` $TEMP_LIBS -lasound"
audio_apis="-D__UNIX_JACK__"
fi
<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.3</span>
+<a name="l00045"></a>00045 <span class="comment">// RtAudio: Version 4.0.4</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="l00617"></a>00617 <span class="preprocessor">#endif</span>
<a name="l00618"></a>00618 <span class="preprocessor"></span>
<a name="l00619"></a>00619 RtApiStream()
-<a name="l00620"></a>00620 :apiHandle(0), deviceBuffer(0) {}
+<a name="l00620"></a>00620 :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; }
<a name="l00621"></a>00621 };
<a name="l00622"></a>00622
<a name="l00623"></a>00623 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">short</span> Int16;
<a name="l00867"></a>00867
<a name="l00868"></a>00868 <span class="keyword">private</span>:
<a name="l00869"></a>00869
-<a name="l00870"></a>00870 <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="l00871"></a>00871 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
-<a name="l00872"></a>00872 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
-<a name="l00873"></a>00873 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
-<a name="l00874"></a>00874 };
-<a name="l00875"></a>00875
-<a name="l00876"></a>00876 <span class="preprocessor">#endif</span>
-<a name="l00877"></a>00877 <span class="preprocessor"></span>
-<a name="l00878"></a>00878 <span class="preprocessor">#if defined(__LINUX_OSS__)</span>
+<a name="l00870"></a>00870 std::vector<RtAudio::DeviceInfo> devices_;
+<a name="l00871"></a>00871 <span class="keywordtype">void</span> saveDeviceInfo( <span class="keywordtype">void</span> );
+<a name="l00872"></a>00872 <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="l00873"></a>00873 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00874"></a>00874 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00875"></a>00875 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00876"></a>00876 };
+<a name="l00877"></a>00877
+<a name="l00878"></a>00878 <span class="preprocessor">#endif</span>
<a name="l00879"></a>00879 <span class="preprocessor"></span>
-<a name="l00880"></a>00880 <span class="keyword">class </span>RtApiOss: <span class="keyword">public</span> RtApi
-<a name="l00881"></a>00881 {
-<a name="l00882"></a>00882 <span class="keyword">public</span>:
-<a name="l00883"></a>00883
-<a name="l00884"></a>00884 RtApiOss();
-<a name="l00885"></a>00885 ~RtApiOss();
-<a name="l00886"></a>00886 <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="l00887"></a>00887 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
-<a name="l00888"></a>00888 <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="l00889"></a>00889 <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
-<a name="l00890"></a>00890 <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
-<a name="l00891"></a>00891 <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
-<a name="l00892"></a>00892 <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
-<a name="l00893"></a>00893
-<a name="l00894"></a>00894 <span class="comment">// This function is intended for internal use only. It must be</span>
-<a name="l00895"></a>00895 <span class="comment">// public because it is called by the internal callback handler,</span>
-<a name="l00896"></a>00896 <span class="comment">// which is not a member of RtAudio. External use of this function</span>
-<a name="l00897"></a>00897 <span class="comment">// will most likely produce highly undesireable results!</span>
-<a name="l00898"></a>00898 <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">void</span> );
-<a name="l00899"></a>00899
-<a name="l00900"></a>00900 <span class="keyword">private</span>:
+<a name="l00880"></a>00880 <span class="preprocessor">#if defined(__LINUX_OSS__)</span>
+<a name="l00881"></a>00881 <span class="preprocessor"></span>
+<a name="l00882"></a>00882 <span class="keyword">class </span>RtApiOss: <span class="keyword">public</span> RtApi
+<a name="l00883"></a>00883 {
+<a name="l00884"></a>00884 <span class="keyword">public</span>:
+<a name="l00885"></a>00885
+<a name="l00886"></a>00886 RtApiOss();
+<a name="l00887"></a>00887 ~RtApiOss();
+<a name="l00888"></a>00888 <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="l00889"></a>00889 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> );
+<a name="l00890"></a>00890 <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="l00891"></a>00891 <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> );
+<a name="l00892"></a>00892 <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> );
+<a name="l00893"></a>00893 <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> );
+<a name="l00894"></a>00894 <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> );
+<a name="l00895"></a>00895
+<a name="l00896"></a>00896 <span class="comment">// This function is intended for internal use only. It must be</span>
+<a name="l00897"></a>00897 <span class="comment">// public because it is called by the internal callback handler,</span>
+<a name="l00898"></a>00898 <span class="comment">// which is not a member of RtAudio. External use of this function</span>
+<a name="l00899"></a>00899 <span class="comment">// will most likely produce highly undesireable results!</span>
+<a name="l00900"></a>00900 <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">void</span> );
<a name="l00901"></a>00901
-<a name="l00902"></a>00902 <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="l00903"></a>00903 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
-<a name="l00904"></a>00904 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
-<a name="l00905"></a>00905 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
-<a name="l00906"></a>00906 };
-<a name="l00907"></a>00907
-<a name="l00908"></a>00908 <span class="preprocessor">#endif</span>
-<a name="l00909"></a>00909 <span class="preprocessor"></span>
-<a name="l00910"></a>00910 <span class="preprocessor">#if defined(__RTAUDIO_DUMMY__)</span>
+<a name="l00902"></a>00902 <span class="keyword">private</span>:
+<a name="l00903"></a>00903
+<a name="l00904"></a>00904 <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="l00905"></a>00905 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00906"></a>00906 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00907"></a>00907 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options );
+<a name="l00908"></a>00908 };
+<a name="l00909"></a>00909
+<a name="l00910"></a>00910 <span class="preprocessor">#endif</span>
<a name="l00911"></a>00911 <span class="preprocessor"></span>
-<a name="l00912"></a>00912 <span class="keyword">class </span>RtApiDummy: <span class="keyword">public</span> RtApi
-<a name="l00913"></a>00913 {
-<a name="l00914"></a>00914 <span class="keyword">public</span>:
-<a name="l00915"></a>00915
-<a name="l00916"></a>00916 RtApiDummy() { errorText_ = <span class="stringliteral">"RtApiDummy: This class provides no functionality."</span>; error( <a class="code" href="classRtError.html#w11w0">RtError::WARNING</a> ); };
-<a name="l00917"></a>00917 <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="l00918"></a>00918 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> 0; };
-<a name="l00919"></a>00919 <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="l00920"></a>00920 <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> ) {};
-<a name="l00921"></a>00921 <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> ) {};
-<a name="l00922"></a>00922 <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> ) {};
-<a name="l00923"></a>00923 <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> ) {};
-<a name="l00924"></a>00924
-<a name="l00925"></a>00925 <span class="keyword">private</span>:
+<a name="l00912"></a>00912 <span class="preprocessor">#if defined(__RTAUDIO_DUMMY__)</span>
+<a name="l00913"></a>00913 <span class="preprocessor"></span>
+<a name="l00914"></a>00914 <span class="keyword">class </span>RtApiDummy: <span class="keyword">public</span> RtApi
+<a name="l00915"></a>00915 {
+<a name="l00916"></a>00916 <span class="keyword">public</span>:
+<a name="l00917"></a>00917
+<a name="l00918"></a>00918 RtApiDummy() { errorText_ = <span class="stringliteral">"RtApiDummy: This class provides no functionality."</span>; error( <a class="code" href="classRtError.html#w11w0">RtError::WARNING</a> ); };
+<a name="l00919"></a>00919 <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="l00920"></a>00920 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getDeviceCount( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> 0; };
+<a name="l00921"></a>00921 <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="l00922"></a>00922 <span class="keywordtype">void</span> closeStream( <span class="keywordtype">void</span> ) {};
+<a name="l00923"></a>00923 <span class="keywordtype">void</span> startStream( <span class="keywordtype">void</span> ) {};
+<a name="l00924"></a>00924 <span class="keywordtype">void</span> stopStream( <span class="keywordtype">void</span> ) {};
+<a name="l00925"></a>00925 <span class="keywordtype">void</span> abortStream( <span class="keywordtype">void</span> ) {};
<a name="l00926"></a>00926
-<a name="l00927"></a>00927 <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="l00928"></a>00928 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
-<a name="l00929"></a>00929 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
-<a name="l00930"></a>00930 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; };
-<a name="l00931"></a>00931 };
-<a name="l00932"></a>00932
-<a name="l00933"></a>00933 <span class="preprocessor">#endif</span>
-<a name="l00934"></a>00934 <span class="preprocessor"></span>
+<a name="l00927"></a>00927 <span class="keyword">private</span>:
+<a name="l00928"></a>00928
+<a name="l00929"></a>00929 <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="l00930"></a>00930 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sampleRate,
+<a name="l00931"></a>00931 <a class="code" href="RtAudio_8h.html#a1">RtAudioFormat</a> format, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *bufferSize,
+<a name="l00932"></a>00932 <a class="code" href="structRtAudio_1_1StreamOptions.html">RtAudio::StreamOptions</a> *options ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; };
+<a name="l00933"></a>00933 };
+<a name="l00934"></a>00934
<a name="l00935"></a>00935 <span class="preprocessor">#endif</span>
<a name="l00936"></a>00936 <span class="preprocessor"></span>
-<a name="l00937"></a>00937 <span class="comment">// Indentation settings for Vim and Emacs</span>
-<a name="l00938"></a>00938 <span class="comment">//</span>
-<a name="l00939"></a>00939 <span class="comment">// Local Variables:</span>
-<a name="l00940"></a>00940 <span class="comment">// c-basic-offset: 2</span>
-<a name="l00941"></a>00941 <span class="comment">// indent-tabs-mode: nil</span>
-<a name="l00942"></a>00942 <span class="comment">// End:</span>
-<a name="l00943"></a>00943 <span class="comment">//</span>
-<a name="l00944"></a>00944 <span class="comment">// vim: et sts=2 sw=2</span>
+<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="comment">// Indentation settings for Vim and Emacs</span>
+<a name="l00940"></a>00940 <span class="comment">//</span>
+<a name="l00941"></a>00941 <span class="comment">// Local Variables:</span>
+<a name="l00942"></a>00942 <span class="comment">// c-basic-offset: 2</span>
+<a name="l00943"></a>00943 <span class="comment">// indent-tabs-mode: nil</span>
+<a name="l00944"></a>00944 <span class="comment">// End:</span>
+<a name="l00945"></a>00945 <span class="comment">//</span>
+<a name="l00946"></a>00946 <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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</pre></div><HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<!-- 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>
+Anders Ervik </li>
+<li>
Robin Davies (Windows DS and ASIO) </li>
<li>
Ryan Williams (Windows non-MS compiler ASIO support) </li>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</table><HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<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>
+RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2008 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>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</table><HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
The example compiler statements above could be used to compile the <code>audioprobe.cpp</code> example file, assuming that <code>audioprobe.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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<!-- Generated by Doxygen 1.4.4 -->
<h1>The <a class="el" href="classRtAudio.html">RtAudio</a> Home Page </h1>
<p>
-<h3 align="center">4.0.3 </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>
+<h3 align="center">4.0.4 </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>
<p>
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 that are connected after an <a class="el" href="classRtAudio.html">RtAudio</a> instance is created.<h2><a class="anchor" name="download">
Download</a></h2>
-Latest Release (7 December 2007): <a href="http://music.mcgill.ca/~gary/rtaudio/release/rtaudio-4.0.3.tar.gz">Version 4.0.3</a><h2><a class="anchor" name="documentation">
+Latest Release (24 January 2008): <a href="http://music.mcgill.ca/~gary/rtaudio/release/rtaudio-4.0.4.tar.gz">Version 4.0.4</a><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 & 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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</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<int> 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>
+ <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">unsigned</span> <span class="keywordtype">int</span> outputChannels; <span class="comment">// Maximum output channels supported by device.</span>
+ <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputChannels; <span class="comment">// Maximum input channels supported by device.</span>
+ <span class="keywordtype">unsigned</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<unsigned int> 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>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
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>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</table><HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</table><HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
</table><HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>
<HR>
<table><tr><td><img src="../images/mcgill.gif" width=165></td>
- <td>©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
+ <td>©2001-2008 Gary P. Scavone, McGill University. All Rights Reserved.<br>Maintained by <a href="http://www.music.mcgill.ca/~gary/">Gary P. Scavone</a>.</td></tr>
</table>
</BODY>