1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Stream Library
3*35238bceSAndroid Build Coastguard Worker * ---------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Thread safe ringbuffer
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker #include "deRingbuffer.h"
24*35238bceSAndroid Build Coastguard Worker
25*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
26*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
27*35238bceSAndroid Build Coastguard Worker #include "deSemaphore.h"
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker #include <stdlib.h>
30*35238bceSAndroid Build Coastguard Worker #include <stdio.h>
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker struct deRingbuffer_s
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker int32_t blockSize;
35*35238bceSAndroid Build Coastguard Worker int32_t blockCount;
36*35238bceSAndroid Build Coastguard Worker int32_t *blockUsage;
37*35238bceSAndroid Build Coastguard Worker uint8_t *buffer;
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker deSemaphore emptyCount;
40*35238bceSAndroid Build Coastguard Worker deSemaphore fullCount;
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker int32_t outBlock;
43*35238bceSAndroid Build Coastguard Worker int32_t outPos;
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard Worker int32_t inBlock;
46*35238bceSAndroid Build Coastguard Worker int32_t inPos;
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker bool stopNotified;
49*35238bceSAndroid Build Coastguard Worker bool consumerStopping;
50*35238bceSAndroid Build Coastguard Worker };
51*35238bceSAndroid Build Coastguard Worker
deRingbuffer_create(int32_t blockSize,int32_t blockCount)52*35238bceSAndroid Build Coastguard Worker deRingbuffer *deRingbuffer_create(int32_t blockSize, int32_t blockCount)
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker deRingbuffer *ringbuffer = (deRingbuffer *)deCalloc(sizeof(deRingbuffer));
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker DE_ASSERT(ringbuffer);
57*35238bceSAndroid Build Coastguard Worker DE_ASSERT(blockCount > 0);
58*35238bceSAndroid Build Coastguard Worker DE_ASSERT(blockSize > 0);
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker ringbuffer->blockSize = blockSize;
61*35238bceSAndroid Build Coastguard Worker ringbuffer->blockCount = blockCount;
62*35238bceSAndroid Build Coastguard Worker ringbuffer->buffer = (uint8_t *)deMalloc(sizeof(uint8_t) * (size_t)blockSize * (size_t)blockCount);
63*35238bceSAndroid Build Coastguard Worker ringbuffer->blockUsage = (int32_t *)deMalloc(sizeof(uint32_t) * (size_t)blockCount);
64*35238bceSAndroid Build Coastguard Worker ringbuffer->emptyCount = deSemaphore_create(ringbuffer->blockCount, DE_NULL);
65*35238bceSAndroid Build Coastguard Worker ringbuffer->fullCount = deSemaphore_create(0, DE_NULL);
66*35238bceSAndroid Build Coastguard Worker
67*35238bceSAndroid Build Coastguard Worker if (!ringbuffer->buffer || !ringbuffer->blockUsage || !ringbuffer->emptyCount || !ringbuffer->fullCount)
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker if (ringbuffer->emptyCount)
70*35238bceSAndroid Build Coastguard Worker deSemaphore_destroy(ringbuffer->emptyCount);
71*35238bceSAndroid Build Coastguard Worker if (ringbuffer->fullCount)
72*35238bceSAndroid Build Coastguard Worker deSemaphore_destroy(ringbuffer->fullCount);
73*35238bceSAndroid Build Coastguard Worker deFree(ringbuffer->buffer);
74*35238bceSAndroid Build Coastguard Worker deFree(ringbuffer->blockUsage);
75*35238bceSAndroid Build Coastguard Worker deFree(ringbuffer);
76*35238bceSAndroid Build Coastguard Worker return DE_NULL;
77*35238bceSAndroid Build Coastguard Worker }
78*35238bceSAndroid Build Coastguard Worker
79*35238bceSAndroid Build Coastguard Worker memset(ringbuffer->blockUsage, 0, sizeof(int32_t) * (size_t)blockCount);
80*35238bceSAndroid Build Coastguard Worker
81*35238bceSAndroid Build Coastguard Worker ringbuffer->outBlock = 0;
82*35238bceSAndroid Build Coastguard Worker ringbuffer->outPos = 0;
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker ringbuffer->inBlock = 0;
85*35238bceSAndroid Build Coastguard Worker ringbuffer->inPos = 0;
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker ringbuffer->stopNotified = false;
88*35238bceSAndroid Build Coastguard Worker ringbuffer->consumerStopping = false;
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker return ringbuffer;
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker
deRingbuffer_stop(deRingbuffer * ringbuffer)93*35238bceSAndroid Build Coastguard Worker void deRingbuffer_stop(deRingbuffer *ringbuffer)
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker /* Set notify to true and increment fullCount to let consumer continue */
96*35238bceSAndroid Build Coastguard Worker ringbuffer->stopNotified = true;
97*35238bceSAndroid Build Coastguard Worker deSemaphore_increment(ringbuffer->fullCount);
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker
deRingbuffer_destroy(deRingbuffer * ringbuffer)100*35238bceSAndroid Build Coastguard Worker void deRingbuffer_destroy(deRingbuffer *ringbuffer)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker deSemaphore_destroy(ringbuffer->emptyCount);
103*35238bceSAndroid Build Coastguard Worker deSemaphore_destroy(ringbuffer->fullCount);
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker free(ringbuffer->buffer);
106*35238bceSAndroid Build Coastguard Worker free(ringbuffer->blockUsage);
107*35238bceSAndroid Build Coastguard Worker free(ringbuffer);
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker
producerStream_write(deStreamData * stream,const void * buf,int32_t bufSize,int32_t * written)110*35238bceSAndroid Build Coastguard Worker static deStreamResult producerStream_write(deStreamData *stream, const void *buf, int32_t bufSize, int32_t *written)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker deRingbuffer *ringbuffer = (deRingbuffer *)stream;
113*35238bceSAndroid Build Coastguard Worker
114*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stream);
115*35238bceSAndroid Build Coastguard Worker /* If ringbuffer is stopping return error on write */
116*35238bceSAndroid Build Coastguard Worker if (ringbuffer->stopNotified)
117*35238bceSAndroid Build Coastguard Worker {
118*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
119*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_ERROR;
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker *written = 0;
123*35238bceSAndroid Build Coastguard Worker
124*35238bceSAndroid Build Coastguard Worker /* Write while more data available */
125*35238bceSAndroid Build Coastguard Worker while (*written < bufSize)
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker int32_t writeSize = 0;
128*35238bceSAndroid Build Coastguard Worker uint8_t *src = DE_NULL;
129*35238bceSAndroid Build Coastguard Worker uint8_t *dst = DE_NULL;
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker /* If between blocks accuire new block */
132*35238bceSAndroid Build Coastguard Worker if (ringbuffer->inPos == 0)
133*35238bceSAndroid Build Coastguard Worker {
134*35238bceSAndroid Build Coastguard Worker deSemaphore_decrement(ringbuffer->emptyCount);
135*35238bceSAndroid Build Coastguard Worker }
136*35238bceSAndroid Build Coastguard Worker
137*35238bceSAndroid Build Coastguard Worker writeSize = deMin32(ringbuffer->blockSize - ringbuffer->inPos, bufSize - *written);
138*35238bceSAndroid Build Coastguard Worker dst = ringbuffer->buffer + ringbuffer->blockSize * ringbuffer->inBlock + ringbuffer->inPos;
139*35238bceSAndroid Build Coastguard Worker src = (uint8_t *)buf + *written;
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker deMemcpy(dst, src, (size_t)writeSize);
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker ringbuffer->inPos += writeSize;
144*35238bceSAndroid Build Coastguard Worker *written += writeSize;
145*35238bceSAndroid Build Coastguard Worker ringbuffer->blockUsage[ringbuffer->inBlock] += writeSize;
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker /* Block is full move to next one (or "between" this and next block) */
148*35238bceSAndroid Build Coastguard Worker if (ringbuffer->inPos == ringbuffer->blockSize)
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker ringbuffer->inPos = 0;
151*35238bceSAndroid Build Coastguard Worker ringbuffer->inBlock++;
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker if (ringbuffer->inBlock == ringbuffer->blockCount)
154*35238bceSAndroid Build Coastguard Worker ringbuffer->inBlock = 0;
155*35238bceSAndroid Build Coastguard Worker deSemaphore_increment(ringbuffer->fullCount);
156*35238bceSAndroid Build Coastguard Worker }
157*35238bceSAndroid Build Coastguard Worker }
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_SUCCESS;
160*35238bceSAndroid Build Coastguard Worker }
161*35238bceSAndroid Build Coastguard Worker
producerStream_flush(deStreamData * stream)162*35238bceSAndroid Build Coastguard Worker static deStreamResult producerStream_flush(deStreamData *stream)
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker deRingbuffer *ringbuffer = (deRingbuffer *)stream;
165*35238bceSAndroid Build Coastguard Worker
166*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stream);
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker /* No blocks reserved by producer */
169*35238bceSAndroid Build Coastguard Worker if (ringbuffer->inPos == 0)
170*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_SUCCESS;
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker ringbuffer->inPos = 0;
173*35238bceSAndroid Build Coastguard Worker ringbuffer->inBlock++;
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker if (ringbuffer->inBlock == ringbuffer->blockCount)
176*35238bceSAndroid Build Coastguard Worker ringbuffer->inBlock = 0;
177*35238bceSAndroid Build Coastguard Worker
178*35238bceSAndroid Build Coastguard Worker deSemaphore_increment(ringbuffer->fullCount);
179*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_SUCCESS;
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker
producerStream_deinit(deStreamData * stream)182*35238bceSAndroid Build Coastguard Worker static deStreamResult producerStream_deinit(deStreamData *stream)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stream);
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker producerStream_flush(stream);
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker /* \note mika Stream doesn't own ringbuffer, so it's not deallocated */
189*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_SUCCESS;
190*35238bceSAndroid Build Coastguard Worker }
191*35238bceSAndroid Build Coastguard Worker
consumerStream_read(deStreamData * stream,void * buf,int32_t bufSize,int32_t * read)192*35238bceSAndroid Build Coastguard Worker static deStreamResult consumerStream_read(deStreamData *stream, void *buf, int32_t bufSize, int32_t *read)
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker deRingbuffer *ringbuffer = (deRingbuffer *)stream;
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stream);
197*35238bceSAndroid Build Coastguard Worker
198*35238bceSAndroid Build Coastguard Worker *read = 0;
199*35238bceSAndroid Build Coastguard Worker DE_ASSERT(ringbuffer);
200*35238bceSAndroid Build Coastguard Worker
201*35238bceSAndroid Build Coastguard Worker while (*read < bufSize)
202*35238bceSAndroid Build Coastguard Worker {
203*35238bceSAndroid Build Coastguard Worker int32_t writeSize = 0;
204*35238bceSAndroid Build Coastguard Worker uint8_t *src = DE_NULL;
205*35238bceSAndroid Build Coastguard Worker uint8_t *dst = DE_NULL;
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker /* If between blocks accuire new block */
208*35238bceSAndroid Build Coastguard Worker if (ringbuffer->outPos == 0)
209*35238bceSAndroid Build Coastguard Worker {
210*35238bceSAndroid Build Coastguard Worker /* If consumer is set to stop after everything is consumed,
211*35238bceSAndroid Build Coastguard Worker * do not block if there is no more input left
212*35238bceSAndroid Build Coastguard Worker */
213*35238bceSAndroid Build Coastguard Worker if (ringbuffer->consumerStopping)
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker /* Try to accuire new block, if can't there is no more input */
216*35238bceSAndroid Build Coastguard Worker if (!deSemaphore_tryDecrement(ringbuffer->fullCount))
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_END_OF_STREAM;
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker else
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker /* If not stopping block until there is more input */
224*35238bceSAndroid Build Coastguard Worker deSemaphore_decrement(ringbuffer->fullCount);
225*35238bceSAndroid Build Coastguard Worker /* Ringbuffer was set to stop */
226*35238bceSAndroid Build Coastguard Worker if (ringbuffer->stopNotified)
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker ringbuffer->consumerStopping = true;
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker }
232*35238bceSAndroid Build Coastguard Worker
233*35238bceSAndroid Build Coastguard Worker writeSize = deMin32(ringbuffer->blockUsage[ringbuffer->outBlock] - ringbuffer->outPos, bufSize - *read);
234*35238bceSAndroid Build Coastguard Worker src = ringbuffer->buffer + ringbuffer->blockSize * ringbuffer->outBlock + ringbuffer->outPos;
235*35238bceSAndroid Build Coastguard Worker dst = (uint8_t *)buf + *read;
236*35238bceSAndroid Build Coastguard Worker
237*35238bceSAndroid Build Coastguard Worker deMemcpy(dst, src, (size_t)writeSize);
238*35238bceSAndroid Build Coastguard Worker
239*35238bceSAndroid Build Coastguard Worker ringbuffer->outPos += writeSize;
240*35238bceSAndroid Build Coastguard Worker *read += writeSize;
241*35238bceSAndroid Build Coastguard Worker
242*35238bceSAndroid Build Coastguard Worker /* Block is consumed move to next one (or "between" this and next block) */
243*35238bceSAndroid Build Coastguard Worker if (ringbuffer->outPos == ringbuffer->blockUsage[ringbuffer->outBlock])
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker ringbuffer->blockUsage[ringbuffer->outBlock] = 0;
246*35238bceSAndroid Build Coastguard Worker ringbuffer->outPos = 0;
247*35238bceSAndroid Build Coastguard Worker ringbuffer->outBlock++;
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker if (ringbuffer->outBlock == ringbuffer->blockCount)
250*35238bceSAndroid Build Coastguard Worker ringbuffer->outBlock = 0;
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker deSemaphore_increment(ringbuffer->emptyCount);
253*35238bceSAndroid Build Coastguard Worker }
254*35238bceSAndroid Build Coastguard Worker }
255*35238bceSAndroid Build Coastguard Worker
256*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_SUCCESS;
257*35238bceSAndroid Build Coastguard Worker }
258*35238bceSAndroid Build Coastguard Worker
consumerStream_deinit(deStreamData * stream)259*35238bceSAndroid Build Coastguard Worker static deStreamResult consumerStream_deinit(deStreamData *stream)
260*35238bceSAndroid Build Coastguard Worker {
261*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stream);
262*35238bceSAndroid Build Coastguard Worker DE_UNREF(stream);
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker return DE_STREAMRESULT_SUCCESS;
265*35238bceSAndroid Build Coastguard Worker }
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Worker /* There are no sensible errors so status is always good */
empty_getStatus(deStreamData * stream)268*35238bceSAndroid Build Coastguard Worker deStreamStatus empty_getStatus(deStreamData *stream)
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker DE_UNREF(stream);
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker return DE_STREAMSTATUS_GOOD;
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker /* There are no sensible errors in ringbuffer */
empty_getError(deStreamData * stream)276*35238bceSAndroid Build Coastguard Worker static const char *empty_getError(deStreamData *stream)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stream);
279*35238bceSAndroid Build Coastguard Worker DE_UNREF(stream);
280*35238bceSAndroid Build Coastguard Worker return DE_NULL;
281*35238bceSAndroid Build Coastguard Worker }
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker static const deIOStreamVFTable producerStreamVFTable = {
284*35238bceSAndroid Build Coastguard Worker DE_NULL, producerStream_write, empty_getError, producerStream_flush, producerStream_deinit, empty_getStatus};
285*35238bceSAndroid Build Coastguard Worker
286*35238bceSAndroid Build Coastguard Worker static const deIOStreamVFTable consumerStreamVFTable = {consumerStream_read, DE_NULL, empty_getError, DE_NULL,
287*35238bceSAndroid Build Coastguard Worker consumerStream_deinit, empty_getStatus};
288*35238bceSAndroid Build Coastguard Worker
deProducerStream_init(deOutStream * stream,deRingbuffer * buffer)289*35238bceSAndroid Build Coastguard Worker void deProducerStream_init(deOutStream *stream, deRingbuffer *buffer)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker stream->ioStream.streamData = (deStreamData *)buffer;
292*35238bceSAndroid Build Coastguard Worker stream->ioStream.vfTable = &producerStreamVFTable;
293*35238bceSAndroid Build Coastguard Worker }
294*35238bceSAndroid Build Coastguard Worker
deConsumerStream_init(deInStream * stream,deRingbuffer * buffer)295*35238bceSAndroid Build Coastguard Worker void deConsumerStream_init(deInStream *stream, deRingbuffer *buffer)
296*35238bceSAndroid Build Coastguard Worker {
297*35238bceSAndroid Build Coastguard Worker stream->ioStream.streamData = (deStreamData *)buffer;
298*35238bceSAndroid Build Coastguard Worker stream->ioStream.vfTable = &consumerStreamVFTable;
299*35238bceSAndroid Build Coastguard Worker }
300