1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
<html>
<head>
<title>Camstream: CamStream API documentation</title>
<link rel="stylesheet" href="../../tech.css" type="text/css">
</head>
<body>
<!-- Generated by Doxygen 1.3.7 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div>
<h1>RingBuffer.h</h1><a href="_ring_buffer_8h.html">Go to the documentation of this file.</a><pre class="fragment"><div>00001 <span class="comment">/* audiodevs: Abstraction layer for audio hardware & samples</span>
00002 <span class="comment"> Copyright (C) 2003-2004 Nemosoft Unv.</span>
00003 <span class="comment"></span>
00004 <span class="comment"> This program is free software; you can redistribute it and/or modify</span>
00005 <span class="comment"> it under the terms of the GNU General Public License as published by</span>
00006 <span class="comment"> the Free Software Foundation; either version 2 of the License, or</span>
00007 <span class="comment"> (at your option) any later version.</span>
00008 <span class="comment"></span>
00009 <span class="comment"> This program is distributed in the hope that it will be useful,</span>
00010 <span class="comment"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00011 <span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
00012 <span class="comment"> GNU General Public License for more details.</span>
00013 <span class="comment"></span>
00014 <span class="comment"> You should have received a copy of the GNU General Public License</span>
00015 <span class="comment"> along with this program; if not, write to the Free Software</span>
00016 <span class="comment"> Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
00017 <span class="comment"></span>
00018 <span class="comment"> For questions, remarks, patches, etc. for this program, the author can be</span>
00019 <span class="comment"> reached at camstream@smcc.demon.nl.</span>
00020 <span class="comment">*/</span>
00021
00022 <span class="preprocessor">#ifndef RINGBUFFER_HPP</span>
00023 <span class="preprocessor"></span><span class="preprocessor">#define RINGBUFFER_HPP</span>
00024 <span class="preprocessor"></span>
00025 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
00026 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="config_8h.html">config.h</a>"</span>
00027 <span class="preprocessor">#endif</span>
00028 <span class="preprocessor"></span>
00029 <span class="preprocessor">#include <qlist.h></span>
00030 <span class="preprocessor">#include <qobject.h></span>
00031 <span class="preprocessor">#include <qthread.h></span>
00032
00033 <span class="preprocessor">#include "<a class="code" href="_audio_sample_8h.html">AudioSample.h</a>"</span>
00034
00035 <span class="comment">// Forward declarations</span>
00036 <span class="keyword">class </span><a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a>;
00037 <span class="keyword">class </span><a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a>;
00038
<a name="l00039"></a><a class="code" href="class_c_ring_buffer.html">00039</a> <span class="keyword">class </span><a class="code" href="class_c_ring_buffer.html">CRingBuffer</a>: <span class="keyword">public</span> QObject
00040 {
00041 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a>;
00042 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a>;
00043 Q_OBJECT
00044 <span class="keyword">private</span>:
00045 QMutex Head;
00046 QMutex Lists;
00047
00048 QList<CRingBufferWriter> Writers;
00049 QList<CRingBufferReader> Readers;
00050
00051 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BufferSpace, BufferHead, MaxLength;
00052 <span class="keywordtype">void</span> *Buffer;
00053
00054 <span class="comment">/* Statistical data */</span>
00055 <span class="keywordtype">long</span> BytesWritten;
00056 <span class="keywordtype">int</span> Overflows;
00057
00058 <span class="comment">/* Called by Writers */</span>
00059 <span class="keywordtype">void</span> AttachWriter(<a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a> *s);
00060 <span class="keywordtype">void</span> DetachWriter(<a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a> *s);
00061 <span class="keywordtype">int</span> AddToBuffer(<span class="keywordtype">void</span> *data, <span class="keywordtype">int</span> len, <span class="keywordtype">bool</span> must_fit);
00062 <span class="keywordtype">int</span> SpaceLeft();
00063 <span class="keywordtype">int</span> SpaceUsed();
00064
00065 <span class="comment">/* Called by Readers */</span>
00066 <span class="keywordtype">void</span> AttachReader(<a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a> *r);
00067 <span class="keywordtype">void</span> DetachReader(<a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a> *r);
00068
00069 <span class="comment">/* Called by both Readers and Writers */</span>
00070 <span class="keywordtype">void</span> Flush();
00071
00072 <span class="keyword">public</span>:
00073 <a class="code" href="class_c_ring_buffer.html">CRingBuffer</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> buffer_space);
00074 <a class="code" href="class_c_ring_buffer.html#a1">~CRingBuffer</a>();
00075
00076 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer.html#a2">GetBufferLength</a>();
00077
00078 signals:
00079 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer.html#l0">ReaderAttached</a>();
00080 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer.html#l1">ReaderDetached</a>();
00081 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer.html#l2">WriterAttached</a>();
00082 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer.html#l3">WriterDetached</a>();
00083
00084 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer.html#l4">BufferFlushed</a>();
00085 };
00086
00087
<a name="l00088"></a><a class="code" href="class_c_ring_buffer_writer.html">00088</a> <span class="keyword">class </span><a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a>
00089 {
00090 <span class="keyword">private</span>:
00091 <a class="code" href="class_c_ring_buffer.html">CRingBuffer</a> *pRing;
00092
00093 <a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a>(<span class="keyword">const</span> <a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a> &) {}; <span class="comment">// copies are impossible</span>
00094
00095 <span class="keyword">public</span>:
00096 <a class="code" href="class_c_ring_buffer_writer.html">CRingBufferWriter</a>(<a class="code" href="class_c_ring_buffer.html">CRingBuffer</a> *ring);
00097 <a class="code" href="class_c_ring_buffer_writer.html#a1">~CRingBufferWriter</a>();
00098
00099 <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_writer.html#a2">WriteToBuffer</a>(<span class="keywordtype">void</span> *, <span class="keywordtype">int</span> len, <span class="keywordtype">bool</span> must_fit = <span class="keyword">false</span>) <span class="keyword">const</span>;
00100 <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_writer.html#a3">SpaceLeft</a>() <span class="keyword">const</span>;
00101 <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_writer.html#a4">SpaceUsed</a>() <span class="keyword">const</span>;
00102
00103 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer_writer.html#a5">Flush</a>() <span class="keyword">const</span>;
00104 };
00105
00106
<a name="l00107"></a><a class="code" href="class_c_ring_buffer_reader.html">00107</a> <span class="keyword">class </span><a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a>: <span class="keyword">public</span> QObject
00108 {
00109 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="class_c_ring_buffer.html">CRingBuffer</a>;
00110 Q_OBJECT
00111 <span class="keyword">private</span>:
00112 <a class="code" href="class_c_ring_buffer.html">CRingBuffer</a> *pRing;
00113 QMutex Lock;
00114 QWaitCondition DataReady;
00115 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BufferTail, MyBufferLength;
00116 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> LowWaterMark, HighWaterMark;
00117
00118 <a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a>(<span class="keyword">const</span> <a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a> &r) {}; <span class="comment">// copies are impossible</span>
00119
00120 <span class="keyword">public</span>:
00121 <a class="code" href="class_c_ring_buffer_reader.html">CRingBufferReader</a>(<a class="code" href="class_c_ring_buffer.html">CRingBuffer</a> *ring);
00122 <a class="code" href="class_c_ring_buffer_reader.html#a1">~CRingBufferReader</a>();
00123
00124 <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_reader.html#a2">SpaceUsed</a>() <span class="keyword">const</span>;
00125 <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_reader.html#a3">ReadFromBufferTail</a>(<span class="keywordtype">void</span> *, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len);
00126 <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_reader.html#a4">ReadFromBufferHead</a>(<span class="keywordtype">void</span> *, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len, <span class="keywordtype">bool</span> clear = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> time = ULONG_MAX);
00127
00128 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_c_ring_buffer_reader.html#a5">event</a>(QEvent *e); <span class="comment">// overloaded</span>
00129
00130 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer_reader.html#a6">SetLowWaterMark</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>);
00131 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_reader.html#a7">GetLowWaterMark</a>() <span class="keyword">const</span>;
00132 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer_reader.html#a8">SetHighWaterMark</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>);
00133 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_ring_buffer_reader.html#a9">GetHighWaterMark</a>() <span class="keyword">const</span>;
00134
00135 signals:
00136 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer_reader.html#l0">DataArrived</a>(<span class="keywordtype">int</span> bytes);
00137 <span class="keywordtype">void</span> <a class="code" href="class_c_ring_buffer_reader.html#l1">BufferFlushed</a>();
00138 };
00139
00140 <span class="preprocessor">#endif</span>
</div></pre><hr size="1"><address style="align: right;"><small>Generated on Wed Dec 13 23:38:46 2006 for CamStream by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address>
</body>
</html>
|