From nobody Tue Sep 27 18:05:41 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4McSGY51Kbz4YLB6; Tue, 27 Sep 2022 18:05:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4McSGY4Hdfz40xN; Tue, 27 Sep 2022 18:05:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1664301941; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uHNmvkfhOwQH0T6mySCgct5pXbXy9pz2DiuXAXZeRT8=; b=XfmGBwfk7Sb0GGszojvOta4NUk0roQOd1SPs+SxcPJ1/gAG/VM2K2YJV1G1fN6Ghv0+PM6 Icam9pn3NXf0y82Wc772W6iw/TYP/q1Xmpw4FMAe0Jb77jDlojCrA7KwmQCHVlpw8R/jJG 0+/ck1E4hY/LSjpClTjqLghVxohFgZ/X42iBGjBRssWEtGi3KuQIjWAmLzwW9RrU0loGg4 yjkavZQmeesP/ALNunwsXtPg3KGt1Hq1mxZOVDaraEsIYxyFgmPW8naUTntl+OzvSfYSSU ZDqY3H6jJ+KA15UN3Udb4GJSN6aPxji+JKSyrXNcyLrTuCrjGxfBNmY/sFV2nw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4McSGY3LVsz1CFW; Tue, 27 Sep 2022 18:05:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 28RI5fiG025721; Tue, 27 Sep 2022 18:05:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 28RI5f7T025720; Tue, 27 Sep 2022 18:05:41 GMT (envelope-from git) Date: Tue, 27 Sep 2022 18:05:41 GMT Message-Id: <202209271805.28RI5f7T025720@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Hans Petter Selasky Subject: git: f092c21bf630 - main - snd_uaudio(4): Add some examples accessing USB MIDI devices. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: hselasky X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f092c21bf630543dc899a444fa7885d0bbbaedfd Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1664301941; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uHNmvkfhOwQH0T6mySCgct5pXbXy9pz2DiuXAXZeRT8=; b=wLZ1l6v9nGVtKmPOT9N8UDX+MX8l613DZ0mPLSsyIx/lCel7voEmiRMqd3ci+DOG17LQbq TIL9yytPTS1IYmUft8tUw7XVkKCMfDVTt8UrekHjonhXyOW+b0QtLjxbaYR2sh9R0s9blL IG8ByCq/iyE6M2e6vDkv+EIOqyR+K8Sa+LibWqnmAhw1O8RoXsVf7ovVwmhFshFNMIxDuN k0iytRmgwH6OLGDVVAV4w6lo0S1R6ncJPkhhleHL1EiJaQ21O8J2fDvVT0qRtEXV4K+PEn YVc7DjRcU2Ylj6LwSm2OvXrICyqtrNnCL/KfaLMK7P00aAxSphONMYd2Ek2g5Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1664301941; a=rsa-sha256; cv=none; b=neFPQRucmo+UDe6grQ/S9nY1ZwFP2/KJ99sEUbW1ZWNHpwxOb4LPWAivVWf0CG0cjvM87i aCbxgAIkm3eJLCcawGZdj2cGA98oOcOpGaF2Ks+kmrN471b5CcD122twRz2JEEQ5R8FNuU cFnp3nnBBVFYcYGsZk3Pcf2KASwcxBlMybUqMzZKTHeCS0iiayz/GFO8UbIpm8drGF8QeD LfcPQkGa7q4Ainkv54VDRSAWB3lLf+Q8q+D5rrh9zWB0yuMaVPRP+tU5BgBI37+K2McYYO AYpVygImwDoTfIqn/n0X1IkLmsz1UTMQDKtjX4kgUdXBGJegLiwoXGsm8MNW2w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by hselasky: URL: https://cgit.FreeBSD.org/src/commit/?id=f092c21bf630543dc899a444fa7885d0bbbaedfd commit f092c21bf630543dc899a444fa7885d0bbbaedfd Author: Goran Mekic AuthorDate: 2022-09-27 17:28:27 +0000 Commit: Hans Petter Selasky CommitDate: 2022-09-27 18:04:14 +0000 snd_uaudio(4): Add some examples accessing USB MIDI devices. Differential Revision: https://reviews.freebsd.org/D36195 MFC after: 1 week Sponsored by: NVIDIA Networking --- share/examples/Makefile | 2 ++ share/examples/sound/midi.c | 76 ++++++++++++++++++++++++++++++++++++++++++ share/examples/sound/ossmidi.h | 63 ++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) diff --git a/share/examples/Makefile b/share/examples/Makefile index 1d916f344b77..7179f1bff1a4 100644 --- a/share/examples/Makefile +++ b/share/examples/Makefile @@ -320,6 +320,8 @@ SE_DIRS+= sound SE_SOUND= \ basic.c \ ossinit.h \ + ossmidi.h \ + midi.c \ README SE_DIRS+= sunrpc diff --git a/share/examples/sound/midi.c b/share/examples/sound/midi.c new file mode 100644 index 000000000000..fbe4d9480530 --- /dev/null +++ b/share/examples/sound/midi.c @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2022 Goran Mekić + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include "ossmidi.h" + +int +main() +{ + midi_event_t event; + midi_config_t midi_config; + int l = -1; + unsigned char raw; + + midi_config.device = "/dev/umidi1.0"; + oss_midi_init(&midi_config); + + while ((l = read(midi_config.fd, &raw, sizeof(raw))) != -1) { + if (!(raw & 0x80)) { + continue; + } + event.type = raw & CMD_MASK; + event.channel = raw & CHANNEL_MASK; + switch (event.type) { + case NOTE_ON: + case NOTE_OFF: + case CONTROLER_ON: + if ((l = read(midi_config.fd, &(event.note), sizeof(event.note))) == -1) { + perror("Error reading MIDI note"); + exit(1); + } + if ((l = read(midi_config.fd, &(event.velocity), sizeof(event.velocity))) == -1) { + perror("Error reading MIDI velocity"); + exit(1); + } + break; + } + switch (event.type) { + case NOTE_ON: + case NOTE_OFF: + printf("Channel %d, note %d, velocity %d\n", event.channel, event.note, event.velocity); + break; + case CONTROLER_ON: + printf("Channel %d, controller %d, value %d\n", event.channel, event.controller, event.value); + break; + default: + printf("Unknown event type %d\n", event.type); + } + } + return 0; +} diff --git a/share/examples/sound/ossmidi.h b/share/examples/sound/ossmidi.h new file mode 100644 index 000000000000..507508061de4 --- /dev/null +++ b/share/examples/sound/ossmidi.h @@ -0,0 +1,63 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2022 Goran Mekić + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#define CMD_MASK 0xF0 +#define NOTE_ON 0x90 +#define NOTE_OFF 0x80 +#define CHANNEL_MASK 0xF +#define CONTROLER_ON 0xB0 + +typedef struct midi_event { + unsigned char type; + unsigned char channel; + union { + unsigned char note; + unsigned controller; + }; + union { + unsigned char velocity; + unsigned char value; + }; +} midi_event_t; + +typedef struct midi_config { + char *device; + int fd; +} midi_config_t; + +void +oss_midi_init(midi_config_t *config) +{ + if ((config->fd = open(config->device, O_RDWR)) == -1) { + perror("Error opening MIDI device"); + exit(1); + } +}