Blame src/rawmidi/rawmidi.c

Packit Service db8eaa
/**
Packit Service db8eaa
 * \file rawmidi/rawmidi.c
Packit Service db8eaa
 * \brief RawMidi Interface
Packit Service db8eaa
 * \author Jaroslav Kysela <perex@perex.cz>
Packit Service db8eaa
 * \author Abramo Bagnara <abramo@alsa-project.org>
Packit Service db8eaa
 * \date 2000-2001
Packit Service db8eaa
 *
Packit Service db8eaa
 * See the \ref rawmidi page for more details.
Packit Service db8eaa
 */
Packit Service db8eaa
/*
Packit Service db8eaa
 *
Packit Service db8eaa
 *   This library is free software; you can redistribute it and/or modify
Packit Service db8eaa
 *   it under the terms of the GNU Lesser General Public License as
Packit Service db8eaa
 *   published by the Free Software Foundation; either version 2.1 of
Packit Service db8eaa
 *   the License, or (at your option) any later version.
Packit Service db8eaa
 *
Packit Service db8eaa
 *   This program is distributed in the hope that it will be useful,
Packit Service db8eaa
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service db8eaa
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service db8eaa
 *   GNU Lesser General Public License for more details.
Packit Service db8eaa
 *
Packit Service db8eaa
 *   You should have received a copy of the GNU Lesser General Public
Packit Service db8eaa
 *   License along with this library; if not, write to the Free Software
Packit Service db8eaa
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service db8eaa
 *
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
/*! \page rawmidi RawMidi interface
Packit Service db8eaa
Packit Service db8eaa

RawMidi Interface is designed to write or read raw (unchanged) MIDI

Packit Service db8eaa
data over the MIDI line without any timestamps defined in interface. MIDI
Packit Service db8eaa
stands Musical Instrument Digital Interface and more information about
Packit Service db8eaa
this standard can be found at http://www.midi.org.
Packit Service db8eaa
Packit Service db8eaa
\section rawmidi_general_overview General overview
Packit Service db8eaa
Packit Service db8eaa
The rawmidi implementation uses ring buffers to store outgoing and incoming
Packit Service db8eaa
MIDI stream. The buffer size is tunable and drivers report underruns for incoming
Packit Service db8eaa
stream as well.
Packit Service db8eaa
Packit Service db8eaa
\section rawmidi_open Open handling
Packit Service db8eaa
Packit Service db8eaa
RawMidi devices are opened exclusively for a selected direction.
Packit Service db8eaa
While more than one process may not open a given MIDI device in the same
Packit Service db8eaa
direction simultaneously, separate processes may open a single MIDI device
Packit Service db8eaa
in different directions (i.e. process one opens a MIDI device in write
Packit Service db8eaa
direction and process two opens the same device in read direction).
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_open_nonblock Nonblocking open (flag)
Packit Service db8eaa
Packit Service db8eaa
Using #SND_RAWMIDI_NONBLOCK flag for snd_rawmidi_open() or snd_rawmidi_open_lconf()
Packit Service db8eaa
instruct device driver to return the -EBUSY error when device is already occupied
Packit Service db8eaa
with another application. This flag also changes behaviour of snd_rawmidi_write()
Packit Service db8eaa
and snd_rawmidi_read() returning -EAGAIN when no more bytes can be processed.
Packit Service db8eaa
Packit Service db8eaa
Note: In opposite (default) behaviour, application is blocked until device resources
Packit Service db8eaa
are free.
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_open_append Append open (flag)
Packit Service db8eaa
Packit Service db8eaa
Using #SND_RAWMIDI_APPEND flag (output only) instruct device driver to append
Packit Service db8eaa
contents of written buffer - passed by snd_rawmidi_write() - atomically
Packit Service db8eaa
to output ring buffer in the kernel space. This flag also means that device
Packit Service db8eaa
is not opened exclusively, so more applications can share given rawmidi device.
Packit Service db8eaa
Note that applications must send the whole MIDI message including the running status,
Packit Service db8eaa
because another writing application might break the MIDI message in the output
Packit Service db8eaa
buffer.
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_open_sync Sync open (flag)
Packit Service db8eaa
Packit Service db8eaa
Using #SND_RAWMIDI_SYNC flag (output only) assures that the contents of output
Packit Service db8eaa
buffer specified using snd_rawmidi_write() is always drained before the function
Packit Service db8eaa
exits. This behaviour is same like 'snd_rawmidi_write() followed by
Packit Service db8eaa
snd_rawmidi_drain() immediately'.
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_io I/O handling
Packit Service db8eaa
Packit Service db8eaa
There is only standard read/write access to device internal ring buffer. Use
Packit Service db8eaa
snd_rawmidi_read() and snd_rawmidi_write() functions to obtain / write MIDI bytes.
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_dev_names RawMidi naming conventions
Packit Service db8eaa
Packit Service db8eaa
The ALSA library uses a generic string representation for names of devices.
Packit Service db8eaa
The devices might be virtual, physical or a mix of both. The generic string
Packit Service db8eaa
is passed to \link ::snd_rawmidi_open() \endlink or \link ::snd_rawmidi_open_lconf() \endlink.
Packit Service db8eaa
It contains two parts: device name and arguments. Devices and arguments are described
Packit Service db8eaa
in configuration files. The usual place for default definitions is at /usr/share/alsa/alsa.conf.
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_dev_names_default 
Packit Service db8eaa
Packit Service db8eaa
The default device is equal to hw device. The defaults are used:
Packit Service db8eaa
Packit Service db8eaa
defaults.rawmidi.card 0
Packit Service db8eaa
defaults.rawmidi.device 0
Packit Service db8eaa
defaults.rawmidi.subdevice -1
Packit Service db8eaa
Packit Service db8eaa
These defaults can be freely overwritten in local configuration files.
Packit Service db8eaa
Packit Service db8eaa
Example:
Packit Service db8eaa
Packit Service db8eaa
\code
Packit Service db8eaa
default
Packit Service db8eaa
\endcode
Packit Service db8eaa
Packit Service db8eaa
\subsection rawmidi_dev_names_hw HW device
Packit Service db8eaa
Packit Service db8eaa
The hw device description uses the hw plugin. The three arguments (in order: CARD,DEV,SUBDEV)
Packit Service db8eaa
specify card number or identifier, device number and subdevice number (-1 means any).
Packit Service db8eaa
Packit Service db8eaa
Example:
Packit Service db8eaa
Packit Service db8eaa
\code
Packit Service db8eaa
hw
Packit Service db8eaa
hw:0
Packit Service db8eaa
hw:0,0
Packit Service db8eaa
hw:supersonic,1
Packit Service db8eaa
hw:soundwave,1,2
Packit Service db8eaa
hw:DEV=1,CARD=soundwave,SUBDEV=2
Packit Service db8eaa
\endcode
Packit Service db8eaa
Packit Service db8eaa
\section rawmidi_examples Examples
Packit Service db8eaa
Packit Service db8eaa
The full featured examples with cross-links:
Packit Service db8eaa
Packit Service db8eaa
\par Simple input/output test program
Packit Service db8eaa
\ref example_test_rawmidi "example code"
Packit Service db8eaa
\par
Packit Service db8eaa
This example shows open and read/write rawmidi operations.
Packit Service db8eaa
Packit Service db8eaa
*/
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \example ../test/rawmidi.c
Packit Service db8eaa
 * \anchor example_test_rawmidi
Packit Service db8eaa
 */
Packit Service db8eaa
 
Packit Service db8eaa
#include <stdio.h>
Packit Service db8eaa
#include <stdlib.h>
Packit Service db8eaa
#include <stdarg.h>
Packit Service db8eaa
#include <unistd.h>
Packit Service db8eaa
#include <string.h>
Packit Service db8eaa
#include "rawmidi_local.h"
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief setup the default parameters
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param params pointer to a snd_rawmidi_params_t structure
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
static int snd_rawmidi_params_default(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	params->buffer_size = page_size();
Packit Service db8eaa
	params->avail_min = 1;
Packit Service db8eaa
	params->no_active_sensing = 1;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
static int snd_rawmidi_open_conf(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
Packit Service db8eaa
				 const char *name, snd_config_t *rawmidi_root,
Packit Service db8eaa
				 snd_config_t *rawmidi_conf, int mode)
Packit Service db8eaa
{
Packit Service db8eaa
	const char *str;
Packit Service db8eaa
	char buf[256];
Packit Service db8eaa
	int err;
Packit Service db8eaa
	snd_config_t *conf, *type_conf = NULL;
Packit Service db8eaa
	snd_config_iterator_t i, next;
Packit Service db8eaa
	snd_rawmidi_params_t params;
Packit Service db8eaa
	const char *id;
Packit Service db8eaa
	const char *lib = NULL, *open_name = NULL;
Packit Service db8eaa
	int (*open_func)(snd_rawmidi_t **, snd_rawmidi_t **,
Packit Service db8eaa
			 const char *, snd_config_t *, snd_config_t *, int) = NULL;
Packit Service db8eaa
#ifndef PIC
Packit Service db8eaa
	extern void *snd_rawmidi_open_symbols(void);
Packit Service db8eaa
#endif
Packit Service db8eaa
	if (snd_config_get_type(rawmidi_conf) != SND_CONFIG_TYPE_COMPOUND) {
Packit Service db8eaa
		if (name)
Packit Service db8eaa
			SNDERR("Invalid type for RAWMIDI %s definition", name);
Packit Service db8eaa
		else
Packit Service db8eaa
			SNDERR("Invalid type for RAWMIDI definition");
Packit Service db8eaa
		return -EINVAL;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_search(rawmidi_conf, "type", &conf;;
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("type is not defined");
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_get_id(conf, &id;;
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("unable to get id");
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_get_string(conf, &str);
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("Invalid type for %s", id);
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_search_definition(rawmidi_root, "rawmidi_type", str, &type_conf);
Packit Service db8eaa
	if (err >= 0) {
Packit Service db8eaa
		if (snd_config_get_type(type_conf) != SND_CONFIG_TYPE_COMPOUND) {
Packit Service db8eaa
			SNDERR("Invalid type for RAWMIDI type %s definition", str);
Packit Service db8eaa
			err = -EINVAL;
Packit Service db8eaa
			goto _err;
Packit Service db8eaa
		}
Packit Service db8eaa
		snd_config_for_each(i, next, type_conf) {
Packit Service db8eaa
			snd_config_t *n = snd_config_iterator_entry(i);
Packit Service db8eaa
			const char *id;
Packit Service db8eaa
			if (snd_config_get_id(n, &id) < 0)
Packit Service db8eaa
				continue;
Packit Service db8eaa
			if (strcmp(id, "comment") == 0)
Packit Service db8eaa
				continue;
Packit Service db8eaa
			if (strcmp(id, "lib") == 0) {
Packit Service db8eaa
				err = snd_config_get_string(n, &lib);
Packit Service db8eaa
				if (err < 0) {
Packit Service db8eaa
					SNDERR("Invalid type for %s", id);
Packit Service db8eaa
					goto _err;
Packit Service db8eaa
				}
Packit Service db8eaa
				continue;
Packit Service db8eaa
			}
Packit Service db8eaa
			if (strcmp(id, "open") == 0) {
Packit Service db8eaa
				err = snd_config_get_string(n, &open_name);
Packit Service db8eaa
				if (err < 0) {
Packit Service db8eaa
					SNDERR("Invalid type for %s", id);
Packit Service db8eaa
					goto _err;
Packit Service db8eaa
				}
Packit Service db8eaa
				continue;
Packit Service db8eaa
			}
Packit Service db8eaa
			SNDERR("Unknown field %s", id);
Packit Service db8eaa
			err = -EINVAL;
Packit Service db8eaa
			goto _err;
Packit Service db8eaa
		}
Packit Service db8eaa
	}
Packit Service db8eaa
	if (!open_name) {
Packit Service db8eaa
		open_name = buf;
Packit Service db8eaa
		snprintf(buf, sizeof(buf), "_snd_rawmidi_%s_open", str);
Packit Service db8eaa
	}
Packit Service db8eaa
#ifndef PIC
Packit Service db8eaa
	snd_rawmidi_open_symbols();
Packit Service db8eaa
#endif
Packit Service db8eaa
	open_func = snd_dlobj_cache_get2(lib, open_name,
Packit Service db8eaa
			SND_DLSYM_VERSION(SND_RAWMIDI_DLSYM_VERSION), 1);
Packit Service db8eaa
	if (!open_func) {
Packit Service db8eaa
		err = -ENXIO;
Packit Service db8eaa
		goto _err;
Packit Service db8eaa
	}
Packit Service db8eaa
	if (type_conf)
Packit Service db8eaa
		snd_config_delete(type_conf);
Packit Service db8eaa
	err = open_func(inputp, outputp, name, rawmidi_root, rawmidi_conf, mode);
Packit Service db8eaa
	if (err < 0)
Packit Service db8eaa
		goto _err;
Packit Service db8eaa
	if (inputp) {
Packit Service db8eaa
		(*inputp)->open_func = open_func;
Packit Service db8eaa
		snd_rawmidi_params_default(*inputp, &params);
Packit Service db8eaa
		err = snd_rawmidi_params(*inputp, &params);
Packit Service db8eaa
		assert(err >= 0);
Packit Service db8eaa
	}
Packit Service db8eaa
	if (outputp) {
Packit Service db8eaa
		(*outputp)->open_func = open_func;
Packit Service db8eaa
		snd_rawmidi_params_default(*outputp, &params);
Packit Service db8eaa
		err = snd_rawmidi_params(*outputp, &params);
Packit Service db8eaa
		assert(err >= 0);
Packit Service db8eaa
	}
Packit Service db8eaa
	return 0;
Packit Service db8eaa
Packit Service db8eaa
       _err:
Packit Service db8eaa
	if (open_func)
Packit Service db8eaa
		snd_dlobj_cache_put(open_func);
Packit Service db8eaa
	if (type_conf)
Packit Service db8eaa
		snd_config_delete(type_conf);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
static int snd_rawmidi_open_noupdate(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
Packit Service db8eaa
				     snd_config_t *root, const char *name, int mode)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
	snd_config_t *rawmidi_conf;
Packit Service db8eaa
	err = snd_config_search_definition(root, "rawmidi", name, &rawmidi_conf);
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("Unknown RawMidi %s", name);
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_rawmidi_open_conf(inputp, outputp, name, root, rawmidi_conf, mode);
Packit Service db8eaa
	snd_config_delete(rawmidi_conf);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Opens a new connection to the RawMidi interface.
Packit Service db8eaa
 * \param inputp Returned input handle (NULL if not wanted)
Packit Service db8eaa
 * \param outputp Returned output handle (NULL if not wanted)
Packit Service db8eaa
 * \param name ASCII identifier of the RawMidi handle
Packit Service db8eaa
 * \param mode Open mode
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Opens a new connection to the RawMidi interface specified with
Packit Service db8eaa
 * an ASCII identifier and mode.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
Packit Service db8eaa
		     const char *name, int mode)
Packit Service db8eaa
{
Packit Service db8eaa
	snd_config_t *top;
Packit Service db8eaa
	int err;
Packit Service db8eaa
Packit Service db8eaa
	assert((inputp || outputp) && name);
Packit Service db8eaa
	err = snd_config_update_ref(&top);
Packit Service db8eaa
	if (err < 0)
Packit Service db8eaa
		return err;
Packit Service db8eaa
	err = snd_rawmidi_open_noupdate(inputp, outputp, top, name, mode);
Packit Service db8eaa
	snd_config_unref(top);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Opens a new connection to the RawMidi interface using local configuration
Packit Service db8eaa
 * \param inputp Returned input handle (NULL if not wanted)
Packit Service db8eaa
 * \param outputp Returned output handle (NULL if not wanted)
Packit Service db8eaa
 * \param name ASCII identifier of the RawMidi handle
Packit Service db8eaa
 * \param mode Open mode
Packit Service db8eaa
 * \param lconf Local configuration
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Opens a new connection to the RawMidi interface specified with
Packit Service db8eaa
 * an ASCII identifier and mode.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_open_lconf(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
Packit Service db8eaa
			   const char *name, int mode, snd_config_t *lconf)
Packit Service db8eaa
{
Packit Service db8eaa
	assert((inputp || outputp) && name && lconf);
Packit Service db8eaa
	return snd_rawmidi_open_noupdate(inputp, outputp, lconf, name, mode);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief close RawMidi handle
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Closes the specified RawMidi handle and frees all associated
Packit Service db8eaa
 * resources.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_close(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
  	assert(rawmidi);
Packit Service db8eaa
	err = rawmidi->ops->close(rawmidi);
Packit Service db8eaa
	free(rawmidi->name);
Packit Service db8eaa
	if (rawmidi->open_func)
Packit Service db8eaa
		snd_dlobj_cache_put(rawmidi->open_func);
Packit Service db8eaa
	free(rawmidi);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get identifier of RawMidi handle
Packit Service db8eaa
 * \param rawmidi a RawMidi handle
Packit Service db8eaa
 * \return ascii identifier of RawMidi handle
Packit Service db8eaa
 *
Packit Service db8eaa
 * Returns the ASCII identifier of given RawMidi handle. It's the same
Packit Service db8eaa
 * identifier specified in snd_rawmidi_open().
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_rawmidi_name(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	return rawmidi->name;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get type of RawMidi handle
Packit Service db8eaa
 * \param rawmidi a RawMidi handle
Packit Service db8eaa
 * \return type of RawMidi handle
Packit Service db8eaa
 *
Packit Service db8eaa
 * Returns the type #snd_rawmidi_type_t of given RawMidi handle.
Packit Service db8eaa
 */
Packit Service db8eaa
snd_rawmidi_type_t snd_rawmidi_type(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	return rawmidi->type;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get stream (direction) of RawMidi handle
Packit Service db8eaa
 * \param rawmidi a RawMidi handle
Packit Service db8eaa
 * \return stream of RawMidi handle
Packit Service db8eaa
 *
Packit Service db8eaa
 * Returns the stream #snd_rawmidi_stream_t of given RawMidi handle.
Packit Service db8eaa
 */
Packit Service db8eaa
snd_rawmidi_stream_t snd_rawmidi_stream(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	return rawmidi->stream;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get count of poll descriptors for RawMidi handle
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \return count of poll descriptors
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_poll_descriptors_count(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	return 1;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get poll descriptors
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param pfds array of poll descriptors
Packit Service db8eaa
 * \param space space in the poll descriptor array
Packit Service db8eaa
 * \return count of filled descriptors
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_poll_descriptors(snd_rawmidi_t *rawmidi, struct pollfd *pfds, unsigned int space)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	if (space >= 1) {
Packit Service db8eaa
		pfds->fd = rawmidi->poll_fd;
Packit Service db8eaa
		pfds->events = rawmidi->stream == SND_RAWMIDI_STREAM_OUTPUT ? (POLLOUT|POLLERR|POLLNVAL) : (POLLIN|POLLERR|POLLNVAL);
Packit Service db8eaa
		return 1;
Packit Service db8eaa
	}
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get returned events from poll descriptors
Packit Service db8eaa
 * \param rawmidi rawmidi RawMidi handle
Packit Service db8eaa
 * \param pfds array of poll descriptors
Packit Service db8eaa
 * \param nfds count of poll descriptors
Packit Service db8eaa
 * \param revents returned events
Packit Service db8eaa
 * \return zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_poll_descriptors_revents(snd_rawmidi_t *rawmidi, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
Packit Service db8eaa
{
Packit Service db8eaa
        assert(rawmidi && pfds && revents);
Packit Service db8eaa
        if (nfds == 1) {
Packit Service db8eaa
                *revents = pfds->revents;
Packit Service db8eaa
                return 0;
Packit Service db8eaa
        }
Packit Service db8eaa
        return -EINVAL;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set nonblock mode
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param nonblock 0 = block, 1 = nonblock mode
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * The nonblock mode cannot be used when the stream is in
Packit Service db8eaa
 * #SND_RAWMIDI_APPEND state.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_nonblock(snd_rawmidi_t *rawmidi, int nonblock)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(!(rawmidi->mode & SND_RAWMIDI_APPEND));
Packit Service db8eaa
	if ((err = rawmidi->ops->nonblock(rawmidi, nonblock)) < 0)
Packit Service db8eaa
		return err;
Packit Service db8eaa
	if (nonblock)
Packit Service db8eaa
		rawmidi->mode |= SND_RAWMIDI_NONBLOCK;
Packit Service db8eaa
	else
Packit Service db8eaa
		rawmidi->mode &= ~SND_RAWMIDI_NONBLOCK;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get size of the snd_rawmidi_info_t structure in bytes
Packit Service db8eaa
 * \return size of the snd_rawmidi_info_t structure in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_info_sizeof()
Packit Service db8eaa
{
Packit Service db8eaa
	return sizeof(snd_rawmidi_info_t);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief allocate a new snd_rawmidi_info_t structure
Packit Service db8eaa
 * \param info returned pointer
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code if fails
Packit Service db8eaa
 *
Packit Service db8eaa
 * Allocates a new snd_rawmidi_params_t structure using the standard
Packit Service db8eaa
 * malloc C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_info_malloc(snd_rawmidi_info_t **info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	*info = calloc(1, sizeof(snd_rawmidi_info_t));
Packit Service db8eaa
	if (!*info)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief frees the snd_rawmidi_info_t structure
Packit Service db8eaa
 * \param info pointer to the snd_rawmidi_info_t structure to free
Packit Service db8eaa
 *
Packit Service db8eaa
 * Frees the given snd_rawmidi_params_t structure using the standard
Packit Service db8eaa
 * free C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_info_free(snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	free(info);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief copy one snd_rawmidi_info_t structure to another
Packit Service db8eaa
 * \param dst destination snd_rawmidi_info_t structure
Packit Service db8eaa
 * \param src source snd_rawmidi_info_t structure
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_info_copy(snd_rawmidi_info_t *dst, const snd_rawmidi_info_t *src)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(dst && src);
Packit Service db8eaa
	*dst = *src;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi device number
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi device number
Packit Service db8eaa
 */
Packit Service db8eaa
unsigned int snd_rawmidi_info_get_device(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->device;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi subdevice number
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi subdevice number
Packit Service db8eaa
 */
Packit Service db8eaa
unsigned int snd_rawmidi_info_get_subdevice(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->subdevice;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi stream identification
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi stream identification
Packit Service db8eaa
 */
Packit Service db8eaa
snd_rawmidi_stream_t snd_rawmidi_info_get_stream(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->stream;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi card number
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi card number
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_info_get_card(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->card;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi flags
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi flags
Packit Service db8eaa
 */
Packit Service db8eaa
unsigned int snd_rawmidi_info_get_flags(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->flags;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi hardware driver identifier
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi hardware driver identifier
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_rawmidi_info_get_id(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return (const char *)info->id;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi hardware driver name
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi hardware driver name
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_rawmidi_info_get_name(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return (const char *)info->name;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi subdevice name
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi subdevice name
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_rawmidi_info_get_subdevice_name(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return (const char *)info->subname;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi count of subdevices
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi count of subdevices
Packit Service db8eaa
 */
Packit Service db8eaa
unsigned int snd_rawmidi_info_get_subdevices_count(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->subdevices_count;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi available count of subdevices
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \return rawmidi available count of subdevices
Packit Service db8eaa
 */
Packit Service db8eaa
unsigned int snd_rawmidi_info_get_subdevices_avail(const snd_rawmidi_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->subdevices_avail;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set rawmidi device number
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \param val device number
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_info_set_device(snd_rawmidi_info_t *info, unsigned int val)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	info->device = val;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set rawmidi subdevice number
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \param val subdevice number
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_info_set_subdevice(snd_rawmidi_info_t *info, unsigned int val)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	info->subdevice = val;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set rawmidi stream identifier
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure
Packit Service db8eaa
 * \param val rawmidi stream identifier
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_info_set_stream(snd_rawmidi_info_t *info, snd_rawmidi_stream_t val)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	info->stream = val;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get information about RawMidi handle
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param info pointer to a snd_rawmidi_info_t structure to be filled
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_info(snd_rawmidi_t *rawmidi, snd_rawmidi_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return rawmidi->ops->info(rawmidi, info);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get size of the snd_rawmidi_params_t structure in bytes
Packit Service db8eaa
 * \return size of the snd_rawmidi_params_t structure in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_params_sizeof()
Packit Service db8eaa
{
Packit Service db8eaa
	return sizeof(snd_rawmidi_params_t);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief allocate the snd_rawmidi_params_t structure
Packit Service db8eaa
 * \param params returned pointer
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code if fails
Packit Service db8eaa
 *
Packit Service db8eaa
 * Allocates a new snd_rawmidi_params_t structure using the standard
Packit Service db8eaa
 * malloc C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_params_malloc(snd_rawmidi_params_t **params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	*params = calloc(1, sizeof(snd_rawmidi_params_t));
Packit Service db8eaa
	if (!*params)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief frees the snd_rawmidi_params_t structure
Packit Service db8eaa
 * \param params pointer to the #snd_rawmidi_params_t structure to free
Packit Service db8eaa
 *
Packit Service db8eaa
 * Frees the given snd_rawmidi_params_t structure using the standard
Packit Service db8eaa
 * free C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_params_free(snd_rawmidi_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	free(params);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief copy one snd_rawmidi_params_t structure to another
Packit Service db8eaa
 * \param dst destination snd_rawmidi_params_t structure
Packit Service db8eaa
 * \param src source snd_rawmidi_params_t structure
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_params_copy(snd_rawmidi_params_t *dst, const snd_rawmidi_params_t *src)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(dst && src);
Packit Service db8eaa
	*dst = *src;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set rawmidi I/O ring buffer size
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param params pointer to a snd_rawmidi_params_t structure
Packit Service db8eaa
 * \param val size in bytes
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
int snd_rawmidi_params_set_buffer_size(snd_rawmidi_t *rawmidi ATTRIBUTE_UNUSED, snd_rawmidi_params_t *params, size_t val)
Packit Service db8eaa
#else
Packit Service db8eaa
int snd_rawmidi_params_set_buffer_size(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t *params, size_t val)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi && params);
Packit Service db8eaa
	assert(val > params->avail_min);
Packit Service db8eaa
	params->buffer_size = val;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get rawmidi I/O ring buffer size
Packit Service db8eaa
 * \param params pointer to a snd_rawmidi_params_t structure
Packit Service db8eaa
 * \return size of rawmidi I/O ring buffer in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_params_get_buffer_size(const snd_rawmidi_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->buffer_size;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set minimum available bytes in rawmidi I/O ring buffer for wakeup
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param params pointer to a snd_rawmidi_params_t structure
Packit Service db8eaa
 * \param val desired value
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
int snd_rawmidi_params_set_avail_min(snd_rawmidi_t *rawmidi ATTRIBUTE_UNUSED, snd_rawmidi_params_t *params, size_t val)
Packit Service db8eaa
#else
Packit Service db8eaa
int snd_rawmidi_params_set_avail_min(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t *params, size_t val)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi && params);
Packit Service db8eaa
	assert(val < params->buffer_size);
Packit Service db8eaa
	params->avail_min = val;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get minimum available bytes in rawmidi I/O ring buffer for wakeup
Packit Service db8eaa
 * \param params pointer to snd_rawmidi_params_t structure
Packit Service db8eaa
 * \return minimum available bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_params_get_avail_min(const snd_rawmidi_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->avail_min;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set no-active-sensing action on snd_rawmidi_close()
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param params pointer to snd_rawmidi_params_t structure
Packit Service db8eaa
 * \param val value: 0 = enable to send the active sensing message, 1 = disable
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
int snd_rawmidi_params_set_no_active_sensing(snd_rawmidi_t *rawmidi ATTRIBUTE_UNUSED, snd_rawmidi_params_t *params, int val)
Packit Service db8eaa
#else
Packit Service db8eaa
int snd_rawmidi_params_set_no_active_sensing(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t *params, int val)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi && params);
Packit Service db8eaa
	params->no_active_sensing = val;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get no-active-sensing action status
Packit Service db8eaa
 * \param params pointer to snd_rawmidi_params_t structure
Packit Service db8eaa
 * \return the current status (0 = enable, 1 = disable the active sensing message)
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_params_get_no_active_sensing(const snd_rawmidi_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->no_active_sensing;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set parameters about rawmidi stream
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param params pointer to a snd_rawmidi_params_t structure to be filled
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_params(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t * params)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	err = rawmidi->ops->params(rawmidi, params);
Packit Service db8eaa
	if (err < 0)
Packit Service db8eaa
		return err;
Packit Service db8eaa
	rawmidi->buffer_size = params->buffer_size;
Packit Service db8eaa
	rawmidi->avail_min = params->avail_min;
Packit Service db8eaa
	rawmidi->no_active_sensing = params->no_active_sensing;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get current parameters about rawmidi stream
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param params pointer to a snd_rawmidi_params_t structure to be filled
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_params_current(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	params->buffer_size = rawmidi->buffer_size;
Packit Service db8eaa
	params->avail_min = rawmidi->avail_min;
Packit Service db8eaa
	params->no_active_sensing = rawmidi->no_active_sensing;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get size of the snd_rawmidi_status_t structure in bytes
Packit Service db8eaa
 * \return size of the snd_rawmidi_status_t structure in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_status_sizeof()
Packit Service db8eaa
{
Packit Service db8eaa
	return sizeof(snd_rawmidi_status_t);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief allocate the snd_rawmidi_status_t structure
Packit Service db8eaa
 * \param ptr returned pointer
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code if fails
Packit Service db8eaa
 *
Packit Service db8eaa
 * Allocates a new snd_rawmidi_status_t structure using the standard
Packit Service db8eaa
 * malloc C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_status_malloc(snd_rawmidi_status_t **ptr)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(ptr);
Packit Service db8eaa
	*ptr = calloc(1, sizeof(snd_rawmidi_status_t));
Packit Service db8eaa
	if (!*ptr)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief frees the snd_rawmidi_status_t structure
Packit Service db8eaa
 * \param status pointer to the snd_rawmidi_status_t structure to free
Packit Service db8eaa
 *
Packit Service db8eaa
 * Frees the given snd_rawmidi_status_t structure using the standard
Packit Service db8eaa
 * free C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_status_free(snd_rawmidi_status_t *status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	free(status);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief copy one snd_rawmidi_status_t structure to another
Packit Service db8eaa
 * \param dst destination snd_rawmidi_status_t structure
Packit Service db8eaa
 * \param src source snd_rawmidi_status_t structure
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_status_copy(snd_rawmidi_status_t *dst, const snd_rawmidi_status_t *src)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(dst && src);
Packit Service db8eaa
	*dst = *src;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get the start timestamp
Packit Service db8eaa
 * \param status pointer to a snd_rawmidi_status_t structure
Packit Service db8eaa
 * \param tstamp returned timestamp value
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_rawmidi_status_get_tstamp(const snd_rawmidi_status_t *status, snd_htimestamp_t *tstamp)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status && tstamp);
Packit Service db8eaa
	*tstamp = status->tstamp;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get current available bytes in the rawmidi I/O ring buffer
Packit Service db8eaa
 * \param status pointer to a snd_rawmidi_status_t structure
Packit Service db8eaa
 * \return current available bytes in the rawmidi I/O ring buffer
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_status_get_avail(const snd_rawmidi_status_t *status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->avail;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get count of xruns
Packit Service db8eaa
 * \param status pointer to a snd_rawmidi_status_t structure
Packit Service db8eaa
 * \return count of xruns
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_rawmidi_status_get_xruns(const snd_rawmidi_status_t *status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->xruns;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get status of rawmidi stream
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param status pointer to a snd_rawmidi_status_t structure to be filled
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_status(snd_rawmidi_t *rawmidi, snd_rawmidi_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return rawmidi->ops->status(rawmidi, status);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief drop all bytes in the rawmidi I/O ring buffer immediately
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_drop(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	return rawmidi->ops->drop(rawmidi);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief drain all bytes in the rawmidi I/O ring buffer
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Waits until all MIDI bytes are not drained (sent) to the
Packit Service db8eaa
 * hardware device.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_rawmidi_drain(snd_rawmidi_t *rawmidi)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	return rawmidi->ops->drain(rawmidi);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief write MIDI bytes to MIDI stream
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param buffer buffer containing MIDI bytes
Packit Service db8eaa
 * \param size output buffer size in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
ssize_t snd_rawmidi_write(snd_rawmidi_t *rawmidi, const void *buffer, size_t size)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(rawmidi->stream == SND_RAWMIDI_STREAM_OUTPUT);
Packit Service db8eaa
	assert(buffer || size == 0);
Packit Service db8eaa
	return rawmidi->ops->write(rawmidi, buffer, size);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief read MIDI bytes from MIDI stream
Packit Service db8eaa
 * \param rawmidi RawMidi handle
Packit Service db8eaa
 * \param buffer buffer to store the input MIDI bytes
Packit Service db8eaa
 * \param size input buffer size in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
ssize_t snd_rawmidi_read(snd_rawmidi_t *rawmidi, void *buffer, size_t size)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(rawmidi);
Packit Service db8eaa
	assert(rawmidi->stream == SND_RAWMIDI_STREAM_INPUT);
Packit Service db8eaa
	assert(buffer || size == 0);
Packit Service db8eaa
	return (rawmidi->ops->read)(rawmidi, buffer, size);
Packit Service db8eaa
}