blob: 74e26222386218935769097948cb818dd3eb50a6 [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.
#include <dirent.h>
#include <fcntl.h>
#include <fuchsia/hardware/midi/c/fidl.h>
#include <lib/fdio/unsafe.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <zircon/types.h>
#define DEV_MIDI "/dev/class/midi"
static bool open_devices(int* out_src_fd, int* out_dest_fd) {
int src_fd = -1;
int dest_fd = -1;
struct dirent* de;
DIR* dir = opendir(DEV_MIDI);
if (!dir) {
printf("Error opening %s\n", DEV_MIDI);
return -1;
}
while ((de = readdir(dir)) != NULL && (src_fd == -1 || dest_fd == -1)) {
char devname[128];
snprintf(devname, sizeof(devname), "%s/%s", DEV_MIDI, de->d_name);
int fd = open(devname, O_RDWR);
if (fd < 0) {
printf("Error opening %s\n", devname);
continue;
}
fuchsia_hardware_midi_Info device_info;
fdio_t* fdio = fdio_unsafe_fd_to_io(fd);
zx_status_t status =
fuchsia_hardware_midi_DeviceGetInfo(fdio_unsafe_borrow_channel(fdio), &device_info);
fdio_unsafe_release(fdio);
if (status != ZX_OK) {
printf("fuchsia.hardware.midi.Device/GetInfo failed for %s\n", devname);
close(fd);
continue;
}
if (device_info.is_source) {
if (src_fd == -1) {
src_fd = fd;
} else {
close(fd);
}
} else if (device_info.is_sink) {
if (dest_fd == -1) {
dest_fd = fd;
} else {
close(fd);
}
} else {
close(fd);
}
}
closedir(dir);
if (src_fd == -1) {
close(dest_fd);
return false;
}
if (dest_fd == -1) {
close(src_fd);
return false;
}
*out_src_fd = src_fd;
*out_dest_fd = dest_fd;
return true;
}
int main(int argc, char** argv) {
int src_fd = -1, dest_fd = -1;
if (!open_devices(&src_fd, &dest_fd)) {
printf("couldn't find a usable MIDI source and sink\n");
return -1;
}
while (1) {
uint8_t buffer[3];
int length = read(src_fd, buffer, sizeof(buffer));
if (length < 0)
break;
printf("MIDI event:");
for (int i = 0; i < length; i++) {
printf(" %02X", buffer[i]);
}
printf("\n");
if (write(dest_fd, buffer, length) < 0)
break;
}
close(src_fd);
close(dest_fd);
return 0;
}