blob: e84aeeb63dfe9bd0d175decb3e9021fd6d654165 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_MEDIA_PLAYBACK_MEDIAPLAYER_FIDL_FIDL_READER_H_
#define SRC_MEDIA_PLAYBACK_MEDIAPLAYER_FIDL_FIDL_READER_H_
#include <fuchsia/media/playback/cpp/fidl.h>
#include <lib/async/cpp/task.h>
#include <lib/async/cpp/wait.h>
#include <lib/zx/socket.h>
#include <atomic>
#include <memory>
#include "src/media/playback/mediaplayer/demux/reader.h"
#include "src/media/playback/mediaplayer/util/incident.h"
namespace media_player {
// Reads raw data from a SeekingReader service.
class FidlReader : public Reader,
public std::enable_shared_from_this<FidlReader> {
public:
// Creates an FidlReader. Must be called on a fidl thread.
static std::shared_ptr<Reader> Create(
fidl::InterfaceHandle<fuchsia::media::playback::SeekingReader>
seeking_reader) {
return std::shared_ptr<Reader>(new FidlReader(std::move(seeking_reader)));
}
~FidlReader() override;
// Reader implementation.
void Describe(DescribeCallback callback) override;
void ReadAt(size_t position, uint8_t* buffer, size_t bytes_to_read,
ReadAtCallback callback) override;
private:
FidlReader(fidl::InterfaceHandle<fuchsia::media::playback::SeekingReader>
seeking_reader);
// Continues a ReadAt operation on the thread on which this reader was
// constructed (a fidl thread).
void ContinueReadAt();
// Reads from socket_ into read_at_buffer_.
void ReadFromSocket();
// Completes a ReadAt operation by calling the read_at_callback_.
void CompleteReadAt(zx_status_t result, size_t bytes_read = 0);
// Shuts down the consumer handle and calls CompleteReadAt.
void FailReadAt(zx_status_t status);
fuchsia::media::playback::SeekingReaderPtr seeking_reader_;
zx_status_t status_ = ZX_OK;
size_t size_ = kUnknownSize;
bool can_seek_ = false;
async_dispatcher_t* dispatcher_;
Incident ready_;
std::atomic_bool read_in_progress_;
size_t read_at_position_;
uint8_t* read_at_buffer_;
size_t read_at_bytes_to_read_;
size_t read_at_bytes_remaining_;
ReadAtCallback read_at_callback_;
zx::socket socket_;
size_t socket_position_ = kUnknownSize;
std::unique_ptr<async::Wait> waiter_;
};
} // namespace media_player
#endif // SRC_MEDIA_PLAYBACK_MEDIAPLAYER_FIDL_FIDL_READER_H_