blob: d2a078f6cfbe677c98e3c2b0fcfea97be188305f [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#ifndef ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
2#define ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
3
4#include "buffer_hub.h"
5
6#include <pdx/rpc/buffer_wrapper.h>
7#include <private/dvr/bufferhub_rpc.h>
8
9namespace android {
10namespace dvr {
11
12// Consumer channels are attached to a Producer channel
13class ConsumerChannel : public BufferHubChannel {
14 public:
15 using Channel = pdx::Channel;
16 using Message = pdx::Message;
17
18 ConsumerChannel(BufferHubService* service, int buffer_id, int channel_id,
19 const std::shared_ptr<Channel> producer);
20 ~ConsumerChannel() override;
21
22 bool HandleMessage(Message& message) override;
23 void HandleImpulse(Message& message) override;
24
25 BufferInfo GetBufferInfo() const override;
26
27 bool OnProducerPosted();
28 void OnProducerClosed();
29
30 private:
31 using MetaData = pdx::rpc::BufferWrapper<std::uint8_t*>;
32
33 std::shared_ptr<ProducerChannel> GetProducer() const;
34
35 std::pair<BorrowedFence, MetaData> OnConsumerAcquire(
36 Message& message, std::size_t metadata_size);
37 int OnConsumerRelease(Message& message, LocalFence release_fence);
38 int OnConsumerSetIgnore(Message& message, bool ignore);
39
40 bool handled_; // True if we have processed RELEASE.
41 bool ignored_; // True if we are ignoring events.
42 std::weak_ptr<Channel> producer_;
43
44 ConsumerChannel(const ConsumerChannel&) = delete;
45 void operator=(const ConsumerChannel&) = delete;
46};
47
48} // namespace dvr
49} // namespace android
50
51#endif // ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_