blob: 2486b76d9919c9730bdc5f035cb264fb6ff8858c [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>
Mathias Agopian05d19b02017-02-28 16:28:19 -080021#include <cutils/atomic.h>
Glenn Kasten01066232012-02-27 11:50:44 -080022#include <utils/Log.h>
Glenn Kasten2dd4bdd2012-08-29 11:10:32 -070023#include <media/nbaio/PipeReader.h>
Glenn Kasten01066232012-02-27 11:50:44 -080024
25namespace android {
26
27PipeReader::PipeReader(Pipe& pipe) :
28 NBAIO_Source(pipe.mFormat),
Glenn Kasten03539402017-04-17 16:40:46 -070029 mPipe(pipe), mFifoReader(mPipe.mFifo, false /*throttlesWriter*/, true /*flush*/),
Glenn Kasten01066232012-02-27 11:50:44 -080030 mFramesOverrun(0),
31 mOverruns(0)
32{
33 android_atomic_inc(&pipe.mReaders);
34}
35
36PipeReader::~PipeReader()
37{
Glenn Kasten57c4e6f2016-03-18 14:54:07 -070038#if !LOG_NDEBUG
39 int32_t readers =
40#else
41 (void)
42#endif
43 android_atomic_dec(&mPipe.mReaders);
Glenn Kasten01066232012-02-27 11:50:44 -080044 ALOG_ASSERT(readers > 0);
45}
46
47ssize_t PipeReader::availableToRead()
48{
49 if (CC_UNLIKELY(!mNegotiated)) {
50 return NEGOTIATE;
51 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080052 size_t lost;
53 ssize_t avail = mFifoReader.available(&lost);
54 if (avail == -EOVERFLOW || lost > 0) {
55 mFramesOverrun += lost;
Glenn Kasten01066232012-02-27 11:50:44 -080056 ++mOverruns;
Glenn Kastened99c2b2016-12-12 08:31:24 -080057 avail = OVERRUN;
Glenn Kasten01066232012-02-27 11:50:44 -080058 }
59 return avail;
60}
61
Glenn Kastend79072e2016-01-06 08:41:20 -080062ssize_t PipeReader::read(void *buffer, size_t count)
Glenn Kasten01066232012-02-27 11:50:44 -080063{
Glenn Kastened99c2b2016-12-12 08:31:24 -080064 size_t lost;
65 ssize_t actual = mFifoReader.read(buffer, count, NULL /*timeout*/, &lost);
66 ALOG_ASSERT(actual <= count);
67 if (actual == -EOVERFLOW || lost > 0) {
68 mFramesOverrun += lost;
69 ++mOverruns;
70 actual = OVERRUN;
Glenn Kasten01066232012-02-27 11:50:44 -080071 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080072 if (actual <= 0) {
73 return actual;
Glenn Kasten01066232012-02-27 11:50:44 -080074 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080075 mFramesRead += (size_t) actual;
76 return actual;
Glenn Kasten01066232012-02-27 11:50:44 -080077}
78
Andy Hungad6d52d2016-07-18 13:42:03 -070079ssize_t PipeReader::flush()
80{
81 if (CC_UNLIKELY(!mNegotiated)) {
82 return NEGOTIATE;
83 }
Glenn Kastened99c2b2016-12-12 08:31:24 -080084 size_t lost;
85 ssize_t flushed = mFifoReader.flush(&lost);
86 if (flushed == -EOVERFLOW || lost > 0) {
87 mFramesOverrun += lost;
88 ++mOverruns;
89 flushed = OVERRUN;
90 }
91 if (flushed <= 0) {
92 return flushed;
93 }
94 mFramesRead += (size_t) flushed; // we consider flushed frames as read, but not lost frames
Andy Hungad6d52d2016-07-18 13:42:03 -070095 return flushed;
96}
97
Glenn Kasten01066232012-02-27 11:50:44 -080098} // namespace android