Blame src/rawmidi/rawmidi.c

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

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

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