// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Next MinVersion: 3

// This file defines the mojo interface between Android, Chrome and the
// Chrome OS daemon for the MIDI implementation used in ARC.

module arc.mojom;

// This struct is used to send information to the client regarding a device
// which has been (dis)connected, and which the client can use to request
// subdevice ports from the daemon.
struct MidisDeviceInfo {
  uint32 card;
  uint32 device_num;
  uint32 num_subdevices;
  uint32 flags;
  string name;
  string manufacturer;
};

// This struct is used by the client to both request a subdevice port FD, as
// well as to close all its connections to a particular device. In the latter
// case, the |subdevice_num| field is left unused.
struct MidisRequest {
  uint32 card;
  uint32 device_num;
  uint32 subdevice_num;
};

// This interface is used by the server to send device and other information
// to the client. It should be implemented by the client, and a handle to it
// should be passed to the server.
// Next Method ID: 2
interface MidisClient {
  OnDeviceAdded@0(MidisDeviceInfo device);
  OnDeviceRemoved@1(MidisDeviceInfo device);
};

// This interface is used by the client to send messages / requests to the
// daemon. This should be implemented by midis.
// Next Method ID: 4
interface MidisServer {
  // Used to list out the MIDI devices that are currently connected to the
  // midis daemon.
  ListDevices@0() => (array<MidisDeviceInfo> devices);

  // This function returns a handle(a Unix FD wrapped in a Mojo Handle)
  // for a subdevice specified by |request|.
  // In the event of an error, returns an empty handle.
  // DEPRECATED: Please use RequestPort@4 instead.
  RequestPortDeprecated@1(MidisRequest request) => (handle port_handle);
  [MinVersion=2]
  RequestPort@3(MidisRequest request) => (handle? port_handle);

  // This function closes all open FDs the client may have on the specified
  // device, and removes the client from the device's data structure.
  CloseDevice@2(MidisRequest request);
};

// This interface is needed to get the midis server interface handle.
// It is also used to send a handle to the midis client interface (this is
// used to send messages to the client, and the interface is implemented
// by the client).
// Next Method ID: 1
interface MidisHost {
  Connect@0(
      pending_receiver<MidisServer> server, pending_remote<MidisClient> client);
};

// MidisInstance is implemented in the ARC MIDI JNI code that
// runs in Android and handles the Android side of the ArcBridge connection.
// Next Method ID: 2
interface MidisInstance {
  // DEPRECATED: Please use Init@1 instead.
  InitDeprecated@0(pending_remote<MidisHost> host_remote);

  // Establishes full-duplex communication with the host.
  [MinVersion=1] Init@1(pending_remote<MidisHost> host_remote) => ();
};
