zdoom-macos-deps/deps/instpatch/include/libinstpatch/sample.h
2022-09-06 13:49:23 +03:00

344 lines
10 KiB
C

/*
* libInstPatch
* Copyright (C) 1999-2014 Element Green <element@elementsofsound.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; version 2.1
* of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA or on the web at http://www.gnu.org.
*/
#ifndef __SAMPLE_H__
#define __SAMPLE_H__
#include <glib.h>
/**
* IPATCH_SAMPLE_MAX_TRANSFORM_FUNCS: (skip)
*
* Maximum number of transform functions returned by
* ipatch_sample_get_transform_funcs(). Is larger than current actual maximum
* to allow for future backwards compatible expansion (8 is the real current
* maximum).
*/
#define IPATCH_SAMPLE_MAX_TRANSFORM_FUNCS 16
#include <libinstpatch/IpatchSampleTransform.h>
/**
* IPATCH_SAMPLE_FORMAT_MASK:
*
* Mask for all fields of sample format integers (width, sign, endian, channel).
*/
#define IPATCH_SAMPLE_FORMAT_MASK 0x1FF
/**
* IPATCH_SAMPLE_FORMAT_BITCOUNT:
*
* Number of bits used for sample format integers.
*/
#define IPATCH_SAMPLE_FORMAT_BITCOUNT 9
#define IPATCH_SAMPLE_WIDTH_MASK 0x00F /* total of 16 formats (8 reserved) */
#define IPATCH_SAMPLE_CHANNEL_MASK 0x070 /* channel count (8 channels max) */
#define IPATCH_SAMPLE_SIGN_MASK 0x080 /* sign or unsigned (for PCM formats) */
#define IPATCH_SAMPLE_ENDIAN_MASK 0x100 /* endian byte order */
#define IPATCH_SAMPLE_WIDTH_SHIFT 0
#define IPATCH_SAMPLE_CHANNEL_SHIFT 4
#define IPATCH_SAMPLE_SIGN_SHIFT 7
#define IPATCH_SAMPLE_ENDIAN_SHIFT 8
/**
* IpatchSampleWidth:
* @IPATCH_SAMPLE_INVALID: Invalid format (so 0 can be used to indicate a NULL state)
* @IPATCH_SAMPLE_8BIT: 8 bit integer PCM
* @IPATCH_SAMPLE_16BIT: 16 bit integer PCM
* @IPATCH_SAMPLE_24BIT: 24 bit integer PCM (32 bit ints)
* @IPATCH_SAMPLE_32BIT: 32 bit integer PCM
* @IPATCH_SAMPLE_FLOAT: 32 bit IEEE float (-1.0 - 1.0)
* @IPATCH_SAMPLE_DOUBLE: 64 bit IEEE double (-1.0 - 1.0)
* @IPATCH_SAMPLE_REAL24BIT: Real 3 byte 24 bit data (not padded to 32 bits)
*
* Sample data widths/formats.
*/
typedef enum
{
IPATCH_SAMPLE_INVALID = 0,
IPATCH_SAMPLE_BIT8 = 1,
IPATCH_SAMPLE_BIT16 = 2,
IPATCH_SAMPLE_BIT24 = 3,
IPATCH_SAMPLE_BIT32 = 4,
IPATCH_SAMPLE_FLOAT = 5,
IPATCH_SAMPLE_DOUBLE = 6,
IPATCH_SAMPLE_REAL24BIT = 7
} IpatchSampleWidth;
/* Renamed to be GObject Introspection friendly (symbols can't start with numbers).
* Backwards compatible defines below. */
/**
* IPATCH_SAMPLE_8BIT: (skip)
*/
#define IPATCH_SAMPLE_8BIT IPATCH_SAMPLE_BIT8
/**
* IPATCH_SAMPLE_16BIT: (skip)
*/
#define IPATCH_SAMPLE_16BIT IPATCH_SAMPLE_BIT16
/**
* IPATCH_SAMPLE_24BIT: (skip)
*/
#define IPATCH_SAMPLE_24BIT IPATCH_SAMPLE_BIT24
/**
* IPATCH_SAMPLE_32BIT: (skip)
*/
#define IPATCH_SAMPLE_32BIT IPATCH_SAMPLE_BIT32
/**
* IpatchSampleChannel:
* @IPATCH_SAMPLE_MONO: Mono audio
* @IPATCH_SAMPLE_STEREO: Stereo audio
*
* Descriptive enums for common audio channel configurations. These values
* are actually channel count - 1 (0 = mono, 1 = stereo, etc) and can be compared
* with the macro IPATCH_SAMPLE_FORMAT_GET_CHANNELS().
*/
typedef enum
{
IPATCH_SAMPLE_MONO = 0 << IPATCH_SAMPLE_CHANNEL_SHIFT,
IPATCH_SAMPLE_STEREO = 1 << IPATCH_SAMPLE_CHANNEL_SHIFT
} IpatchSampleChannel;
/**
* IpatchSampleChannelType:
* @IPATCH_SAMPLE_LEFT: Left channel comes first
* @IPATCH_SAMPLE_RIGHT: Right channel comes second
*
* Channel designation. Currently there are only 2 designated channels,
* though the remaining 6 supported channels may be defined to be surround
* sound channels in the future.
*/
typedef enum
{
IPATCH_SAMPLE_LEFT = 0,
IPATCH_SAMPLE_RIGHT = 1
} IpatchSampleChannelType;
/**
* IPATCH_SAMPLE_MAX_CHANNELS:
*
* Maximum number of audio channels handled by libInstPatch.
*/
#define IPATCH_SAMPLE_MAX_CHANNELS 8
/**
* IpatchSampleSign:
* @IPATCH_SAMPLE_SIGNED: Signed PCM audio data.
* @IPATCH_SAMPLE_UNSIGNED: Unsigned PCM audio data.
*
* Defines the sign of PCM integer audio data.
*/
typedef enum
{
IPATCH_SAMPLE_SIGNED = 0 << IPATCH_SAMPLE_SIGN_SHIFT,
IPATCH_SAMPLE_UNSIGNED = 1 << IPATCH_SAMPLE_SIGN_SHIFT
} IpatchSampleSign;
/**
* IpatchSampleEndian:
* @IPATCH_SAMPLE_LENDIAN: Little endian byte order
* @IPATCH_SAMPLE_BENDIAN: Big endian byte order
*
* Defines the byte order of multi-byte audio data.
*/
typedef enum
{
IPATCH_SAMPLE_LENDIAN = 0 << IPATCH_SAMPLE_ENDIAN_SHIFT,
IPATCH_SAMPLE_BENDIAN = 1 << IPATCH_SAMPLE_ENDIAN_SHIFT
} IpatchSampleEndian;
/**
* IPATCH_SAMPLE_ENDIAN_HOST:
*
* Host byte order value (#IPATCH_SAMPLE_LENDIAN or #IPATCH_SAMPLE_BENDIAN).
*/
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define IPATCH_SAMPLE_ENDIAN_HOST IPATCH_SAMPLE_LENDIAN
#else
#define IPATCH_SAMPLE_ENDIAN_HOST IPATCH_SAMPLE_BENDIAN
#endif
/**
* IPATCH_SAMPLE_FORMAT_GET_WIDTH:
* @format: Sample format integer
*
* Get #IpatchSampleWidth enum from a sample format integer.
*
* Returns: Format field of sample format integer.
*/
#define IPATCH_SAMPLE_FORMAT_GET_WIDTH(format) \
((format) & IPATCH_SAMPLE_WIDTH_MASK)
/**
* IPATCH_SAMPLE_FORMAT_IS_FLOATING:
* @format: Sample format integer
*
* Check if a sample format integer defines floating point audio.
*
* Returns: %TRUE if sample format is #IPATCH_SAMPLE_FLOAT or #IPATCH_SAMPLE_DOUBLE.
*/
#define IPATCH_SAMPLE_FORMAT_IS_FLOATING(format) \
(((format) & IPATCH_SAMPLE_WIDTH_MASK) == IPATCH_SAMPLE_FLOAT \
|| ((format) & IPATCH_SAMPLE_WIDTH_MASK) == IPATCH_SAMPLE_DOUBLE)
/**
* IPATCH_SAMPLE_FORMAT_GET_CHANNELS:
* @format: Sample format integer
*
* Get the channel field from a sample format integer.
*
* Returns: Channel field value (see #IpatchSampleChannel)
*/
#define IPATCH_SAMPLE_FORMAT_GET_CHANNELS(format) \
((format) & IPATCH_SAMPLE_CHANNEL_MASK)
/**
* IPATCH_SAMPLE_FORMAT_GET_CHANNEL_COUNT:
* @format: Sample format integer
*
* Get the channel count from a sample format integer.
*
* Returns: Channel count (starting at 1 for mono).
*/
#define IPATCH_SAMPLE_FORMAT_GET_CHANNEL_COUNT(format) \
((((format) & IPATCH_SAMPLE_CHANNEL_MASK) >> IPATCH_SAMPLE_CHANNEL_SHIFT) + 1)
/**
* IPATCH_SAMPLE_FORMAT_IS_SIGNED:
* @format: Sample format integer
*
* Check if a sample format integer defines signed audio.
*
* Returns: %TRUE if sample format is signed.
*/
#define IPATCH_SAMPLE_FORMAT_IS_SIGNED(format) \
(((format) & IPATCH_SAMPLE_UNSIGNED) == 0)
/**
* IPATCH_SAMPLE_FORMAT_IS_UNSIGNED:
* @format: Sample format integer
*
* Check if a sample format integer defines unsigned audio.
*
* Returns: %TRUE if sample format is unsigned.
*/
#define IPATCH_SAMPLE_FORMAT_IS_UNSIGNED(format) \
(((format) & IPATCH_SAMPLE_UNSIGNED) != 0)
/**
* IPATCH_SAMPLE_FORMAT_IS_LENDIAN:
* @format: Sample format integer
*
* Check if a sample format integer defines little endian audio.
*
* Returns: %TRUE if sample format is little endian.
*/
#define IPATCH_SAMPLE_FORMAT_IS_LENDIAN(format) \
(((format) & IPATCH_SAMPLE_BENDIAN) == 0)
/**
* IPATCH_SAMPLE_FORMAT_IS_BENDIAN:
* @format: Sample format integer
*
* Check if a sample format integer defines big endian audio.
*
* Returns: %TRUE if sample format is big endian.
*/
#define IPATCH_SAMPLE_FORMAT_IS_BENDIAN(format) \
(((format) & IPATCH_SAMPLE_BENDIAN) != 0)
/**
* ipatch_sample_format_size:
* @format: Sample format integer
*
* Get frame byte size for a given sample format (sample byte size * channels).
*
* Returns: Size in bytes of a single sample frame.
*/
#define ipatch_sample_format_size(format) \
(ipatch_sample_width_sizes[(format) & IPATCH_SAMPLE_WIDTH_MASK] \
* IPATCH_SAMPLE_FORMAT_GET_CHANNEL_COUNT (format))
/**
* ipatch_sample_format_width:
* @format: Sample format
*
* Gets the number of bytes used for storing a single sample for @format.
* Doesn't take into account channels. This is the number of bytes used
* to store the samples, not the effective bit width. For example:
* #IPATCH_SAMPLE_24BIT uses 4 bytes for each sample.
*
* Returns: Byte width of a single sample (not including channels).
*/
#define ipatch_sample_format_width(format) \
(ipatch_sample_width_sizes[(format) & IPATCH_SAMPLE_WIDTH_MASK])
/**
* IPATCH_SAMPLE_MAP_CHANNEL:
* @dest: Destination channel in mapping bit field (0-7)
* @src: Source channel (0-7)
*
* Macro to calculate a channel mapping value for a given destination and
* source. A channel mapping is composed of up to 24 bits
* (3 bits * 8 channels = 24). Channel mappings are used for sample
* conversions to route channels from a source format to a destination format.
* Multiple channel map values should be OR'd together.
*/
#define IPATCH_SAMPLE_MAP_CHANNEL(dest, src) ((src) << (3 * (dest)))
/**
* IPATCH_SAMPLE_MAP_GET_CHANNEL:
* @map: Channel map value (#guint32 - only 24 bits are used)
* @dest: Destination channel in @map bit field (0-7)
*
* Macro to get a source channel value given a destination channel.
*
* Returns: Source channel for @dest (0-7)
*/
#define IPATCH_SAMPLE_MAP_GET_CHANNEL(map, dest) (((map) >> ((dest) * 3)) & 0x07)
/**
* IPATCH_SAMPLE_UNITY_CHANNEL_MAP:
*
* Unity channel mapping which routes each input channel to the same output
* channel.
*/
#define IPATCH_SAMPLE_UNITY_CHANNEL_MAP 0xFAC688
extern guint ipatch_sample_width_sizes[16];
int ipatch_sample_format_bit_width(int format);
gboolean ipatch_sample_format_verify(int format);
gboolean ipatch_sample_format_transform_verify(int src_format, int dest_format,
guint32 channel_map);
guint ipatch_sample_get_transform_funcs(int src_format, int dest_format,
guint32 channel_map,
guint *buf1_max_frame,
guint *buf2_max_frame,
IpatchSampleTransformFunc *funcs);
#endif