You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1781 lines
105KB

  1. {\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033
  2. {\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
  3. {\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
  4. {\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
  5. {\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}
  6. }
  7. {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
  8. {\stylesheet
  9. {\widctlpar\adjustright \fs20\cgrid \snext0 Normal;}
  10. {\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;}
  11. {\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;}
  12. {\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;}
  13. {\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;}
  14. {\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;}
  15. {\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;}
  16. {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;}
  17. {\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;}
  18. {\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;}
  19. {\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;}
  20. {\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;}
  21. {\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;}
  22. {\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;}
  23. {\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;}
  24. {\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;}
  25. {\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;}
  26. {\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;}
  27. {\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;}
  28. {\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;}
  29. {\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;}
  30. {\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 9;}
  31. {\s50\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext51 List Continue 0;}
  32. {\s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext52 List Continue 1;}
  33. {\s52\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext53 List Continue 2;}
  34. {\s53\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext54 List Continue 3;}
  35. {\s54\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext55 List Continue 4;}
  36. {\s55\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext56 List Continue 5;}
  37. {\s56\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext57 List Continue 6;}
  38. {\s57\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext58 List Continue 7;}
  39. {\s58\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext59 List Continue 8;}
  40. {\s59\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext59 List Continue 9;}
  41. {\s60\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext61 DescContinue 0;}
  42. {\s61\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext62 DescContinue 1;}
  43. {\s62\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext63 DescContinue 2;}
  44. {\s63\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext64 DescContinue 3;}
  45. {\s64\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext65 DescContinue 4;}
  46. {\s65\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext66 DescContinue 5;}
  47. {\s66\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext67 DescContinue 6;}
  48. {\s67\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext68 DescContinue 7;}
  49. {\s68\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext69 DescContinue 8;}
  50. {\s69\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext69 DescContinue 9;}
  51. {\s70\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext81 LatexTOC 0;}
  52. {\s71\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext82 LatexTOC 1;}
  53. {\s72\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext83 LatexTOC 2;}
  54. {\s73\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext84 LatexTOC 3;}
  55. {\s74\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext85 LatexTOC 4;}
  56. {\s75\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext86 LatexTOC 5;}
  57. {\s76\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext87 LatexTOC 6;}
  58. {\s77\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext88 LatexTOC 7;}
  59. {\s78\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext89 LatexTOC 8;}
  60. {\s79\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext89 LatexTOC 9;}
  61. {\s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext81 \sautoupd List Bullet 0;}
  62. {\s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid \sbasedon0 \snext82 \sautoupd List Bullet 1;}
  63. {\s82\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls3\adjustright \fs20\cgrid \sbasedon0 \snext83 \sautoupd List Bullet 2;}
  64. {\s83\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls4\adjustright \fs20\cgrid \sbasedon0 \snext84 \sautoupd List Bullet 3;}
  65. {\s84\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls5\adjustright \fs20\cgrid \sbasedon0 \snext85 \sautoupd List Bullet 4;}
  66. {\s85\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls6\adjustright \fs20\cgrid \sbasedon0 \snext86 \sautoupd List Bullet 5;}
  67. {\s86\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls7\adjustright \fs20\cgrid \sbasedon0 \snext87 \sautoupd List Bullet 6;}
  68. {\s87\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls8\adjustright \fs20\cgrid \sbasedon0 \snext88 \sautoupd List Bullet 7;}
  69. {\s88\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls9\adjustright \fs20\cgrid \sbasedon0 \snext89 \sautoupd List Bullet 8;}
  70. {\s89\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls10\adjustright \fs20\cgrid \sbasedon0 \snext89 \sautoupd List Bullet 9;}
  71. {\s90\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext91 \sautoupd List Enum 0;}
  72. {\s91\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext92 \sautoupd List Enum 1;}
  73. {\s92\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext93 \sautoupd List Enum 2;}
  74. {\s93\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext94 \sautoupd List Enum 3;}
  75. {\s94\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext95 \sautoupd List Enum 4;}
  76. {\s95\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext96 \sautoupd List Enum 5;}
  77. {\s96\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext96 \sautoupd List Enum 5;}
  78. {\s97\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext98 \sautoupd List Enum 7;}
  79. {\s98\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext99 \sautoupd List Enum 8;}
  80. {\s99\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext99 \sautoupd List Enum 9;}
  81. }
  82. {\comment begin body}
  83. {\info
  84. {\title {\comment RtAudio Reference Manual}RtAudio}
  85. {\comment Generated byDoxgyen. }
  86. {\creatim \yr2002\mo1\dy22\hr15\min27\sec40}
  87. }\pard\plain
  88. \sectd\pgnlcrm
  89. {\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}}
  90. \pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid
  91. \vertalc\qc\par\par\par\par\par\par\par\pard\plain \s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid
  92. {\field\fldedit {\*\fldinst TITLE \\*MERGEFORMAT}{\fldrslt TITLE}}\par
  93. \pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid
  94. \par
  95. \par\par\par\par\par\par\par\par\par\par\par\par
  96. \pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid
  97. {\field\fldedit {\*\fldinst AUTHOR \\*MERGEFORMAT}{\fldrslt AUTHOR}}\par
  98. Version \par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt CREATEDATE}}\par
  99. \page\page\vertalt
  100. \pard\plain
  101. {\field\fldedit {\*\fldinst TOC \\f \\*MERGEFORMAT}{\fldrslt Table of contents}}\par
  102. \pard\plain
  103. \pard\plain \sect\sbkpage
  104. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
  105. The {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) Tutorial\par \pard\plain
  106. {\tc \v Main Page}
  107. {
  108. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid \par
  109. {\qc
  110. {\b Introduction} (p.{\field\fldedit {\*\fldinst PAGEREF intro \\*MERGEFORMAT}{\fldrslt pagenum}})
  111. \~ \~ {\b Download} (p.{\field\fldedit {\*\fldinst PAGEREF download \\*MERGEFORMAT}{\fldrslt pagenum}})
  112. \~ \~ {\b Getting Started} (p.{\field\fldedit {\*\fldinst PAGEREF start \\*MERGEFORMAT}{\fldrslt pagenum}})
  113. \~ \~ {\b Error Handling} (p.{\field\fldedit {\*\fldinst PAGEREF error \\*MERGEFORMAT}{\fldrslt pagenum}})
  114. \~ \~ {\b Probing Device Capabilities} (p.{\field\fldedit {\*\fldinst PAGEREF probing \\*MERGEFORMAT}{\fldrslt pagenum}})
  115. \~ \~ {\b Device Settings} (p.{\field\fldedit {\*\fldinst PAGEREF settings \\*MERGEFORMAT}{\fldrslt pagenum}})
  116. \~ \~ {\b Playback (blocking functionality)} (p.{\field\fldedit {\*\fldinst PAGEREF playbackb \\*MERGEFORMAT}{\fldrslt pagenum}})
  117. \~ \~ {\b Playback (callback functionality)} (p.{\field\fldedit {\*\fldinst PAGEREF playbackc \\*MERGEFORMAT}{\fldrslt pagenum}})
  118. \~ \~ {\b Recording} (p.{\field\fldedit {\*\fldinst PAGEREF recording \\*MERGEFORMAT}{\fldrslt pagenum}})
  119. \~ \~ {\b Duplex Mode} (p.{\field\fldedit {\*\fldinst PAGEREF duplex \\*MERGEFORMAT}{\fldrslt pagenum}})
  120. \~ \~ {\b Summary of Methods} (p.{\field\fldedit {\*\fldinst PAGEREF methods \\*MERGEFORMAT}{\fldrslt pagenum}})
  121. \~ \~ {\b Compiling} (p.{\field\fldedit {\*\fldinst PAGEREF compiling \\*MERGEFORMAT}{\fldrslt pagenum}})
  122. \~ \~ {\b OS Notes} (p.{\field\fldedit {\*\fldinst PAGEREF osnotes \\*MERGEFORMAT}{\fldrslt pagenum}})
  123. \~ \~ {\b Acknowledgments} (p.{\field\fldedit {\*\fldinst PAGEREF acknowledge \\*MERGEFORMAT}{\fldrslt pagenum}})
  124. }\par
  125. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Introduction}
  126. Introduction\par
  127. {\bkmkstart intro}
  128. {\bkmkend intro}
  129. }\par
  130. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) is a C++ class which provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA and OSS), SGI, and Windows operating systems. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) significantly simplifies the process of interacting with computer audio hardware. It was designed with the following goals:\par
  131. { \par
  132. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  133. object oriented C++ design \par
  134. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  135. simple, common API across all supported platforms \par
  136. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  137. single independent header and source file for easy inclusion in programming projects (no libraries!) \par
  138. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  139. blocking functionality \par
  140. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  141. callback functionality \par
  142. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  143. extensive audio device parameter control \par
  144. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  145. audio device capability probing \par
  146. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  147. automatic internal conversion for data format, channel number compensation, de-interleaving, and byte-swapping \par
  148. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  149. control over multiple audio streams and devices with a single instance \par
  150. }{\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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. Multiple streams can run at the same time and, when allowed by the underlying audio API, a single device can serve multiple streams.\par
  151. The {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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.\par
  152. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Download}
  153. Download\par
  154. {\bkmkstart download}
  155. {\bkmkend download}
  156. }\par
  157. Latest Release (22 January 2002): {\f2 Version 2.0 (111 kB tar/gzipped)}\par
  158. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Getting Started}
  159. Getting Started\par
  160. {\bkmkstart start}
  161. {\bkmkend start}
  162. }\par
  163. The first thing that must be done when using {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) is to create an instance of the class. The default constructor {\b RtAudio::RtAudio}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a0 \\*MERGEFORMAT}{\fldrslt pagenum}}}) scans the underlying audio system to verify that at least one device is available. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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:\par
  164. {
  165. \par
  166. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #include "RtAudio.h"\line
  167. \line
  168. int main() \line
  169. \{\line
  170. RtAudio *audio;\line
  171. \line
  172. // Default RtAudio constructor\line
  173. try \{\line
  174. audio = new RtAudio();\line
  175. \}\line
  176. catch (RtAudioError &error) \{\line
  177. // Handle the exception here\line
  178. \}\line
  179. \line
  180. // Clean up\line
  181. delete audio;\line
  182. \}\par
  183. }
  184. Obviously, this example doesn't demonstrate any of the real functionality of {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}). However, all uses of {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) must begin with a constructor (either default or overloaded varieties) and must end with class destruction. Further, it is necessary that all class methods which can throw a C++ exception be called within a try/catch block.\par
  185. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Error Handling}
  186. Error Handling\par
  187. {\bkmkstart error}
  188. {\bkmkend error}
  189. }\par
  190. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) uses a C++ exception handler called {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}), which is declared and defined within the {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) class files. The {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) class is quite simple but it does allow errors to be "caught" by {\b RtAudioError::TYPE} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError_s11 \\*MERGEFORMAT}{\fldrslt pagenum}}}). Almost all {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) methods can "throw" an {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}), most typically if an invalid stream identifier is supplied to a method or a driver error occurs. There are a number of cases within {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) where warning messages may be displayed but an exception is not thrown. There is a private {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) method, error(), which can be modified to globally control how these messages are handled and reported.\par
  191. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Probing Device Capabilities}
  192. Probing Device Capabilities\par
  193. {\bkmkstart probing}
  194. {\bkmkend probing}
  195. }\par
  196. 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.\par
  197. {
  198. \par
  199. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid // probe.cpp\line
  200. \line
  201. #include <iostream.h>\line
  202. #include "RtAudio.h"\line
  203. \line
  204. int main() \line
  205. \{\line
  206. RtAudio *audio;\line
  207. \line
  208. // Default RtAudio constructor\line
  209. try \{\line
  210. audio = new RtAudio();\line
  211. \}\line
  212. catch (RtAudioError &error) \{\line
  213. error.printMessage();\line
  214. exit(EXIT_FAILURE);\line
  215. \}\line
  216. \line
  217. // Determine the number of devices available\line
  218. int devices = audio->getDeviceCount();\line
  219. \line
  220. // Scan through devices for various capabilities\line
  221. RtAudio::RTAUDIO_DEVICE info;\line
  222. for (int i=0; i<devices; i++) \{\line
  223. \line
  224. try \{\line
  225. audio->getDeviceInfo(i, &info);\line
  226. \}\line
  227. catch (RtAudioError &error) \{\line
  228. error.printMessage();\line
  229. break;\line
  230. \}\line
  231. \line
  232. // Print, for example, the maximum number of output channels for each device\line
  233. cout << "device = " << i;\line
  234. cout << ": maximum output channels = " << info.maxOutputChannels << endl;\line
  235. \}\line
  236. \line
  237. // Clean up\line
  238. delete audio;\line
  239. \line
  240. return 0;\line
  241. \}\par
  242. }
  243. The RTAUDIO_DEVICE structure is defined in {\b RtAudio.h} and provides a variety of information useful in assessing the capabilities of a device:\par
  244. {
  245. \par
  246. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid typedef struct \{\line
  247. char name[128];\line
  248. DEVICE_ID id[2]; // No value reported by getDeviceInfo().\line
  249. bool probed; // true if the device probe was successful.\line
  250. int maxOutputChannels;\line
  251. int maxInputChannels;\line
  252. int maxDuplexChannels;\line
  253. int minOutputChannels;\line
  254. int minInputChannels;\line
  255. int minDuplexChannels;\line
  256. bool hasDuplexSupport; // true if duplex supported\line
  257. int nSampleRates; // Number of discrete rates, or -1 if range supported.\line
  258. double sampleRates[MAX_SAMPLE_RATES]; // Supported sample rates, or \{min, max\} if range.\line
  259. RTAUDIO_FORMAT nativeFormats;\line
  260. \} RTAUDIO_DEVICE;\par
  261. }
  262. The following data formats are defined and fully supported by {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}):\par
  263. {
  264. \par
  265. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid typedef unsigned long RTAUDIO_FORMAT;\line
  266. static const RTAUDIO_FORMAT RTAUDIO_SINT8; // Signed 8-bit integer\line
  267. static const RTAUDIO_FORMAT RTAUDIO_SINT16; // Signed 16-bit integer\line
  268. static const RTAUDIO_FORMAT RTAUDIO_SINT24; // Signed 24-bit integer\line
  269. static const RTAUDIO_FORMAT RTAUDIO_SINT32; // Signed 32-bit integer\line
  270. static const RTAUDIO_FORMAT RTAUDIO_FLOAT32; // 32-bit float\line
  271. static const RTAUDIO_FORMAT RTAUDIO_FLOAT64; // 64-bit double\par
  272. }
  273. The {\i nativeFormats} member of the {\b RtAudio::RTAUDIO_DEVICE} ({\i p.{\field\fldedit {\*\fldinst PAGEREF structRtAudio_1_1RTAUDIO__DEVICE \\*MERGEFORMAT}{\fldrslt pagenum}}}) structure is a bit mask of the above formats which are natively supported by the device. However, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) will automatically provide format conversion if a particular format is not natively supported. When the {\i probed} member of the RTAUDIO_DEVICE structure is false, the remaining structure members are likely unknown and the device is probably unusable.\par
  274. In general, the user need not be concerned with the minimum channel values reported in the RTAUDIO_DEVICE structure. While some audio devices may require a minimum channel value > 1, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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 {\i NOT} possible when the number of channels set by the user is greater than that supported by the device.\par
  275. 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.\par
  276. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Device Settings}
  277. Device Settings\par
  278. {\bkmkstart settings}
  279. {\bkmkend settings}
  280. }\par
  281. The next step in using {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) is to open a stream with a particular set of device settings.\par
  282. {
  283. \par
  284. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #include "RtAudio.h"\line
  285. \line
  286. int main() \line
  287. \{\line
  288. int channels = 2;\line
  289. int sample_rate = 44100;\line
  290. int buffer_size = 256; // 256 sample frames\line
  291. int n_buffers = 4; // number of internal buffers used by device\line
  292. int device = 0; // 0 indicates the default or first available device\line
  293. int stream; // our stream identifier\line
  294. RtAudio *audio;\line
  295. \line
  296. // Instantiate RtAudio and open a stream within a try/catch block\line
  297. try \{\line
  298. audio = new RtAudio();\line
  299. stream = audio->openStream(device, channels, 0, 0, RtAudio::RTAUDIO_FLOAT32,\line
  300. sample_rate, &buffer_size, n_buffers);\line
  301. \}\line
  302. catch (RtAudioError &error) \{\line
  303. error.printMessage();\line
  304. exit(EXIT_FAILURE);\line
  305. \}\line
  306. \line
  307. // Clean up\line
  308. delete audio;\line
  309. \line
  310. return 0;\line
  311. \}\par
  312. }
  313. The {\b RtAudio::openStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a3 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method attempts to open a stream with a specified set of parameter values. When successful, a stream identifier is returned. In this case, we attempt to open a playback stream on device 0 with two channels, 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, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) first attempts to open the default audio device with the given parameters. If that attempt fails, an attempt is made to find a device or set of devices which will meet the given parameters. If all attempts are unsuccessful, an {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) is thrown. When a non-zero device value is specified, an attempt is made to open that device only.\par
  314. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) provides four signed integer and two floating point data formats which can be specified using the {\b RtAudio::RTAUDIO_FORMAT} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_s0 \\*MERGEFORMAT}{\fldrslt pagenum}}}) parameter values mentioned earlier. If the opened device does not natively support the given format, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) will automatically perform the necessary data format conversion.\par
  315. Buffer sizes in {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) are {\i ALWAYS} given in sample frame units. For example, if you open an output stream with 4 channels and set {\i bufferSize} to 512, you will have to write 2048 samples of data to the output buffer within your callback or between calls to {\b RtAudio::tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}). In this case, a single sample frame of data contains 4 samples of data.\par
  316. The {\i bufferSize} parameter specifies the desired number of sample frames which will be written to and/or read from a device per write/read operation. The {\i nBuffers} parameter is used in setting the underlying device buffer parameters. Both the {\i bufferSize} and {\i nBuffers} parameters can be used to control stream latency though there is no guarantee that the passed values will be those used by a device. 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 {\i bufferSize} parameter is passed as a pointer and the actual value used by the stream is set during the device setup procedure. {\i bufferSize} values should be a power of two. Optimal and allowable buffer values tend to vary between systems and devices. Check the {\b OS Notes} (p.{\field\fldedit {\*\fldinst PAGEREF osnotes \\*MERGEFORMAT}{\fldrslt pagenum}})
  317. section for general guidelines.\par
  318. 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, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) does not attempt to query a device's capabilities or use previously reported values when opening a device. Instead, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) simply attempts to set the given parameters on a specified device and then checks whether the setup is successful or not.\par
  319. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Playback (blocking functionality)}
  320. Playback (blocking functionality)\par
  321. {\bkmkstart playbackb}
  322. {\bkmkend playbackb}
  323. }\par
  324. 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.\par
  325. {
  326. \par
  327. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid // playback.cpp\line
  328. \line
  329. #include "RtAudio.h"\line
  330. \line
  331. int main() \line
  332. \{\line
  333. int count;\line
  334. int channels = 2;\line
  335. int sample_rate = 44100;\line
  336. int buffer_size = 256; // 256 sample frames\line
  337. int n_buffers = 4; // number of internal buffers used by device\line
  338. float *buffer;\line
  339. int device = 0; // 0 indicates the default or first available device\line
  340. int stream; // our stream identifier\line
  341. RtAudio *audio;\line
  342. \line
  343. // Open a stream during RtAudio instantiation\line
  344. try \{\line
  345. audio = new RtAudio(&stream, device, channels, 0, 0, RtAudio::RTAUDIO_FLOAT32,\line
  346. sample_rate, &buffer_size, n_buffers);\line
  347. \}\line
  348. catch (RtAudioError &error) \{\line
  349. error.printMessage();\line
  350. exit(EXIT_FAILURE);\line
  351. \}\line
  352. \line
  353. try \{\line
  354. // Get a pointer to the stream buffer\line
  355. buffer = (float *) audio->getStreamBuffer(stream);\line
  356. \line
  357. // Start the stream\line
  358. audio->startStream(stream);\line
  359. \}\line
  360. catch (RtAudioError &error) \{\line
  361. error.printMessage();\line
  362. goto cleanup;\line
  363. \}\line
  364. \line
  365. // An example loop which runs for about 40000 sample frames\line
  366. count = 0;\line
  367. while (count < 40000) \{\line
  368. // Generate your samples and fill the buffer with buffer_size sample frames of data\line
  369. ...\line
  370. \line
  371. // Trigger the output of the data buffer\line
  372. try \{\line
  373. audio->tickStream(stream);\line
  374. \}\line
  375. catch (RtAudioError &error) \{\line
  376. error.printMessage();\line
  377. goto cleanup;\line
  378. \}\line
  379. \line
  380. count += buffer_size;\line
  381. \}\line
  382. \line
  383. try \{\line
  384. // Stop and close the stream\line
  385. audio->stopStream(stream);\line
  386. audio->closeStream(stream);\line
  387. \}\line
  388. catch (RtAudioError &error) \{\line
  389. error.printMessage();\line
  390. \}\line
  391. \line
  392. cleanup:\line
  393. delete audio;\line
  394. \line
  395. return 0;\line
  396. \}\par
  397. }
  398. 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 {\b RtAudio::openStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a3 \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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. The integer identifier of the opened stream is returned via the {\i stream} pointer value. An attempt is made to open the stream with the specified {\i bufferSize} 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 {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) destructor if an exception is thrown during instantiation.\par
  399. Because {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) can be used to simultaneously control more than a single stream, it is necessary that the stream identifier be provided to nearly all public methods. Assuming the constructor is successful, it is necessary to get a pointer to the buffer, provided by {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}), for use in feeding data to/from the opened stream. Note that the user should {\i NOT} attempt to deallocate the stream buffer memory ... memory management for the stream buffer will be automatically controlled by {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}). After starting the stream with {\b RtAudio::startStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a11 \\*MERGEFORMAT}{\fldrslt pagenum}}}), one simply fills that buffer, which is of length equal to the returned {\i bufferSize} value, with interleaved audio data (in the specified format) for playback. Finally, a call to the {\b RtAudio::tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}) routine triggers a blocking write call for the stream.\par
  400. In general, one should call the {\b RtAudio::stopStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a12 \\*MERGEFORMAT}{\fldrslt pagenum}}}) and {\b RtAudio::closeStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a10 \\*MERGEFORMAT}{\fldrslt pagenum}}}) methods after finishing with a stream. However, both methods will implicitly be called during object destruction if necessary.\par
  401. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Playback (callback functionality)}
  402. Playback (callback functionality)\par
  403. {\bkmkstart playbackc}
  404. {\bkmkend playbackc}
  405. }\par
  406. The primary difference in using {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) with callback functionality involves the creation of a user-defined callback function. Here is an example which produces a sawtooth waveform for playback.\par
  407. {
  408. \par
  409. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #include <iostream.h>\line
  410. #include "RtAudio.h"\line
  411. \line
  412. // Two-channel sawtooth wave generator.\line
  413. int sawtooth(char *buffer, int buffer_size, void *data) \line
  414. \{\line
  415. int i, j;\line
  416. double *my_buffer = (double *) buffer;\line
  417. double *my_data = (double *) data;\line
  418. \line
  419. // Write interleaved audio data.\line
  420. for (i=0; i<buffer_size; i++) \{\line
  421. for (j=0; j<2; j++) \{\line
  422. *my_buffer++ = my_data[j];\line
  423. \line
  424. my_data[j] += 0.005 * (j+1+(j*0.1));\line
  425. if (my_data[j] >= 1.0) my_data[j] -= 2.0;\line
  426. \}\line
  427. \}\line
  428. \line
  429. return 0;\line
  430. \}\line
  431. \line
  432. int main() \line
  433. \{\line
  434. int channels = 2;\line
  435. int sample_rate = 44100;\line
  436. int buffer_size = 256; // 256 sample frames\line
  437. int n_buffers = 4; // number of internal buffers used by device\line
  438. int device = 0; // 0 indicates the default or first available device\line
  439. int stream; // our stream identifier\line
  440. double data[2];\line
  441. char input;\line
  442. RtAudio *audio;\line
  443. \line
  444. // Open a stream during RtAudio instantiation\line
  445. try \{\line
  446. audio = new RtAudio(&stream, device, channels, 0, 0, RtAudio::RTAUDIO_FLOAT64,\line
  447. sample_rate, &buffer_size, n_buffers);\line
  448. \}\line
  449. catch (RtAudioError &error) \{\line
  450. error.printMessage();\line
  451. exit(EXIT_FAILURE);\line
  452. \}\line
  453. \line
  454. try \{\line
  455. // Set the stream callback function\line
  456. audio->setStreamCallback(stream, &sawtooth, (void *)data);\line
  457. \line
  458. // Start the stream\line
  459. audio->startStream(stream);\line
  460. \}\line
  461. catch (RtAudioError &error) \{\line
  462. error.printMessage();\line
  463. goto cleanup;\line
  464. \}\line
  465. \line
  466. cout << "\\nPlaying ... press <enter> to quit.\\n";\line
  467. cin.get(input);\line
  468. \line
  469. try \{\line
  470. // Stop and close the stream\line
  471. audio->stopStream(stream);\line
  472. audio->closeStream(stream);\line
  473. \}\line
  474. catch (RtAudioError &error) \{\line
  475. error.printMessage();\line
  476. \}\line
  477. \line
  478. cleanup:\line
  479. delete audio;\line
  480. \line
  481. return 0;\line
  482. \}\par
  483. }
  484. 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 {\b RtAudio::setStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a4 \\*MERGEFORMAT}{\fldrslt pagenum}}}). This method will spawn a new process (or thread) which automatically calls the callback function when more data is needed. Note that the callback function is called only when the stream is "running" (between calls to the {\b RtAudio::startStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a11 \\*MERGEFORMAT}{\fldrslt pagenum}}}) and {\b RtAudio::stopStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a12 \\*MERGEFORMAT}{\fldrslt pagenum}}}) methods). The last argument to {\b RtAudio::setStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a4 \\*MERGEFORMAT}{\fldrslt pagenum}}}) is a pointer to arbitrary data that you wish to access from within your callback function.\par
  485. In this example, we stop the stream with an explicit call to {\b RtAudio::stopStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a12 \\*MERGEFORMAT}{\fldrslt pagenum}}}). When using callback functionality, it is also possible to stop a stream by returning a non-zero value from the callback function.\par
  486. Once set with {\b RtAudio::setStreamCallback} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a4 \\*MERGEFORMAT}{\fldrslt pagenum}}}), the callback process will continue to run for the life of the stream (until the stream is closed with {\b RtAudio::closeStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a10 \\*MERGEFORMAT}{\fldrslt pagenum}}}) or the {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) instance is deleted). It is possible to disassociate a callback function and cancel its process for an open stream using the {\b RtAudio::cancelStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a5 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method. The stream can then be used with blocking functionality or a new callback can be associated with it.\par
  487. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Recording}
  488. Recording\par
  489. {\bkmkstart recording}
  490. {\bkmkend recording}
  491. }\par
  492. Using {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) for audio input is almost identical to the way it is used for playback. Here's the blocking playback example rewritten for recording:\par
  493. {
  494. \par
  495. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid // record.cpp\line
  496. \line
  497. #include "RtAudio.h"\line
  498. \line
  499. int main() \line
  500. \{\line
  501. int count;\line
  502. int channels = 2;\line
  503. int sample_rate = 44100;\line
  504. int buffer_size = 256; // 256 sample frames\line
  505. int n_buffers = 4; // number of internal buffers used by device\line
  506. float *buffer;\line
  507. int device = 0; // 0 indicates the default or first available device\line
  508. int stream; // our stream identifier\line
  509. RtAudio *audio;\line
  510. \line
  511. // Instantiate RtAudio and open a stream.\line
  512. try \{\line
  513. audio = new RtAudio(&stream, 0, 0, device, channels,\line
  514. RtAudio::RTAUDIO_FLOAT32, sample_rate, &buffer_size, n_buffers);\line
  515. \}\line
  516. catch (RtAudioError &error) \{\line
  517. error.printMessage();\line
  518. exit(EXIT_FAILURE);\line
  519. \}\line
  520. \line
  521. try \{\line
  522. // Get a pointer to the stream buffer\line
  523. buffer = (float *) audio->getStreamBuffer(stream);\line
  524. \line
  525. // Start the stream\line
  526. audio->startStream(stream);\line
  527. \}\line
  528. catch (RtAudioError &error) \{\line
  529. error.printMessage();\line
  530. goto cleanup;\line
  531. \}\line
  532. \line
  533. // An example loop which runs for about 40000 sample frames\line
  534. count = 0;\line
  535. while (count < 40000) \{\line
  536. \line
  537. // Read a buffer of data\line
  538. try \{\line
  539. audio->tickStream(stream);\line
  540. \}\line
  541. catch (RtAudioError &error) \{\line
  542. error.printMessage();\line
  543. goto cleanup;\line
  544. \}\line
  545. \line
  546. // Process the input samples (buffer_size sample frames) that were read\line
  547. ...\line
  548. \line
  549. count += buffer_size;\line
  550. \}\line
  551. \line
  552. try \{\line
  553. // Stop the stream\line
  554. audio->stopStream(stream);\line
  555. \}\line
  556. catch (RtAudioError &error) \{\line
  557. error.printMessage();\line
  558. \}\line
  559. \line
  560. cleanup:\line
  561. delete audio;\line
  562. \line
  563. return 0;\line
  564. \}\par
  565. }
  566. In this example, the stream was opened for recording with a non-zero {\i inputChannels} 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.\par
  567. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Duplex Mode}
  568. Duplex Mode\par
  569. {\bkmkstart duplex}
  570. {\bkmkend duplex}
  571. }\par
  572. Finally, it is easy to use {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) for simultaneous audio input/output, or duplex operation. In this example, we use a callback function and pass our recorded data directly through for playback.\par
  573. {
  574. \par
  575. \pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid // duplex.cpp\line
  576. \line
  577. #include <iostream.h>\line
  578. #include "RtAudio.h"\line
  579. \line
  580. // Pass-through function.\line
  581. int pass(char *buffer, int buffer_size, void *) \line
  582. \{\line
  583. // Surprise!! We do nothing to pass the data through.\line
  584. return 0;\line
  585. \}\line
  586. \line
  587. int main() \line
  588. \{\line
  589. int channels = 2;\line
  590. int sample_rate = 44100;\line
  591. int buffer_size = 256; // 256 sample frames\line
  592. int n_buffers = 4; // number of internal buffers used by device\line
  593. int device = 0; // 0 indicates the default or first available device\line
  594. int stream; // our stream identifier\line
  595. double data[2];\line
  596. char input;\line
  597. RtAudio *audio;\line
  598. \line
  599. // Open a stream during RtAudio instantiation\line
  600. try \{\line
  601. audio = new RtAudio(&stream, device, channels, device, channels, RtAudio::RTAUDIO_FLOAT64,\line
  602. sample_rate, &buffer_size, n_buffers);\line
  603. \}\line
  604. catch (RtAudioError &error) \{\line
  605. error.printMessage();\line
  606. exit(EXIT_FAILURE);\line
  607. \}\line
  608. \line
  609. try \{\line
  610. // Set the stream callback function\line
  611. audio->setStreamCallback(stream, &pass, NULL);\line
  612. \line
  613. // Start the stream\line
  614. audio->startStream(stream);\line
  615. \}\line
  616. catch (RtAudioError &error) \{\line
  617. error.printMessage();\line
  618. goto cleanup;\line
  619. \}\line
  620. \line
  621. cout << "\\nRunning duplex ... press <enter> to quit.\\n";\line
  622. cin.get(input);\line
  623. \line
  624. try \{\line
  625. // Stop and close the stream\line
  626. audio->stopStream(stream);\line
  627. audio->closeStream(stream);\line
  628. \}\line
  629. catch (RtAudioError &error) \{\line
  630. error.printMessage();\line
  631. \}\line
  632. \line
  633. cleanup:\line
  634. delete audio;\line
  635. \line
  636. return 0;\line
  637. \}\par
  638. }
  639. When an {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) stream is running in duplex mode (nonzero input {\i AND} 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.\par
  640. As we see with this example, the write-read sequence of operations does not preclude the use of {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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 played out during the next round of audio processing.\par
  641. Note that duplex operation can also be achieved by opening one output stream and one input stream 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. This becomes even more difficult to achieve using two separate callback streams because it is not possible to explicitly control the calling order of the callback functions.\par
  642. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Summary of Methods}
  643. Summary of Methods\par
  644. {\bkmkstart methods}
  645. {\bkmkend methods}
  646. }\par
  647. The following is short summary of public methods (not including constructors and the destructor) provided by {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}):\par
  648. { \par
  649. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  650. {\b RtAudio::openStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a3 \\*MERGEFORMAT}{\fldrslt pagenum}}}): opens a stream with the specified parameters. \par
  651. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  652. {\b RtAudio::setStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a4 \\*MERGEFORMAT}{\fldrslt pagenum}}}): sets a user-defined callback function for a given stream. \par
  653. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  654. {\b RtAudio::cancelStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a5 \\*MERGEFORMAT}{\fldrslt pagenum}}}): cancels a callback process and function for a given stream. \par
  655. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  656. {\b RtAudio::getDeviceCount}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a6 \\*MERGEFORMAT}{\fldrslt pagenum}}}): returns the number of audio devices available. \par
  657. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  658. {\b RtAudio::getDeviceInfo}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a7 \\*MERGEFORMAT}{\fldrslt pagenum}}}): fills a user-supplied RTAUDIO_DEVICE structure for a specified device. \par
  659. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  660. {\b RtAudio::getStreamBuffer}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a8 \\*MERGEFORMAT}{\fldrslt pagenum}}}): returns a pointer to the stream buffer. \par
  661. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  662. {\b RtAudio::tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}): triggers processing of input/output data for a stream (blocking). \par
  663. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  664. {\b RtAudio::closeStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a10 \\*MERGEFORMAT}{\fldrslt pagenum}}}): closes the specified stream (implicitly called during object destruction). Once a stream is closed, the stream identifier is invalid and should not be used in calling any other {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) methods. \par
  665. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  666. {\b RtAudio::startStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a11 \\*MERGEFORMAT}{\fldrslt pagenum}}}): (re)starts the specified stream, typically after it has been stopped with either stopStream() or abortStream() or after first opening the stream. \par
  667. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  668. {\b RtAudio::stopStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a12 \\*MERGEFORMAT}{\fldrslt pagenum}}}): stops the specified stream, allowing any remaining samples in the queue to be played out and/or read in. This does not implicitly call {\b RtAudio::closeStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a10 \\*MERGEFORMAT}{\fldrslt pagenum}}}). \par
  669. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  670. {\b RtAudio::abortStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a13 \\*MERGEFORMAT}{\fldrslt pagenum}}}): stops the specified stream, discarding any remaining samples in the queue. This does not implicitly call closeStream(). \par
  671. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  672. {\b RtAudio::streamWillBlock}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a14 \\*MERGEFORMAT}{\fldrslt pagenum}}}): queries a stream to determine whether a call to the {\i tickStream()} method will block. A return value of 0 indicates that the stream will NOT block. A positive return value indicates the number of sample frames that cannot yet be processed without blocking. \par
  673. }{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Compiling}
  674. Compiling\par
  675. {\bkmkstart compiling}
  676. {\bkmkend compiling}
  677. }\par
  678. In order to compile {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) for a specific OS and audio API, it is necessary to supply the appropriate preprocessor definition and library within the compiler statement: \par
  679. \par
  680. {\b OS:} {\b Audio API:} {\b Preprocessor Definition:} {\b Library:} {\b Example Compiler Statement:} Linux ALSA __LINUX_ALSA_ {\f2 libasound, libpthread} {\f2 g++ -Wall -D__LINUX_ALSA_ -o probe probe.cpp RtAudio.cpp -lasound -lpthread} Linux OSS __LINUX_OSS_ {\f2 libpthread} {\f2 g++ -Wall -D__LINUX_OSS_ -o probe probe.cpp RtAudio.cpp -lpthread} Irix AL __IRIX_AL_ {\f2 libaudio, libpthread} {\f2 CC -Wall -D__IRIX_AL_ -o probe probe.cpp RtAudio.cpp -laudio -lpthread} Windows Direct Sound __WINDOWS_DS_ {\f2 dsound.lib (ver. 5.0 or higher), multithreaded} {\i compiler specific} \par
  681. \par
  682. The example compiler statements above could be used to compile the {\f2 probe.cpp} example file, assuming that {\f2 probe.cpp}, {\f2 {\b RtAudio.h}}, and {\f2 RtAudio.cpp} all exist in the same directory.\par
  683. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v OS Notes}
  684. OS Notes\par
  685. {\bkmkstart osnotes}
  686. {\bkmkend osnotes}
  687. }\par
  688. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) is designed to provide a common API across the various supported operating systems and audio libraries. Despite that, however, some issues need to be mentioned with regard to each.\par
  689. {\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid {\tc\tcl3 \v Linux:}
  690. Linux:\par
  691. {\bkmkstart linux}
  692. {\bkmkend linux}
  693. }\par
  694. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) for Linux was developed under Redhat distributions 7.0 - 7.2. Two different audio APIs are supported on Linux platforms: OSS and {\f2 ALSA}. 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. The ALSA API is relatively new and at this time is not part of the Linux kernel distribution. Work is in progress to make ALSA part of the 2.5 development kernel series. Despite that, the ALSA API offers significantly better functionality than the OSS API. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) provides support for the 0.9 and higher versions of ALSA. Input/output latency on the order of 15-20 milliseconds can typically be achieved under both OSS or ALSA by fine-tuning the {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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.\par
  695. 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 {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) tests, it is recommended that the native ALSA implementation of {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) be used on systems which have ALSA drivers installed.\par
  696. The ALSA implementation of {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) makes no use of the ALSA "plug" interface. All necessary data format conversions, channel compensation, deinterleaving, and byte-swapping is handled by internal {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) routines.\par
  697. {\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid {\tc\tcl3 \v Irix (SGI):}
  698. Irix (SGI):\par
  699. {\bkmkstart irix}
  700. {\bkmkend irix}
  701. }\par
  702. The Irix version of {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) was written and tested on an SGI Indy running Irix version 6.5 and the newer "al" audio library. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) does not compile under Irix version 6.3 because the C++ compiler is too old. Despite the relatively slow speed of the Indy, {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) was found to behave quite well and input/output latency was very good. No problems were found with respect to using the pthread library.\par
  703. {\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid {\tc\tcl3 \v Windows:}
  704. Windows:\par
  705. {\bkmkstart windows}
  706. {\bkmkend windows}
  707. }\par
  708. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) under Windows is written using the DirectSound API. In order to compile {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) under Windows, you must have the header and source files for DirectSound version 0.5 or higher. As far as I know, you cannot compile {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) for Windows NT because there is not sufficient DirectSound support. Audio output latency with DirectSound can be reasonably good (on the order of 20 milliseconds). On the other hand, input audio latency tends to be terrible (100 milliseconds or more). Further, DirectSound drivers tend to crash easily when experimenting with buffer parameters. On my system, I found it necessary to use values around nBuffers = 8 and bufferSize = 512 to avoid crashing my system. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) was developed with Visual C++ version 6.0. I was forced in several instances to modify code in order to get it to compile under the non-standard version of C++ that Microsoft so unprofessionally implemented. We can only hope that the developers of Visual C++ 7.0 will have time to read the C++ standard.\par
  709. {\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid {\tc\tcl2 \v Acknowledgments}
  710. Acknowledgments\par
  711. {\bkmkstart acknowledge}
  712. {\bkmkend acknowledge}
  713. }\par
  714. The {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) API incorporates many of the concepts developed in the {\f2 PortAudio} project by Phil Burk and Ross Bencina. Early development also incorporated ideas from Bill Schottstaedt's {\f2 sndlib}. The CCRMA {\f2 SoundWire group} provided valuable feedback during the API proposal stages.\par
  715. {\b RtAudio} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}}) was slowly developed over the course of many months while in residence at the {\f2 Institut Universitari de L'Audiovisual (IUA)} in Barcelona, Spain, the {\f2 Laboratory of Acoustics and Audio Signal Processing} at the Helsinki University of Technology, Finland, and the {\f2 Center for Computer Research in Music and Acoustics (CCRMA)} at {\f2 Stanford University}. This work was supported in part by the United States Air Force Office of Scientific Research (grant #F49620-99-1-0293).\par
  716. These documentation files were generated using {\f2 doxygen} by Dimitri van Heesch.\par
  717. \par
  718. }
  719. \pard\plain \sect\sbkpage
  720. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
  721. RtAudio Compound Index\par \pard\plain
  722. {\tc \v Compound Index}
  723. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  724. RtAudio Compound List\par \pard\plain
  725. {
  726. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid Here are the classes, structs, unions and interfaces with brief descriptions:\par
  727. }
  728. {
  729. \pard\plain \s71\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid
  730. {\b RtAudio} \tab {\field\fldedit {\*\fldinst PAGEREF classRtAudio \\*MERGEFORMAT}{\fldrslt pagenum}}
  731. \par
  732. {\b RtAudio::RTAUDIO_DEVICE} \tab {\field\fldedit {\*\fldinst PAGEREF structRtAudio_1_1RTAUDIO__DEVICE \\*MERGEFORMAT}{\fldrslt pagenum}}
  733. \par
  734. {\b RtAudioError} \tab {\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}
  735. \par
  736. \par
  737. }
  738. \pard\plain \sect\sbkpage
  739. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
  740. RtAudio File Index\par \pard\plain
  741. {\tc \v File Index}
  742. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  743. RtAudio File List\par \pard\plain
  744. {
  745. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid Here is a list of all files with brief descriptions:\par
  746. }
  747. {
  748. \pard\plain \s71\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid
  749. {\b RtAudio.h} \tab {\field\fldedit {\*\fldinst PAGEREF RtAudio_8h \\*MERGEFORMAT}{\fldrslt pagenum}}
  750. \par
  751. \par
  752. }\sect \sbkpage \pgnrestart
  753. \sect \sectd \sbknone \pgndec
  754. {\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}}
  755. \pard\plain \sect\sbkpage
  756. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
  757. RtAudio Class Documentation{\tc \v Class Documentation}
  758. \par \pard\plain
  759. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  760. RtAudio Class Reference\par \pard\plain
  761. {\tc\tcl2 \v RtAudio}
  762. {\xe \v RtAudio}
  763. {\bkmkstart classRtAudio}
  764. {\bkmkend }
  765. {
  766. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\f2 #include <RtAudio.h>}\par
  767. \par
  768. }
  769. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  770. Public Types\par
  771. \pard\plain
  772. {
  773. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  774. typedef unsigned long {\b RTAUDIO_FORMAT}\par
  775. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  776. typedef int (* {\b RTAUDIO_CALLBACK} )(char *buffer, int bufferSize, void *userData)\par
  777. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  778. enum \{ {\b MAX_SAMPLE_RATES} = 14
  779. \}\par
  780. }
  781. \par
  782. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  783. Public Methods\par
  784. \pard\plain
  785. {
  786. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  787. {\b RtAudio} ()\par
  788. {
  789. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i The default constructor.}\par
  790. \par}
  791. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  792. {\b RtAudio} (int *streamID, int outputDevice, int outputChannels, int inputDevice, int inputChannels, {\b RTAUDIO_FORMAT} format, int sampleRate, int *bufferSize, int numberOfBuffers)\par
  793. {
  794. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i A constructor which can be used to open a stream during instantiation.}\par
  795. \par}
  796. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  797. {\b ~RtAudio} ()\par
  798. {
  799. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i The destructor.}\par
  800. \par}
  801. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  802. int {\b openStream} (int outputDevice, int outputChannels, int inputDevice, int inputChannels, {\b RTAUDIO_FORMAT} format, int sampleRate, int *bufferSize, int numberOfBuffers)\par
  803. {
  804. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i A public method for opening a stream with the specified parameters.}\par
  805. \par}
  806. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  807. void {\b setStreamCallback} (int streamID, {\b RTAUDIO_CALLBACK} callback, void *userData)\par
  808. {
  809. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i A public method which sets a user-defined callback function for a given stream.}\par
  810. \par}
  811. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  812. void {\b cancelStreamCallback} (int streamID)\par
  813. {
  814. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i A public method which cancels a callback process and function for a given stream.}\par
  815. \par}
  816. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  817. int {\b getDeviceCount} (void)\par
  818. {
  819. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i A public method which returns the number of audio devices found.}\par
  820. \par}
  821. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  822. void {\b getDeviceInfo} (int device, {\b RTAUDIO_DEVICE} *info)\par
  823. {
  824. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Fill a user-supplied {\b RTAUDIO_DEVICE} ({\i p.{\field\fldedit {\*\fldinst PAGEREF structRtAudio_1_1RTAUDIO__DEVICE \\*MERGEFORMAT}{\fldrslt pagenum}}}) structure for a specified device.}\par
  825. \par}
  826. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  827. char* const {\b getStreamBuffer} (int streamID)\par
  828. {
  829. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i A public method which returns a pointer to the buffer for an open stream.}\par
  830. \par}
  831. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  832. void {\b tickStream} (int streamID)\par
  833. {
  834. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Public method used to trigger processing of input/output data for a stream.}\par
  835. \par}
  836. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  837. void {\b closeStream} (int streamID)\par
  838. {
  839. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Public method which closes a stream and frees any associated buffers.}\par
  840. \par}
  841. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  842. void {\b startStream} (int streamID)\par
  843. {
  844. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Public method which starts a stream.}\par
  845. \par}
  846. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  847. void {\b stopStream} (int streamID)\par
  848. {
  849. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Stop a stream, allowing any samples remaining in the queue to be played out and/or read in.}\par
  850. \par}
  851. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  852. void {\b abortStream} (int streamID)\par
  853. {
  854. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Stop a stream, discarding any samples remaining in the input/output queue.}\par
  855. \par}
  856. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  857. int {\b streamWillBlock} (int streamID)\par
  858. {
  859. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Queries a stream to determine whether a call to the {\b tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method will block.}\par
  860. \par}
  861. }
  862. \par
  863. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  864. Static Public Attributes\par
  865. \pard\plain
  866. {
  867. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  868. const {\b RTAUDIO_FORMAT} {\b RTAUDIO_SINT8}\par
  869. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  870. const {\b RTAUDIO_FORMAT} {\b RTAUDIO_SINT16}\par
  871. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  872. const {\b RTAUDIO_FORMAT} {\b RTAUDIO_SINT24}\par
  873. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  874. const {\b RTAUDIO_FORMAT} {\b RTAUDIO_SINT32}\par
  875. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  876. const {\b RTAUDIO_FORMAT} {\b RTAUDIO_FLOAT32}\par
  877. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  878. const {\b RTAUDIO_FORMAT} {\b RTAUDIO_FLOAT64}\par
  879. }
  880. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  881. \par
  882. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  883. Member Typedef Documentation\par
  884. \pard\plain
  885. {\xe \v RTAUDIO_FORMAT\:RtAudio}
  886. {\xe \v RtAudio\:RTAUDIO_FORMAT}
  887. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  888. {\b
  889. typedef unsigned long RtAudio::RTAUDIO_FORMAT}
  890. }\par
  891. {\bkmkstart classRtAudio_s0}
  892. {\bkmkend classRtAudio_s0}
  893. {
  894. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  895. }
  896. {\xe \v RTAUDIO_CALLBACK\:RtAudio}
  897. {\xe \v RtAudio\:RTAUDIO_CALLBACK}
  898. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  899. {\b
  900. typedef int(* RtAudio::RTAUDIO_CALLBACK)(char *buffer, int bufferSize, void *userData)}
  901. }\par
  902. {\bkmkstart classRtAudio_s1}
  903. {\bkmkend classRtAudio_s1}
  904. {
  905. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  906. }
  907. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  908. \par
  909. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  910. Member Enumeration Documentation\par
  911. \pard\plain
  912. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  913. {\b
  914. anonymous enum}
  915. }\par
  916. {\bkmkstart classRtAudio_s3}
  917. {\bkmkend classRtAudio_s3}
  918. {
  919. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  920. {\par
  921. {\b Enumeration values:}\par
  922. \pard\plain \s62\li720\widctlpar\ql\adjustright \fs20\cgrid {
  923. {\xe \v MAX_SAMPLE_RATES\:RtAudio}
  924. {\xe \v RtAudio\:MAX_SAMPLE_RATES}
  925. {\b {\i MAX_SAMPLE_RATES}{\bkmkstart classRtAudio_s3s2}
  926. {\bkmkend classRtAudio_s3s2}
  927. } \par
  928. }
  929. \par
  930. }
  931. }
  932. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  933. \par
  934. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  935. Constructor & Destructor Documentation\par
  936. \pard\plain
  937. {\xe \v RtAudio\:RtAudio}
  938. {\xe \v RtAudio\:RtAudio}
  939. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  940. {\b
  941. RtAudio::RtAudio ()}
  942. }\par
  943. {\bkmkstart classRtAudio_a0}
  944. {\bkmkend classRtAudio_a0}
  945. {
  946. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  947. The default constructor.\par
  948. 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 {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) error can be thrown if no devices are found or if a memory allocation error occurs. \par
  949. }
  950. {\xe \v RtAudio\:RtAudio}
  951. {\xe \v RtAudio\:RtAudio}
  952. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  953. {\b
  954. RtAudio::RtAudio (int * {\i streamID}, int {\i outputDevice}, int {\i outputChannels}, int {\i inputDevice}, int {\i inputChannels}, {\b RTAUDIO_FORMAT} {\i format}, int {\i sampleRate}, int * {\i bufferSize}, int {\i numberOfBuffers})}
  955. }\par
  956. {\bkmkstart classRtAudio_a1}
  957. {\bkmkend classRtAudio_a1}
  958. {
  959. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  960. A constructor which can be used to open a stream during instantiation.\par
  961. The specified output and/or input device identifiers correspond to those enumerated via the {\b getDeviceInfo}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a7 \\*MERGEFORMAT}{\fldrslt pagenum}}}) 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 {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) can be thrown if no devices are found for the given parameters, if a memory allocation error occurs, or if a driver error occurs. {\par
  962. {\b See also: }\par
  963. \pard\plain \s62\li720\widctlpar\ql\adjustright \fs20\cgrid {\b openStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a3 \\*MERGEFORMAT}{\fldrslt pagenum}}}) \par
  964. }}
  965. {\xe \v ~RtAudio\:RtAudio}
  966. {\xe \v RtAudio\:~RtAudio}
  967. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  968. {\b
  969. RtAudio::~RtAudio ()}
  970. }\par
  971. {\bkmkstart classRtAudio_a2}
  972. {\bkmkend classRtAudio_a2}
  973. {
  974. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  975. The destructor.\par
  976. Stops and closes any open streams and devices and deallocates buffer and structure memory. \par
  977. }
  978. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  979. \par
  980. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  981. Member Function Documentation\par
  982. \pard\plain
  983. {\xe \v openStream\:RtAudio}
  984. {\xe \v RtAudio\:openStream}
  985. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  986. {\b
  987. int RtAudio::openStream (int {\i outputDevice}, int {\i outputChannels}, int {\i inputDevice}, int {\i inputChannels}, {\b RTAUDIO_FORMAT} {\i format}, int {\i sampleRate}, int * {\i bufferSize}, int {\i numberOfBuffers})}
  988. }\par
  989. {\bkmkstart classRtAudio_a3}
  990. {\bkmkend classRtAudio_a3}
  991. {
  992. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  993. A public method for opening a stream with the specified parameters.\par
  994. If successful, the opened stream ID is returned. Otherwise, an {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) is thrown.{\par
  995. {\b Parameters: }\par
  996. \pard\plain \s62\li720\widctlpar\ql\adjustright \fs20\cgrid {
  997. {\b {\i outputDevice:}} 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 {\b getDeviceInfo}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a7 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method. \par
  998. {\b {\i outputChannels:}} The desired number of output channels. If equal to zero, the outputDevice identifier is ignored. \par
  999. {\b {\i inputDevice:}} 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 {\b getDeviceInfo}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a7 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method. \par
  1000. {\b {\i inputChannels:}} The desired number of input channels. If equal to zero, the inputDevice identifier is ignored. \par
  1001. {\b {\i format:}} An RTAUDIO_FORMAT specifying the desired sample data format. \par
  1002. {\b {\i sampleRate:}} The desired sample rate (sample frames per second). \par
  1003. {\b {\i bufferSize:}} 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. \par
  1004. {\b {\i numberOfBuffers:}} 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. \par
  1005. }
  1006. \par
  1007. }}
  1008. {\xe \v setStreamCallback\:RtAudio}
  1009. {\xe \v RtAudio\:setStreamCallback}
  1010. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1011. {\b
  1012. void RtAudio::setStreamCallback (int {\i streamID}, {\b RTAUDIO_CALLBACK} {\i callback}, void * {\i userData})}
  1013. }\par
  1014. {\bkmkstart classRtAudio_a4}
  1015. {\bkmkend classRtAudio_a4}
  1016. {
  1017. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1018. A public method which sets a user-defined callback function for a given stream.\par
  1019. This method assigns a callback function to a specific, 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 {\b startStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a11 \\*MERGEFORMAT}{\fldrslt pagenum}}}) and {\b stopStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a12 \\*MERGEFORMAT}{\fldrslt pagenum}}}) methods, respectively). The callback process remains active for the duration of the stream and is automatically shutdown when the stream is closed (via the {\b closeStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a10 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method or by object destruction). The callback process can also be shutdown and the user function de-referenced through an explicit call to the {\b cancelStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a5 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method. Note that a single stream can use only blocking or callback functionality at the same time, though it is possible to alternate modes on the same stream through the use of the {\b setStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a4 \\*MERGEFORMAT}{\fldrslt pagenum}}}) and {\b cancelStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a5 \\*MERGEFORMAT}{\fldrslt pagenum}}}) methods (the blocking {\b tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method can be used before a callback is set and/or after a callback is cancelled). An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid device argument. \par
  1020. }
  1021. {\xe \v cancelStreamCallback\:RtAudio}
  1022. {\xe \v RtAudio\:cancelStreamCallback}
  1023. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1024. {\b
  1025. void RtAudio::cancelStreamCallback (int {\i streamID})}
  1026. }\par
  1027. {\bkmkstart classRtAudio_a5}
  1028. {\bkmkend classRtAudio_a5}
  1029. {
  1030. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1031. A public method which cancels a callback process and function for a given stream.\par
  1032. This method shuts down a callback process and de-references the user function for a specific stream. Callback functionality can subsequently be restarted on the stream via the {\b setStreamCallback}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a4 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method. An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid device argument. \par
  1033. }
  1034. {\xe \v getDeviceCount\:RtAudio}
  1035. {\xe \v RtAudio\:getDeviceCount}
  1036. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1037. {\b
  1038. int RtAudio::getDeviceCount (void)}
  1039. }\par
  1040. {\bkmkstart classRtAudio_a6}
  1041. {\bkmkend classRtAudio_a6}
  1042. {
  1043. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1044. A public method which returns the number of audio devices found.\par
  1045. }
  1046. {\xe \v getDeviceInfo\:RtAudio}
  1047. {\xe \v RtAudio\:getDeviceInfo}
  1048. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1049. {\b
  1050. void RtAudio::getDeviceInfo (int {\i device}, {\b RTAUDIO_DEVICE} * {\i info})}
  1051. }\par
  1052. {\bkmkstart classRtAudio_a7}
  1053. {\bkmkend classRtAudio_a7}
  1054. {
  1055. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1056. Fill a user-supplied {\b RTAUDIO_DEVICE} ({\i p.{\field\fldedit {\*\fldinst PAGEREF structRtAudio_1_1RTAUDIO__DEVICE \\*MERGEFORMAT}{\fldrslt pagenum}}}) structure for a specified device.\par
  1057. Any device between 0 and {\b getDeviceCount}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a6 \\*MERGEFORMAT}{\fldrslt pagenum}}})-1 is valid. If a device is busy or otherwise unavailable, the structure member "probed" has a value of "false". The system default input and output devices are referenced by device identifier = 0. On systems which allow dynamic default device settings, the default devices are not identified by name (specific device enumerations are assigned device identifiers > 0). An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid device argument. \par
  1058. }
  1059. {\xe \v getStreamBuffer\:RtAudio}
  1060. {\xe \v RtAudio\:getStreamBuffer}
  1061. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1062. {\b
  1063. char *const RtAudio::getStreamBuffer (int {\i streamID})}
  1064. }\par
  1065. {\bkmkstart classRtAudio_a8}
  1066. {\bkmkend classRtAudio_a8}
  1067. {
  1068. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1069. A public method which returns a pointer to the buffer for an open stream.\par
  1070. The user should fill and/or read the buffer data in interleaved format and then call the {\b tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method. An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid stream identifier. \par
  1071. }
  1072. {\xe \v tickStream\:RtAudio}
  1073. {\xe \v RtAudio\:tickStream}
  1074. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1075. {\b
  1076. void RtAudio::tickStream (int {\i streamID})}
  1077. }\par
  1078. {\bkmkstart classRtAudio_a9}
  1079. {\bkmkend classRtAudio_a9}
  1080. {
  1081. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1082. Public method used to trigger processing of input/output data for a stream.\par
  1083. This method blocks until all buffer data is read/written. An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid stream identifier or if a driver error occurs. \par
  1084. }
  1085. {\xe \v closeStream\:RtAudio}
  1086. {\xe \v RtAudio\:closeStream}
  1087. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1088. {\b
  1089. void RtAudio::closeStream (int {\i streamID})}
  1090. }\par
  1091. {\bkmkstart classRtAudio_a10}
  1092. {\bkmkend classRtAudio_a10}
  1093. {
  1094. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1095. Public method which closes a stream and frees any associated buffers.\par
  1096. If an invalid stream identifier is specified, this method issues a warning and returns (an {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) is not thrown). \par
  1097. }
  1098. {\xe \v startStream\:RtAudio}
  1099. {\xe \v RtAudio\:startStream}
  1100. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1101. {\b
  1102. void RtAudio::startStream (int {\i streamID})}
  1103. }\par
  1104. {\bkmkstart classRtAudio_a11}
  1105. {\bkmkend classRtAudio_a11}
  1106. {
  1107. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1108. Public method which starts a stream.\par
  1109. An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid stream identifier or if a driver error occurs. \par
  1110. }
  1111. {\xe \v stopStream\:RtAudio}
  1112. {\xe \v RtAudio\:stopStream}
  1113. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1114. {\b
  1115. void RtAudio::stopStream (int {\i streamID})}
  1116. }\par
  1117. {\bkmkstart classRtAudio_a12}
  1118. {\bkmkend classRtAudio_a12}
  1119. {
  1120. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1121. Stop a stream, allowing any samples remaining in the queue to be played out and/or read in.\par
  1122. An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid stream identifier or if a driver error occurs. \par
  1123. }
  1124. {\xe \v abortStream\:RtAudio}
  1125. {\xe \v RtAudio\:abortStream}
  1126. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1127. {\b
  1128. void RtAudio::abortStream (int {\i streamID})}
  1129. }\par
  1130. {\bkmkstart classRtAudio_a13}
  1131. {\bkmkend classRtAudio_a13}
  1132. {
  1133. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1134. Stop a stream, discarding any samples remaining in the input/output queue.\par
  1135. An {\b RtAudioError} ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudioError \\*MERGEFORMAT}{\fldrslt pagenum}}}) will be thrown for an invalid stream identifier or if a driver error occurs. \par
  1136. }
  1137. {\xe \v streamWillBlock\:RtAudio}
  1138. {\xe \v RtAudio\:streamWillBlock}
  1139. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1140. {\b
  1141. int RtAudio::streamWillBlock (int {\i streamID})}
  1142. }\par
  1143. {\bkmkstart classRtAudio_a14}
  1144. {\bkmkend classRtAudio_a14}
  1145. {
  1146. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1147. Queries a stream to determine whether a call to the {\b tickStream}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a9 \\*MERGEFORMAT}{\fldrslt pagenum}}}) method will block.\par
  1148. A return value of 0 indicates that the stream will NOT block. A positive return value indicates the number of sample frames that cannot yet be processed without blocking. \par
  1149. }
  1150. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1151. \par
  1152. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1153. Member Data Documentation\par
  1154. \pard\plain
  1155. {\xe \v RTAUDIO_SINT8\:RtAudio}
  1156. {\xe \v RtAudio\:RTAUDIO_SINT8}
  1157. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1158. {\b
  1159. const {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_SINT8{\f2 [static]}}
  1160. }\par
  1161. {\bkmkstart classRtAudio_p0}
  1162. {\bkmkend classRtAudio_p0}
  1163. {
  1164. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1165. }
  1166. {\xe \v RTAUDIO_SINT16\:RtAudio}
  1167. {\xe \v RtAudio\:RTAUDIO_SINT16}
  1168. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1169. {\b
  1170. const {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_SINT16{\f2 [static]}}
  1171. }\par
  1172. {\bkmkstart classRtAudio_p1}
  1173. {\bkmkend classRtAudio_p1}
  1174. {
  1175. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1176. }
  1177. {\xe \v RTAUDIO_SINT24\:RtAudio}
  1178. {\xe \v RtAudio\:RTAUDIO_SINT24}
  1179. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1180. {\b
  1181. const {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_SINT24{\f2 [static]}}
  1182. }\par
  1183. {\bkmkstart classRtAudio_p2}
  1184. {\bkmkend classRtAudio_p2}
  1185. {
  1186. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1187. Upper 3 bytes of 32-bit integer. \par
  1188. }
  1189. {\xe \v RTAUDIO_SINT32\:RtAudio}
  1190. {\xe \v RtAudio\:RTAUDIO_SINT32}
  1191. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1192. {\b
  1193. const {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_SINT32{\f2 [static]}}
  1194. }\par
  1195. {\bkmkstart classRtAudio_p3}
  1196. {\bkmkend classRtAudio_p3}
  1197. {
  1198. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1199. }
  1200. {\xe \v RTAUDIO_FLOAT32\:RtAudio}
  1201. {\xe \v RtAudio\:RTAUDIO_FLOAT32}
  1202. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1203. {\b
  1204. const {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_FLOAT32{\f2 [static]}}
  1205. }\par
  1206. {\bkmkstart classRtAudio_p4}
  1207. {\bkmkend classRtAudio_p4}
  1208. {
  1209. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1210. Normalized between plus/minus 1.0. \par
  1211. }
  1212. {\xe \v RTAUDIO_FLOAT64\:RtAudio}
  1213. {\xe \v RtAudio\:RTAUDIO_FLOAT64}
  1214. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1215. {\b
  1216. const {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_FLOAT64{\f2 [static]}}
  1217. }\par
  1218. {\bkmkstart classRtAudio_p5}
  1219. {\bkmkend classRtAudio_p5}
  1220. {
  1221. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1222. Normalized between plus/minus 1.0. \par
  1223. }
  1224. {
  1225. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1226. The documentation for this class was generated from the following file:{\par
  1227. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  1228. {\b RtAudio.h}\par
  1229. }}
  1230. \par \pard\plain
  1231. \pard\plain \sect\sbkpage
  1232. \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1233. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1234. RtAudio::RTAUDIO_DEVICE Struct Reference\par \pard\plain
  1235. {\tc\tcl2 \v RtAudio::RTAUDIO_DEVICE}
  1236. {\xe \v RtAudio::RTAUDIO_DEVICE}
  1237. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE}
  1238. {\bkmkend }
  1239. {
  1240. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\f2 #include <RtAudio.h>}\par
  1241. \par
  1242. }
  1243. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1244. Public Attributes\par
  1245. \pard\plain
  1246. {
  1247. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1248. char {\b name} [128]\par
  1249. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1250. DEVICE_ID {\b id} [2]\par
  1251. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1252. bool {\b probed}\par
  1253. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1254. int {\b maxOutputChannels}\par
  1255. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1256. int {\b maxInputChannels}\par
  1257. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1258. int {\b maxDuplexChannels}\par
  1259. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1260. int {\b minOutputChannels}\par
  1261. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1262. int {\b minInputChannels}\par
  1263. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1264. int {\b minDuplexChannels}\par
  1265. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1266. bool {\b hasDuplexSupport}\par
  1267. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1268. int {\b nSampleRates}\par
  1269. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1270. int {\b sampleRates} [MAX_SAMPLE_RATES]\par
  1271. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1272. {\b RTAUDIO_FORMAT} {\b nativeFormats}\par
  1273. }
  1274. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1275. \par
  1276. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1277. Member Data Documentation\par
  1278. \pard\plain
  1279. {\xe \v name\:RtAudio::RTAUDIO_DEVICE}
  1280. {\xe \v RtAudio::RTAUDIO_DEVICE\:name}
  1281. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1282. {\b
  1283. char RtAudio::RTAUDIO_DEVICE::name}
  1284. }\par
  1285. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m0}
  1286. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m0}
  1287. {
  1288. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1289. }
  1290. {\xe \v id\:RtAudio::RTAUDIO_DEVICE}
  1291. {\xe \v RtAudio::RTAUDIO_DEVICE\:id}
  1292. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1293. {\b
  1294. DEVICE_ID RtAudio::RTAUDIO_DEVICE::id}
  1295. }\par
  1296. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m1}
  1297. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m1}
  1298. {
  1299. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1300. No value reported by {\b getDeviceInfo}() ({\i p.{\field\fldedit {\*\fldinst PAGEREF classRtAudio_a7 \\*MERGEFORMAT}{\fldrslt pagenum}}}). \par
  1301. }
  1302. {\xe \v probed\:RtAudio::RTAUDIO_DEVICE}
  1303. {\xe \v RtAudio::RTAUDIO_DEVICE\:probed}
  1304. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1305. {\b
  1306. bool RtAudio::RTAUDIO_DEVICE::probed}
  1307. }\par
  1308. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m2}
  1309. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m2}
  1310. {
  1311. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1312. true if the device capabilities were successfully probed. \par
  1313. }
  1314. {\xe \v maxOutputChannels\:RtAudio::RTAUDIO_DEVICE}
  1315. {\xe \v RtAudio::RTAUDIO_DEVICE\:maxOutputChannels}
  1316. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1317. {\b
  1318. int RtAudio::RTAUDIO_DEVICE::maxOutputChannels}
  1319. }\par
  1320. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m3}
  1321. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m3}
  1322. {
  1323. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1324. }
  1325. {\xe \v maxInputChannels\:RtAudio::RTAUDIO_DEVICE}
  1326. {\xe \v RtAudio::RTAUDIO_DEVICE\:maxInputChannels}
  1327. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1328. {\b
  1329. int RtAudio::RTAUDIO_DEVICE::maxInputChannels}
  1330. }\par
  1331. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m4}
  1332. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m4}
  1333. {
  1334. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1335. }
  1336. {\xe \v maxDuplexChannels\:RtAudio::RTAUDIO_DEVICE}
  1337. {\xe \v RtAudio::RTAUDIO_DEVICE\:maxDuplexChannels}
  1338. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1339. {\b
  1340. int RtAudio::RTAUDIO_DEVICE::maxDuplexChannels}
  1341. }\par
  1342. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m5}
  1343. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m5}
  1344. {
  1345. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1346. }
  1347. {\xe \v minOutputChannels\:RtAudio::RTAUDIO_DEVICE}
  1348. {\xe \v RtAudio::RTAUDIO_DEVICE\:minOutputChannels}
  1349. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1350. {\b
  1351. int RtAudio::RTAUDIO_DEVICE::minOutputChannels}
  1352. }\par
  1353. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m6}
  1354. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m6}
  1355. {
  1356. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1357. }
  1358. {\xe \v minInputChannels\:RtAudio::RTAUDIO_DEVICE}
  1359. {\xe \v RtAudio::RTAUDIO_DEVICE\:minInputChannels}
  1360. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1361. {\b
  1362. int RtAudio::RTAUDIO_DEVICE::minInputChannels}
  1363. }\par
  1364. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m7}
  1365. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m7}
  1366. {
  1367. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1368. }
  1369. {\xe \v minDuplexChannels\:RtAudio::RTAUDIO_DEVICE}
  1370. {\xe \v RtAudio::RTAUDIO_DEVICE\:minDuplexChannels}
  1371. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1372. {\b
  1373. int RtAudio::RTAUDIO_DEVICE::minDuplexChannels}
  1374. }\par
  1375. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m8}
  1376. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m8}
  1377. {
  1378. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1379. }
  1380. {\xe \v hasDuplexSupport\:RtAudio::RTAUDIO_DEVICE}
  1381. {\xe \v RtAudio::RTAUDIO_DEVICE\:hasDuplexSupport}
  1382. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1383. {\b
  1384. bool RtAudio::RTAUDIO_DEVICE::hasDuplexSupport}
  1385. }\par
  1386. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m9}
  1387. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m9}
  1388. {
  1389. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1390. true if device supports duplex mode. \par
  1391. }
  1392. {\xe \v nSampleRates\:RtAudio::RTAUDIO_DEVICE}
  1393. {\xe \v RtAudio::RTAUDIO_DEVICE\:nSampleRates}
  1394. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1395. {\b
  1396. int RtAudio::RTAUDIO_DEVICE::nSampleRates}
  1397. }\par
  1398. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m10}
  1399. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m10}
  1400. {
  1401. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1402. Number of discrete rates or -1 if range supported. \par
  1403. }
  1404. {\xe \v sampleRates\:RtAudio::RTAUDIO_DEVICE}
  1405. {\xe \v RtAudio::RTAUDIO_DEVICE\:sampleRates}
  1406. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1407. {\b
  1408. int RtAudio::RTAUDIO_DEVICE::sampleRates}
  1409. }\par
  1410. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m11}
  1411. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m11}
  1412. {
  1413. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1414. Supported rates or (min, max) if range. \par
  1415. }
  1416. {\xe \v nativeFormats\:RtAudio::RTAUDIO_DEVICE}
  1417. {\xe \v RtAudio::RTAUDIO_DEVICE\:nativeFormats}
  1418. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1419. {\b
  1420. {\b RTAUDIO_FORMAT} RtAudio::RTAUDIO_DEVICE::nativeFormats}
  1421. }\par
  1422. {\bkmkstart structRtAudio_1_1RTAUDIO__DEVICE_m12}
  1423. {\bkmkend structRtAudio_1_1RTAUDIO__DEVICE_m12}
  1424. {
  1425. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1426. Bit mask of supported data formats. \par
  1427. }
  1428. {
  1429. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1430. The documentation for this struct was generated from the following file:{\par
  1431. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  1432. {\b RtAudio.h}\par
  1433. }}
  1434. \par \pard\plain
  1435. \pard\plain \sect\sbkpage
  1436. \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1437. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1438. RtAudioError Class Reference\par \pard\plain
  1439. {\tc\tcl2 \v RtAudioError}
  1440. {\xe \v RtAudioError}
  1441. {\bkmkstart classRtAudioError}
  1442. {\bkmkend }
  1443. {
  1444. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\f2 #include <RtAudio.h>}\par
  1445. \par
  1446. }
  1447. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1448. Public Types\par
  1449. \pard\plain
  1450. {
  1451. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1452. enum {\b TYPE} \{ {\b WARNING},
  1453. {\b DEBUG_WARNING},
  1454. {\b UNSPECIFIED},
  1455. {\b NO_DEVICES_FOUND},
  1456. {\b INVALID_DEVICE},
  1457. {\b INVALID_STREAM},
  1458. {\b MEMORY_ERROR},
  1459. {\b INVALID_PARAMETER},
  1460. {\b DRIVER_ERROR},
  1461. {\b SYSTEM_ERROR},
  1462. {\b THREAD_ERROR}
  1463. \}\par
  1464. }
  1465. \par
  1466. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1467. Public Methods\par
  1468. \pard\plain
  1469. {
  1470. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1471. {\b RtAudioError} (const char *p, {\b TYPE} tipe=RtAudioError::UNSPECIFIED)\par
  1472. {
  1473. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i The constructor.}\par
  1474. \par}
  1475. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1476. virtual {\b ~RtAudioError} (void)\par
  1477. {
  1478. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i The destructor.}\par
  1479. \par}
  1480. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1481. virtual void {\b printMessage} (void)\par
  1482. {
  1483. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Prints "thrown" error message to stdout.}\par
  1484. \par}
  1485. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1486. virtual const {\b TYPE}& {\b getType} (void)\par
  1487. {
  1488. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Returns the "thrown" error message TYPE.}\par
  1489. \par}
  1490. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1491. virtual const char* {\b getMessage} (void)\par
  1492. {
  1493. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i Returns the "thrown" error message string.}\par
  1494. \par}
  1495. }
  1496. \par
  1497. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1498. Protected Attributes\par
  1499. \pard\plain
  1500. {
  1501. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1502. char {\b error_message} [256]\par
  1503. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1504. {\b TYPE} {\b type}\par
  1505. }
  1506. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1507. \par
  1508. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1509. Member Enumeration Documentation\par
  1510. \pard\plain
  1511. {\xe \v TYPE\:RtAudioError}
  1512. {\xe \v RtAudioError\:TYPE}
  1513. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1514. {\b
  1515. enum RtAudioError::TYPE}
  1516. }\par
  1517. {\bkmkstart classRtAudioError_s11}
  1518. {\bkmkend classRtAudioError_s11}
  1519. {
  1520. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1521. {\par
  1522. {\b Enumeration values:}\par
  1523. \pard\plain \s62\li720\widctlpar\ql\adjustright \fs20\cgrid {
  1524. {\xe \v WARNING\:RtAudioError}
  1525. {\xe \v RtAudioError\:WARNING}
  1526. {\b {\i WARNING}{\bkmkstart classRtAudioError_s11s0}
  1527. {\bkmkend classRtAudioError_s11s0}
  1528. } \par
  1529. {\xe \v DEBUG_WARNING\:RtAudioError}
  1530. {\xe \v RtAudioError\:DEBUG_WARNING}
  1531. {\b {\i DEBUG_WARNING}{\bkmkstart classRtAudioError_s11s1}
  1532. {\bkmkend classRtAudioError_s11s1}
  1533. } \par
  1534. {\xe \v UNSPECIFIED\:RtAudioError}
  1535. {\xe \v RtAudioError\:UNSPECIFIED}
  1536. {\b {\i UNSPECIFIED}{\bkmkstart classRtAudioError_s11s2}
  1537. {\bkmkend classRtAudioError_s11s2}
  1538. } \par
  1539. {\xe \v NO_DEVICES_FOUND\:RtAudioError}
  1540. {\xe \v RtAudioError\:NO_DEVICES_FOUND}
  1541. {\b {\i NO_DEVICES_FOUND}{\bkmkstart classRtAudioError_s11s3}
  1542. {\bkmkend classRtAudioError_s11s3}
  1543. } \par
  1544. {\xe \v INVALID_DEVICE\:RtAudioError}
  1545. {\xe \v RtAudioError\:INVALID_DEVICE}
  1546. {\b {\i INVALID_DEVICE}{\bkmkstart classRtAudioError_s11s4}
  1547. {\bkmkend classRtAudioError_s11s4}
  1548. } \par
  1549. {\xe \v INVALID_STREAM\:RtAudioError}
  1550. {\xe \v RtAudioError\:INVALID_STREAM}
  1551. {\b {\i INVALID_STREAM}{\bkmkstart classRtAudioError_s11s5}
  1552. {\bkmkend classRtAudioError_s11s5}
  1553. } \par
  1554. {\xe \v MEMORY_ERROR\:RtAudioError}
  1555. {\xe \v RtAudioError\:MEMORY_ERROR}
  1556. {\b {\i MEMORY_ERROR}{\bkmkstart classRtAudioError_s11s6}
  1557. {\bkmkend classRtAudioError_s11s6}
  1558. } \par
  1559. {\xe \v INVALID_PARAMETER\:RtAudioError}
  1560. {\xe \v RtAudioError\:INVALID_PARAMETER}
  1561. {\b {\i INVALID_PARAMETER}{\bkmkstart classRtAudioError_s11s7}
  1562. {\bkmkend classRtAudioError_s11s7}
  1563. } \par
  1564. {\xe \v DRIVER_ERROR\:RtAudioError}
  1565. {\xe \v RtAudioError\:DRIVER_ERROR}
  1566. {\b {\i DRIVER_ERROR}{\bkmkstart classRtAudioError_s11s8}
  1567. {\bkmkend classRtAudioError_s11s8}
  1568. } \par
  1569. {\xe \v SYSTEM_ERROR\:RtAudioError}
  1570. {\xe \v RtAudioError\:SYSTEM_ERROR}
  1571. {\b {\i SYSTEM_ERROR}{\bkmkstart classRtAudioError_s11s9}
  1572. {\bkmkend classRtAudioError_s11s9}
  1573. } \par
  1574. {\xe \v THREAD_ERROR\:RtAudioError}
  1575. {\xe \v RtAudioError\:THREAD_ERROR}
  1576. {\b {\i THREAD_ERROR}{\bkmkstart classRtAudioError_s11s10}
  1577. {\bkmkend classRtAudioError_s11s10}
  1578. } \par
  1579. }
  1580. \par
  1581. }
  1582. }
  1583. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1584. \par
  1585. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1586. Constructor & Destructor Documentation\par
  1587. \pard\plain
  1588. {\xe \v RtAudioError\:RtAudioError}
  1589. {\xe \v RtAudioError\:RtAudioError}
  1590. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1591. {\b
  1592. RtAudioError::RtAudioError (const char * {\i p}, {\b TYPE} {\i tipe} = RtAudioError::UNSPECIFIED)}
  1593. }\par
  1594. {\bkmkstart classRtAudioError_a0}
  1595. {\bkmkend classRtAudioError_a0}
  1596. {
  1597. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1598. The constructor.\par
  1599. }
  1600. {\xe \v ~RtAudioError\:RtAudioError}
  1601. {\xe \v RtAudioError\:~RtAudioError}
  1602. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1603. {\b
  1604. RtAudioError::~RtAudioError (void){\f2 [virtual]}}
  1605. }\par
  1606. {\bkmkstart classRtAudioError_a1}
  1607. {\bkmkend classRtAudioError_a1}
  1608. {
  1609. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1610. The destructor.\par
  1611. }
  1612. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1613. \par
  1614. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1615. Member Function Documentation\par
  1616. \pard\plain
  1617. {\xe \v printMessage\:RtAudioError}
  1618. {\xe \v RtAudioError\:printMessage}
  1619. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1620. {\b
  1621. void RtAudioError::printMessage (void){\f2 [virtual]}}
  1622. }\par
  1623. {\bkmkstart classRtAudioError_a2}
  1624. {\bkmkend classRtAudioError_a2}
  1625. {
  1626. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1627. Prints "thrown" error message to stdout.\par
  1628. }
  1629. {\xe \v getType\:RtAudioError}
  1630. {\xe \v RtAudioError\:getType}
  1631. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1632. {\b
  1633. const {\b TYPE} & RtAudioError::getType (void){\f2 [inline, virtual]}}
  1634. }\par
  1635. {\bkmkstart classRtAudioError_a3}
  1636. {\bkmkend classRtAudioError_a3}
  1637. {
  1638. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1639. Returns the "thrown" error message TYPE.\par
  1640. }
  1641. {\xe \v getMessage\:RtAudioError}
  1642. {\xe \v RtAudioError\:getMessage}
  1643. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1644. {\b
  1645. const char * RtAudioError::getMessage (void){\f2 [inline, virtual]}}
  1646. }\par
  1647. {\bkmkstart classRtAudioError_a4}
  1648. {\bkmkend classRtAudioError_a4}
  1649. {
  1650. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1651. Returns the "thrown" error message string.\par
  1652. }
  1653. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1654. \par
  1655. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1656. Member Data Documentation\par
  1657. \pard\plain
  1658. {\xe \v error_message\:RtAudioError}
  1659. {\xe \v RtAudioError\:error_message}
  1660. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1661. {\b
  1662. char RtAudioError::error_message{\f2 [protected]}}
  1663. }\par
  1664. {\bkmkstart classRtAudioError_n0}
  1665. {\bkmkend classRtAudioError_n0}
  1666. {
  1667. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1668. }
  1669. {\xe \v type\:RtAudioError}
  1670. {\xe \v RtAudioError\:type}
  1671. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1672. {\b
  1673. {\b TYPE} RtAudioError::type{\f2 [protected]}}
  1674. }\par
  1675. {\bkmkstart classRtAudioError_n1}
  1676. {\bkmkend classRtAudioError_n1}
  1677. {
  1678. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1679. }
  1680. {
  1681. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1682. The documentation for this class was generated from the following file:{\par
  1683. \pard\plain \s81\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls2\adjustright \fs20\cgrid
  1684. {\b RtAudio.h}\par
  1685. }}
  1686. \pard\plain \sect\sbkpage
  1687. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
  1688. RtAudio File Documentation{\tc \v File Documentation}
  1689. \par \pard\plain
  1690. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1691. RtAudio.h File Reference\par \pard\plain
  1692. {\tc\tcl2 \v RtAudio.h}
  1693. {\xe \v RtAudio.h}
  1694. {\bkmkstart RtAudio_8h}
  1695. {\bkmkend }
  1696. {
  1697. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {
  1698. \pard\plain \s18\widctlpar\fs22\cgrid {\f2 #include <map>}\par
  1699. \par
  1700. }
  1701. }
  1702. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1703. Compounds\par
  1704. \pard\plain
  1705. {
  1706. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1707. class {\b RtAudioError}\par
  1708. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1709. class {\b RtAudio}\par
  1710. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1711. struct {\b RtAudio::RTAUDIO_DEVICE}\par
  1712. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1713. struct {\b RtAudio::RTAUDIO_STREAM}\par
  1714. }
  1715. \par
  1716. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1717. Defines\par
  1718. \pard\plain
  1719. {
  1720. \pard\plain \s80\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
  1721. #define {\b __RtAudio_h}\par
  1722. }
  1723. {\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
  1724. \par
  1725. \pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
  1726. Define Documentation\par
  1727. \pard\plain
  1728. {\xe \v __RtAudio_h\:RtAudio.h}
  1729. {\xe \v RtAudio.h\:__RtAudio_h}
  1730. \pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
  1731. {\b
  1732. #define __RtAudio_h}
  1733. }\par
  1734. {\bkmkstart RtAudio_8h_a0}
  1735. {\bkmkend RtAudio_8h_a0}
  1736. {
  1737. \pard\plain \s51\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
  1738. {\b Value:}{
  1739. \par
  1740. \pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \line
  1741. \par
  1742. }
  1743. }
  1744. \par \pard\plain
  1745. \pard\plain \sect\sbkpage
  1746. \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1747. \pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
  1748. tutorial.txt File Reference\par \pard\plain
  1749. {\tc\tcl2 \v tutorial.txt}
  1750. {\xe \v tutorial.txt}
  1751. {\bkmkstart tutorial_8txt}
  1752. {\bkmkend }
  1753. {
  1754. \pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {
  1755. \pard\plain \s18\widctlpar\fs22\cgrid \par
  1756. }
  1757. }
  1758. \pard\plain \sect\sbkpage
  1759. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
  1760. \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Index\par
  1761. \pard\plain
  1762. {\tc \v Index}
  1763. {\field\fldedit {\*\fldinst INDEX \\c2 \\*MERGEFORMAT}{\fldrslt INDEX}}
  1764. }