[go: nahoru, domu]

blob: 584b8062a2d9c4ef85fbb4eb0d34fd7bfb51f3fc [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_MEDIA_CMA_BACKEND_PROXY_AUDIO_CHANNEL_PUSH_BUFFER_HANDLER_H_
#define CHROMECAST_MEDIA_CMA_BACKEND_PROXY_AUDIO_CHANNEL_PUSH_BUFFER_HANDLER_H_
#include "chromecast/media/api/cma_backend.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/cast_core/public/src/proto/runtime/cast_audio_channel_service.pb.h"
namespace chromecast {
namespace media {
// This class is responsible for buffering both DecoderBuffer and AudioConfig
// data, which are pushed together over gRPC using the PushData() API call.
// Two sequences are expected to access this object:
// - A PRODUCER sequence, which will push new data in.
// - A CONSUMER sequence which will pull this data back out.
class AudioChannelPushBufferHandler {
public:
// NOTE: This is needed to avoid introducing extra DEPS-file dependencies on
// third_party/openscreen.
using PushBufferRequest = cast::media::PushBufferRequest;
class Client {
public:
// Called following a PushBuffer() call which returns kBufferPending, to
// provide the result of that call and signal that this instance is ready
// to handle more PushBuffer calls.
virtual void OnAudioChannelPushBufferComplete(
CmaBackend::BufferStatus status) = 0;
protected:
virtual ~Client() = default;
};
virtual ~AudioChannelPushBufferHandler() = default;
// Writes the next available PushBufferRequest to be processed. Return values
// are as follows:
// - kBufferSuccess: The data has been processed successfully
// - kBufferPending: The data will be processed at a later time. Do not call
// this method again until the associated client has provided a callback
// with type kBufferSuccess.
// - kBufferFailed: The data was NOT processed successfully, but the pipeline
// remains in a healthy state and you may try again at a later point
// Note that no call to this method will ever put the implementation into an
// undefined or unhealthy state.
//
// May only be called by the PRODUCER.
virtual CmaBackend::BufferStatus PushBuffer(
const PushBufferRequest& request) = 0;
// Returns true if there is data available for reading.
//
// May only be called by the CONSUMER.
virtual bool HasBufferedData() const = 0;
// Attempts to read the next available PushBufferRequest, returning the
// instance on success and empty. May only be called when HasBufferedData() is
// true.
//
// May only be called by the CONSUMER.
virtual absl::optional<PushBufferRequest> GetBufferedData() = 0;
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_CMA_BACKEND_PROXY_AUDIO_CHANNEL_PUSH_BUFFER_HANDLER_H_