blob: 65dcaeb245ff0d8a437ccf246ef2cae03b324b8d [file] [log] [blame]
// Copyright 2017 The Chromium OS 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 MIDIS_SUBDEVICE_CLIENT_FD_HOLDER_H_
#define MIDIS_SUBDEVICE_CLIENT_FD_HOLDER_H_
#include <memory>
#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/scoped_file.h>
#include <base/memory/weak_ptr.h>
#include "media/midi/message_util.h"
#include "media/midi/midi_message_queue.h"
namespace midis {
// Container to store the client_id, pipe FD and file watcher task id for the
// corresponding pipe.
class SubDeviceClientFdHolder {
public:
using ClientDataCallback = base::Callback<void(
uint32_t subdevice_id, const uint8_t* buffer, size_t buf_len)>;
SubDeviceClientFdHolder(uint32_t client_id,
uint32_t subdevice_id,
base::ScopedFD fd,
ClientDataCallback client_data_cb);
SubDeviceClientFdHolder(const SubDeviceClientFdHolder&) = delete;
SubDeviceClientFdHolder& operator=(const SubDeviceClientFdHolder&) = delete;
static std::unique_ptr<SubDeviceClientFdHolder> Create(
uint32_t client_id,
uint32_t subdevice_id,
base::ScopedFD fd,
ClientDataCallback client_data_cb);
~SubDeviceClientFdHolder();
int GetRawFd() { return fd_.get(); }
uint32_t GetClientId() const { return client_id_; }
// This function is used to write data *to* the client when it is received
// from a MIDI h/w device. NOTE: A failure in this write shouldn't result in
// the deletion of a client. A faulty / crashed / deleted client will be
// handled from the Client handling code via TriggerClientDeletion().
void WriteDeviceDataToClient(const void* buffer, size_t buf_len);
private:
// This function is used as the callback which is run when a
// base::FileDescriptorWatcher is set up on the client's fd for this
// particular subdevice. It reads the data *from* the client, and in turn
// invokes client_data_cb_ which writes the data to the device h/w.
void HandleClientMidiData();
// Starts to watch the client pipe FD.
bool StartClientMonitoring();
uint32_t client_id_;
uint32_t subdevice_id_;
base::ScopedFD fd_;
std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;
ClientDataCallback client_data_cb_;
std::unique_ptr<midi::MidiMessageQueue> queue_;
base::WeakPtrFactory<SubDeviceClientFdHolder> weak_factory_;
};
} // namespace midis
#endif // MIDIS_SUBDEVICE_CLIENT_FD_HOLDER_H_