PageRenderTime 55ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/web/audiere-1.9.1-doxygen/input__ogg_8cpp-source.html

https://github.com/Bananattack/audiere
HTML | 215 lines | 214 code | 0 blank | 1 comment | 0 complexity | ce6e2efebc548fd7a116d5687c463ae9 MD5 | raw file
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
  3. <title>input_ogg.cpp Source File</title>
  4. <link href="doxygen.css" rel="stylesheet" type="text/css">
  5. </head><body>
  6. <!-- Generated by Doxygen 1.2.17 -->
  7. <center>
  8. <a class="qindex" href="main.html">Main Page</a> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="namespacemembers.html">Namespace Members</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; </center>
  9. <hr><h1>input_ogg.cpp</h1><a href="input__ogg_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="preprocessor">#include &lt;string.h&gt;</span>
  10. 00002 <span class="preprocessor">#include "<a class="code" href="input__ogg_8h.html">input_ogg.h</a>"</span>
  11. 00003 <span class="preprocessor">#include "<a class="code" href="types_8h.html">types.h</a>"</span>
  12. 00004 <span class="preprocessor">#include "<a class="code" href="utility_8h.html">utility.h</a>"</span>
  13. 00005
  14. 00006
  15. 00007 <span class="keyword">namespace </span>audiere {
  16. 00008
  17. <a name="l00009"></a><a class="code" href="namespaceaudiere.html#a12">00009</a> <span class="keyword">typedef</span> ogg_int64_t <a class="code" href="namespaceaudiere.html#a12">int64_t</a>;
  18. 00010
  19. 00011
  20. <a name="l00012"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a0">00012</a> OGGInputStream::OGGInputStream() {
  21. 00013 m_file = 0;
  22. 00014
  23. 00015 m_channel_count = 0;
  24. 00016 m_sample_rate = 0;
  25. 00017 m_sample_format = <a class="code" href="namespaceaudiere.html#a83a7">SF_S16</a>;
  26. 00018 }
  27. 00019
  28. 00020
  29. <a name="l00021"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a1">00021</a> OGGInputStream::~OGGInputStream() {
  30. 00022 <span class="comment">// were we initialized successfully?</span>
  31. 00023 <span class="keywordflow">if</span> (m_file) {
  32. 00024 ov_clear(&amp;m_vorbis_file);
  33. 00025 }
  34. 00026 }
  35. 00027
  36. 00028
  37. 00029 <span class="keywordtype">bool</span>
  38. <a name="l00030"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a2">00030</a> OGGInputStream::initialize(<a class="code" href="classaudiere_1_1File.html">File</a>* file) {
  39. 00031 m_file = file;
  40. 00032
  41. 00033 <span class="comment">// custom ogg vorbis callbacks</span>
  42. 00034 ov_callbacks callbacks;
  43. 00035 callbacks.read_func = FileRead;
  44. 00036 callbacks.seek_func = FileSeek;
  45. 00037 callbacks.close_func = FileClose;
  46. 00038 callbacks.tell_func = FileTell;
  47. 00039
  48. 00040 <span class="comment">// open ogg vorbis stream</span>
  49. 00041 <span class="keywordtype">int</span> result = ov_open_callbacks(file, &amp;m_vorbis_file, 0, 0, callbacks);
  50. 00042 <span class="keywordflow">if</span> (result) {
  51. 00043 m_file = 0;
  52. 00044 <span class="keywordflow">return</span> <span class="keyword">false</span>;
  53. 00045 }
  54. 00046
  55. 00047 <span class="comment">// calculate stream type</span>
  56. 00048 vorbis_info* vi = ov_info(&amp;m_vorbis_file, -1);
  57. 00049 <span class="keywordflow">if</span> (!vi) {
  58. 00050 ov_clear(&amp;m_vorbis_file);
  59. 00051 m_file = 0;
  60. 00052 <span class="keywordflow">return</span> <span class="keyword">false</span>;
  61. 00053 }
  62. 00054
  63. 00055 m_channel_count = vi-&gt;channels;
  64. 00056 m_sample_rate = vi-&gt;rate;
  65. 00057 m_sample_format = <a class="code" href="namespaceaudiere.html#a83a7">SF_S16</a>; <span class="comment">// see constructor</span>
  66. 00058
  67. 00059 <span class="keywordflow">return</span> <span class="keyword">true</span>;
  68. 00060 }
  69. 00061
  70. 00062
  71. 00063 <span class="keywordtype">void</span>
  72. <a name="l00064"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a3">00064</a> OGGInputStream::getFormat(
  73. 00065 <span class="keywordtype">int</span>&amp; channel_count,
  74. 00066 <span class="keywordtype">int</span>&amp; sample_rate,
  75. 00067 <a class="code" href="namespaceaudiere.html#a83">SampleFormat</a>&amp; <a class="code" href="namespaceaudiere_1_1hidden.html#a6">sample_format</a>)
  76. 00068 {
  77. 00069 channel_count = m_channel_count;
  78. 00070 sample_rate = m_sample_rate;
  79. 00071 <a class="code" href="namespaceaudiere_1_1hidden.html#a6">sample_format</a> = m_sample_format;
  80. 00072 }
  81. 00073
  82. 00074
  83. 00075 <span class="keywordtype">int</span>
  84. <a name="l00076"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a4">00076</a> OGGInputStream::read(<span class="keywordtype">int</span> frame_count, <span class="keywordtype">void</span>* buffer) {
  85. 00077 <span class="keywordtype">int</span> sample_size = m_channel_count * <a class="code" href="namespaceaudiere.html#a35">GetSampleSize</a>(m_sample_format);
  86. 00078
  87. 00079 <a class="code" href="namespaceaudiere.html#a24">u8</a>* out = (<a class="code" href="namespaceaudiere.html#a24">u8</a>*)buffer;
  88. 00080
  89. 00081 <span class="keywordtype">int</span> samples_left = frame_count;
  90. 00082 <span class="keywordtype">int</span> total_read = 0;
  91. 00083 <span class="keywordflow">while</span> (samples_left &gt; 0) {
  92. 00084
  93. 00085 <span class="comment">// check to see if the stream format has changed</span>
  94. 00086 <span class="comment">// if so, treat it as an EndOfStream</span>
  95. 00087 vorbis_info* vi = ov_info(&amp;m_vorbis_file, -1);
  96. 00088 <span class="keywordflow">if</span> (vi &amp;&amp; (m_sample_rate != vi-&gt;rate || m_channel_count != vi-&gt;channels)) {
  97. 00089 <span class="keywordflow">break</span>;
  98. 00090 }
  99. 00091
  100. 00092 <span class="preprocessor">#ifdef WORDS_BIGENDIAN</span>
  101. 00093 <span class="preprocessor"></span><span class="preprocessor">#define ENDIANNESS 1</span>
  102. 00094 <span class="preprocessor"></span><span class="preprocessor">#else</span>
  103. 00095 <span class="preprocessor"></span><span class="preprocessor">#define ENDIANNESS 0</span>
  104. 00096 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
  105. 00097 <span class="preprocessor"></span>
  106. 00098 <span class="keywordtype">int</span> bitstream;
  107. 00099 <span class="keywordtype">long</span> result = ov_read(
  108. 00100 &amp;m_vorbis_file,
  109. 00101 (<span class="keywordtype">char</span>*)out,
  110. 00102 samples_left * sample_size,
  111. 00103 ENDIANNESS,
  112. 00104 2, <span class="comment">// 16-bit</span>
  113. 00105 1, <span class="comment">// signed</span>
  114. 00106 &amp;bitstream);
  115. 00107
  116. 00108 <span class="keywordflow">if</span> (result &lt; 0) {
  117. 00109 <span class="comment">// if error, ignore it</span>
  118. 00110 <span class="keywordflow">continue</span>;
  119. 00111 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result == 0) {
  120. 00112 <span class="keywordflow">break</span>;
  121. 00113 }
  122. 00114
  123. 00115 <a class="code" href="namespaceaudiere.html#a28">u32</a> samples_read = (u32)(result / sample_size);
  124. 00116
  125. 00117 out += samples_read * sample_size;
  126. 00118 samples_left -= samples_read;
  127. 00119 total_read += samples_read;
  128. 00120 }
  129. 00121
  130. 00122 <span class="keywordflow">return</span> total_read;
  131. 00123 }
  132. 00124
  133. 00125
  134. 00126 <span class="keywordtype">void</span>
  135. <a name="l00127"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a5">00127</a> OGGInputStream::reset() {
  136. 00128 ov_pcm_seek(&amp;m_vorbis_file, 0);
  137. 00129 }
  138. 00130
  139. 00131
  140. 00132 <span class="keywordtype">bool</span>
  141. <a name="l00133"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a6">00133</a> OGGInputStream::isSeekable() {
  142. 00134 <span class="keywordflow">return</span> (ov_seekable(&amp;m_vorbis_file) != 0);
  143. 00135 }
  144. 00136
  145. 00137
  146. 00138 <span class="keywordtype">int</span>
  147. <a name="l00139"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a7">00139</a> OGGInputStream::getLength() {
  148. 00140 <span class="keywordflow">if</span> (<a class="code" href="classaudiere_1_1OGGInputStream.html#a6">isSeekable</a>()) {
  149. 00141 <span class="keywordflow">return</span> ov_pcm_total(&amp;m_vorbis_file, -1);
  150. 00142 } <span class="keywordflow">else</span> {
  151. 00143 <span class="keywordflow">return</span> 0;
  152. 00144 }
  153. 00145 }
  154. 00146
  155. 00147
  156. 00148 <span class="keywordtype">void</span>
  157. <a name="l00149"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a8">00149</a> OGGInputStream::setPosition(<span class="keywordtype">int</span> position) {
  158. 00150 <span class="keywordflow">if</span> (<a class="code" href="classaudiere_1_1OGGInputStream.html#a6">isSeekable</a>()) {
  159. 00151 ov_pcm_seek(&amp;m_vorbis_file, position);
  160. 00152 }
  161. 00153 }
  162. 00154
  163. 00155
  164. 00156 <span class="keywordtype">int</span>
  165. <a name="l00157"></a><a class="code" href="classaudiere_1_1OGGInputStream.html#a9">00157</a> OGGInputStream::getPosition() {
  166. 00158 <span class="keywordflow">if</span> (<a class="code" href="classaudiere_1_1OGGInputStream.html#a6">isSeekable</a>()) {
  167. 00159 <span class="keywordflow">return</span> ov_pcm_tell(&amp;m_vorbis_file);
  168. 00160 } <span class="keywordflow">else</span> {
  169. 00161 <span class="keywordflow">return</span> 0;
  170. 00162 }
  171. 00163 }
  172. 00164
  173. 00165
  174. 00166 size_t
  175. 00167 OGGInputStream::FileRead(<span class="keywordtype">void</span>* buffer, size_t size, size_t n, <span class="keywordtype">void</span>* opaque) {
  176. 00168 File* file = reinterpret_cast&lt;File*&gt;(opaque);
  177. 00169 <span class="keywordflow">return</span> file-&gt;read(buffer, size * n) / size;
  178. 00170 }
  179. 00171
  180. 00172
  181. 00173 <span class="keywordtype">int</span>
  182. 00174 OGGInputStream::FileSeek(<span class="keywordtype">void</span>* opaque, ogg_int64_t offset, <span class="keywordtype">int</span> whence) {
  183. 00175 File* file = reinterpret_cast&lt;File*&gt;(opaque);
  184. 00176 File::SeekMode <a class="code" href="namespaceaudiere_1_1hidden.html#a7">type</a>;
  185. 00177 <span class="keywordflow">switch</span> (whence) {
  186. 00178 <span class="keywordflow">case</span> SEEK_SET: <a class="code" href="namespaceaudiere_1_1hidden.html#a7">type</a> = File::BEGIN; <span class="keywordflow">break</span>;
  187. 00179 <span class="keywordflow">case</span> SEEK_CUR: <a class="code" href="namespaceaudiere_1_1hidden.html#a7">type</a> = File::CURRENT; <span class="keywordflow">break</span>;
  188. 00180 <span class="keywordflow">case</span> SEEK_END: <a class="code" href="namespaceaudiere_1_1hidden.html#a7">type</a> = File::END; <span class="keywordflow">break</span>;
  189. 00181 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1;
  190. 00182 }
  191. 00183 <span class="keywordflow">return</span> (file-&gt;seek((<span class="keywordtype">int</span>)offset, <a class="code" href="namespaceaudiere_1_1hidden.html#a7">type</a>) ? 0 : -1);
  192. 00184 }
  193. 00185
  194. 00186
  195. 00187 <span class="keywordtype">int</span>
  196. 00188 OGGInputStream::FileClose(<span class="keywordtype">void</span>* <span class="comment">/*opaque*/</span>) {
  197. 00189 <span class="comment">// we don't have to do anything</span>
  198. 00190 <span class="comment">// (read: don't trust ogg vorbis with handling file closes)</span>
  199. 00191 <span class="keywordflow">return</span> 0;
  200. 00192 }
  201. 00193
  202. 00194
  203. 00195 <span class="keywordtype">long</span>
  204. 00196 OGGInputStream::FileTell(<span class="keywordtype">void</span>* opaque) {
  205. 00197 File* file = reinterpret_cast&lt;File*&gt;(opaque);
  206. 00198 <span class="keywordflow">return</span> file-&gt;tell();
  207. 00199 }
  208. 00200
  209. 00201 }
  210. </pre></div><hr><address style="align: right;"><small>Generated on Sat Oct 12 01:43:03 2002 for audiere by
  211. <a href="http://www.doxygen.org/index.html">
  212. <img src="doxygen.png" alt="doxygen" align="middle" border=0
  213. width=110 height=53></a>1.2.17 </small></address>
  214. </body>
  215. </html>