#ifndef ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_ #define ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_ #include "buffer_hub.h" #include <pdx/rpc/buffer_wrapper.h> #include <private/dvr/bufferhub_rpc.h> namespace android { namespace dvr { // Consumer channels are attached to a Producer channel class ConsumerChannel : public BufferHubChannel { public: using BorrowedHandle = pdx::BorrowedHandle; using Channel = pdx::Channel; using Message = pdx::Message; ConsumerChannel(BufferHubService* service, int buffer_id, int channel_id, uint64_t consumer_state_bit, const std::shared_ptr<Channel> producer); ~ConsumerChannel() override; bool HandleMessage(Message& message) override; void HandleImpulse(Message& message) override; uint64_t consumer_state_bit() const { return consumer_state_bit_; } BufferInfo GetBufferInfo() const override; bool OnProducerPosted(); void OnProducerClosed(); private: std::shared_ptr<ProducerChannel> GetProducer() const; pdx::Status<BufferDescription<BorrowedHandle>> OnGetBuffer(Message& message); pdx::Status<LocalFence> OnConsumerAcquire(Message& message); pdx::Status<void> OnConsumerRelease(Message& message, LocalFence release_fence); pdx::Status<void> OnConsumerSetIgnore(Message& message, bool ignore); uint64_t consumer_state_bit_{0}; bool acquired_{false}; bool released_{true}; bool ignored_{false}; // True if we are ignoring events. std::weak_ptr<Channel> producer_; ConsumerChannel(const ConsumerChannel&) = delete; void operator=(const ConsumerChannel&) = delete; }; } // namespace dvr } // namespace android #endif // ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_