blob: 6789b6d2aa48e589bd48a981ae59ab4153c53da0 [file] [log] [blame]
Don Turner3bf32ae2017-11-27 13:25:05 +00001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef OBOE_STREAM_BUFFERED_H
18#define OBOE_STREAM_BUFFERED_H
19
Phil Burk373e6462018-02-07 20:37:17 -080020#include <cstring>
21#include <assert.h>
Don Turner3bf32ae2017-11-27 13:25:05 +000022#include "common/OboeDebug.h"
Don Turner379e8e52017-11-29 15:49:29 +000023#include "oboe/AudioStream.h"
24#include "oboe/AudioStreamCallback.h"
Don Turner3bf32ae2017-11-27 13:25:05 +000025#include "fifo/FifoBuffer.h"
26
27namespace oboe {
28
29// A stream that contains a FIFO buffer.
Phil Burk373e6462018-02-07 20:37:17 -080030// This is used to implement blocking reads and writes.
Don Turner379e8e52017-11-29 15:49:29 +000031class AudioStreamBuffered : public AudioStream {
Don Turner3bf32ae2017-11-27 13:25:05 +000032public:
33
Don Turner379e8e52017-11-29 15:49:29 +000034 AudioStreamBuffered();
35 explicit AudioStreamBuffered(const AudioStreamBuilder &builder);
Phil Burk373e6462018-02-07 20:37:17 -080036 ~AudioStreamBuffered();
Don Turner3bf32ae2017-11-27 13:25:05 +000037
Phil Burk373e6462018-02-07 20:37:17 -080038 Result finishOpen();
Don Turner3bf32ae2017-11-27 13:25:05 +000039
40 int32_t write(const void *buffer,
41 int32_t numFrames,
42 int64_t timeoutNanoseconds) override;
43
Phil Burk373e6462018-02-07 20:37:17 -080044 int32_t read(void *buffer,
45 int32_t numFrames,
46 int64_t timeoutNanoseconds) override;
47
Don Turner3bf32ae2017-11-27 13:25:05 +000048 Result setBufferSizeInFrames(int32_t requestedFrames) override;
49
50 int32_t getBufferSizeInFrames() const override;
51
52 int32_t getBufferCapacityInFrames() const override;
53
54protected:
55
Don Turner379e8e52017-11-29 15:49:29 +000056 class AudioStreamBufferedCallback : public AudioStreamCallback {
Don Turner3bf32ae2017-11-27 13:25:05 +000057 public:
Don Turner379e8e52017-11-29 15:49:29 +000058 AudioStreamBufferedCallback(AudioStreamBuffered *bufferedStream)
Don Turner3bf32ae2017-11-27 13:25:05 +000059 : mBufferedStream(bufferedStream) {
60 }
61
62 virtual ~AudioStreamBufferedCallback() {}
63
64 virtual DataCallbackResult onAudioReady(
Don Turner379e8e52017-11-29 15:49:29 +000065 AudioStream *audioStream,
Don Turner3bf32ae2017-11-27 13:25:05 +000066 void *audioData,
67 int numFrames) {
Phil Burk373e6462018-02-07 20:37:17 -080068 int32_t framesTransferred = 0;
69 static int transferCount = 0;
70
71 if (mBufferedStream->getDirection() == oboe::Direction::Output) {
72 // This OUTPUT callback will read from the FIFO and write to audioData
73 framesTransferred = mBufferedStream->mFifoBuffer->readNow(audioData, numFrames);
74 LOGV("AudioStreamBufferedCallback::onAudioReady() read %d / %d frames from FIFO, #%d",
75 framesTransferred, numFrames, transferCount);
76 } else {
77 // This INPUT callback will read from audioData and write to the FIFO
78 framesTransferred = mBufferedStream->mFifoBuffer->write(audioData, numFrames);
79 LOGD("AudioStreamBufferedCallback::onAudioReady() wrote %d / %d frames to FIFO, #%d",
80 framesTransferred, numFrames, transferCount);
81 }
82 transferCount++;
83 // return (framesTransferred >= 0) ? DataCallbackResult::Continue : DataCallbackResult::Stop;
84 return DataCallbackResult::Continue;
Don Turner3bf32ae2017-11-27 13:25:05 +000085 }
86
87 virtual void onExit(Result reason) {}
88 private:
Don Turner379e8e52017-11-29 15:49:29 +000089 AudioStreamBuffered *mBufferedStream;
Don Turner3bf32ae2017-11-27 13:25:05 +000090 };
91
92private:
93
Phil Burk373e6462018-02-07 20:37:17 -080094 FifoBuffer *mFifoBuffer = nullptr;
Don Turnerd4b7f082017-12-01 13:51:54 +000095 std::unique_ptr<AudioStreamBufferedCallback> mInternalCallback;
Don Turner3bf32ae2017-11-27 13:25:05 +000096};
97
98} // namespace oboe
99
100#endif //OBOE_STREAM_BUFFERED_H