blob: bd468a6349748862c0027b6186543617ce00da9c [file] [log] [blame]
Glenn Kasten01066232012-02-27 11:50:44 -08001/*
2 * Copyright (C) 2012 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#define LOG_TAG "PipeReader"
18//#define LOG_NDEBUG 0
19
20#include <cutils/compiler.h>
21#include <utils/Log.h>
Glenn Kasten2dd4bdd2012-08-29 11:10:32 -070022#include <media/nbaio/PipeReader.h>
Glenn Kasten01066232012-02-27 11:50:44 -080023
24namespace android {
25
26PipeReader::PipeReader(Pipe& pipe) :
27 NBAIO_Source(pipe.mFormat),
Glenn Kastened99c2b2016-12-12 08:31:24 -080028 mPipe(pipe), mFifoReader(mPipe.mFifo, false /*throttlesWriter*/),
Glenn Kasten01066232012-02-27 11:50:44 -080029 mFramesOverrun(0),
30 mOverruns(0)
31{
32 android_atomic_inc(&pipe.mReaders);
33}
34
35PipeReader::~PipeReader()
36{
Glenn Kasten57c4e6f2016-03-18 14:54:07 -070037#if !LOG_NDEBUG
38 int32_t readers =
39#else
40 (void)
41#endif
42 android_atomic_dec(&mPipe.mReaders);
Glenn Kasten01066232012-02-27 11:50:44 -080043 ALOG_ASSERT(readers > 0);
44}
45
46ssize_t PipeReader::availableToRead()
47{
48 if (CC_UNLIKELY(!mNegotiated)) {
49 return NEGOTIATE;
50 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080051 size_t lost;
52 ssize_t avail = mFifoReader.available(&lost);
53 if (avail == -EOVERFLOW || lost > 0) {
54 mFramesOverrun += lost;
Glenn Kasten01066232012-02-27 11:50:44 -080055 ++mOverruns;
Glenn Kastened99c2b2016-12-12 08:31:24 -080056 avail = OVERRUN;
Glenn Kasten01066232012-02-27 11:50:44 -080057 }
58 return avail;
59}
60
Glenn Kastend79072e2016-01-06 08:41:20 -080061ssize_t PipeReader::read(void *buffer, size_t count)
Glenn Kasten01066232012-02-27 11:50:44 -080062{
Glenn Kastened99c2b2016-12-12 08:31:24 -080063 size_t lost;
64 ssize_t actual = mFifoReader.read(buffer, count, NULL /*timeout*/, &lost);
65 ALOG_ASSERT(actual <= count);
66 if (actual == -EOVERFLOW || lost > 0) {
67 mFramesOverrun += lost;
68 ++mOverruns;
69 actual = OVERRUN;
Glenn Kasten01066232012-02-27 11:50:44 -080070 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080071 if (actual <= 0) {
72 return actual;
Glenn Kasten01066232012-02-27 11:50:44 -080073 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080074 mFramesRead += (size_t) actual;
75 return actual;
Glenn Kasten01066232012-02-27 11:50:44 -080076}
77
Andy Hungad6d52d2016-07-18 13:42:03 -070078ssize_t PipeReader::flush()
79{
80 if (CC_UNLIKELY(!mNegotiated)) {
81 return NEGOTIATE;
82 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080083 size_t lost;
84 ssize_t flushed = mFifoReader.flush(&lost);
85 if (flushed == -EOVERFLOW || lost > 0) {
86 mFramesOverrun += lost;
87 ++mOverruns;
88 flushed = OVERRUN;
89 }
90 if (flushed <= 0) {
91 return flushed;
92 }
93 mFramesRead += (size_t) flushed; // we consider flushed frames as read, but not lost frames
Andy Hungad6d52d2016-07-18 13:42:03 -070094 return flushed;
95}
96
Glenn Kasten01066232012-02-27 11:50:44 -080097} // namespace android