17#ifndef OBOE_FULL_DUPLEX_STREAM_
18#define OBOE_FULL_DUPLEX_STREAM_
21#include "oboe/Definitions.h"
22#include "oboe/AudioStream.h"
23#include "oboe/AudioStreamCallback.h"
62 mRawInputStream = stream;
71 mSharedInputStream = stream;
81 if (mSharedInputStream) {
82 return mSharedInputStream.get();
84 return mRawInputStream;
95 mRawOutputStream = stream;
104 mSharedOutputStream = stream;
114 if (mSharedOutputStream) {
115 return mSharedOutputStream.get();
117 return mRawOutputStream;
128 mCountCallbacksToDrain = kNumCallbacksToDrain;
129 mCountInputBurstsCushion = mNumInputBurstsCushion;
130 mCountCallbacksToDiscard = kNumCallbacksToDiscard;
135 if (bufferSize > mBufferSize) {
136 mInputBuffer = std::make_unique<float[]>(bufferSize);
137 mBufferSize = bufferSize;
141 if (result != oboe::Result::OK) {
153 Result outputResult = Result::OK;
154 Result inputResult = Result::OK;
161 if (outputResult != Result::OK) {
191 const void *inputData,
213 DataCallbackResult callbackResult = DataCallbackResult::Continue;
214 int32_t actualFramesRead = 0;
218 memset(audioData, 0 , numBytes);
220 if (mCountCallbacksToDrain > 0) {
222 int32_t totalFramesRead = 0;
229 actualFramesRead = result.
value();
230 totalFramesRead += actualFramesRead;
231 }
while (actualFramesRead > 0);
233 if (totalFramesRead > 0) {
234 mCountCallbacksToDrain--;
237 }
else if (mCountInputBurstsCushion > 0) {
239 mCountInputBurstsCushion--;
241 }
else if (mCountCallbacksToDiscard > 0) {
242 mCountCallbacksToDiscard--;
245 if (!resultAvailable) {
246 callbackResult = DataCallbackResult::Stop;
248 int32_t framesAvailable = resultAvailable.
value();
249 if (framesAvailable >= mMinimumFramesBeforeRead) {
252 callbackResult = DataCallbackResult::Stop;
257 int32_t framesRead = 0;
259 if (!resultAvailable) {
260 callbackResult = DataCallbackResult::Stop;
262 int32_t framesAvailable = resultAvailable.
value();
263 if (framesAvailable >= mMinimumFramesBeforeRead) {
267 callbackResult = DataCallbackResult::Stop;
269 framesRead = resultRead.
value();
274 if (callbackResult == DataCallbackResult::Continue) {
276 audioData, numFrames);
280 if (callbackResult == DataCallbackResult::Stop) {
284 return callbackResult;
295 mNumInputBurstsCushion = numBursts;
304 return mNumInputBurstsCushion;
313 mMinimumFramesBeforeRead = numFrames;
322 return mMinimumFramesBeforeRead;
328 static constexpr int32_t kNumCallbacksToDrain = 20;
329 static constexpr int32_t kNumCallbacksToDiscard = 30;
332 int32_t mNumInputBurstsCushion = 0;
333 int32_t mMinimumFramesBeforeRead = 0;
339 int32_t mCountCallbacksToDrain = kNumCallbacksToDrain;
341 int32_t mCountInputBurstsCushion = mNumInputBurstsCushion;
343 int32_t mCountCallbacksToDiscard = kNumCallbacksToDiscard;
347 std::shared_ptr<AudioStream> mSharedInputStream;
348 std::shared_ptr<AudioStream> mSharedOutputStream;
350 int32_t mBufferSize = 0;
351 std::unique_ptr<float[]> mInputBuffer;
int32_t getChannelCount() const
Definition AudioStreamBase.h:53
virtual int32_t getBufferCapacityInFrames() const
Definition AudioStreamBase.h:91
Definition AudioStreamCallback.h:34
Definition AudioStream.h:42
virtual Result requestStart()=0
virtual ResultWithValue< int32_t > read(void *, int32_t, int64_t)
Definition AudioStream.h:384
int32_t getBytesPerFrame() const
Definition AudioStream.h:247
virtual Result requestStop()=0
ResultWithValue< int32_t > getAvailableFrames()
Definition FullDuplexStream.h:50
void setOutputStream(AudioStream *stream)
Definition FullDuplexStream.h:94
int32_t getMinimumFramesBeforeRead() const
Definition FullDuplexStream.h:321
virtual Result stop()
Definition FullDuplexStream.h:152
void setNumInputBurstsCushion(int32_t numBursts)
Definition FullDuplexStream.h:294
virtual ResultWithValue< int32_t > readInput(int32_t numFrames)
Definition FullDuplexStream.h:175
AudioStream * getOutputStream()
Definition FullDuplexStream.h:113
virtual DataCallbackResult onBothStreamsReady(const void *inputData, int numInputFrames, void *outputData, int numOutputFrames)=0
AudioStream * getInputStream()
Definition FullDuplexStream.h:80
DataCallbackResult onAudioReady(AudioStream *, void *audioData, int numFrames)
Definition FullDuplexStream.h:209
int32_t getNumInputBurstsCushion() const
Definition FullDuplexStream.h:303
void setInputStream(AudioStream *stream)
Definition FullDuplexStream.h:61
void setMinimumFramesBeforeRead(int32_t numFrames)
Definition FullDuplexStream.h:312
virtual Result start()
Definition FullDuplexStream.h:127
void setSharedOutputStream(std::shared_ptr< AudioStream > &stream)
Definition FullDuplexStream.h:103
void setSharedInputStream(std::shared_ptr< AudioStream > &stream)
Definition FullDuplexStream.h:70
Definition ResultWithValue.h:47
T value() const
Definition ResultWithValue.h:81