Files
odin-alsa/alsa.odin
T

248 lines
7.1 KiB
Odin
Raw Normal View History

2025-06-28 10:40:05 +02:00
#+build linux
package alsa
import "core:c"
foreign import alsa "system:asound"
pcm_open_flags :: enum i32 {
2025-06-28 21:19:00 +02:00
BLOCK = 0x0,
NONBLOCK = 0x00000001,
ASYNC = 0x00000002,
2025-06-28 10:40:05 +02:00
}
/** PCM stream (direction) */
pcm_stream_t :: enum i32 {
2025-06-28 21:19:00 +02:00
/** Playback stream */
PLAYBACK = 0,
/** Capture stream */
CAPTURE,
LAST = CAPTURE,
2025-06-28 10:40:05 +02:00
}
/** PCM sample format */
pcm_format_t :: enum {
2025-06-28 21:19:00 +02:00
/** Unknown */
UNKNOWN = -1,
/** Signed 8 bit */
S8 = 0,
/** Unsigned 8 bit */
U8,
/** Signed 16 bit Little Endian */
S16_LE,
/** Signed 16 bit Big Endian */
S16_BE,
/** Unsigned 16 bit Little Endian */
U16_LE,
/** Unsigned 16 bit Big Endian */
U16_BE,
/** Signed 24 bit Little Endian using low three bytes in 32-bit word */
S24_LE,
/** Signed 24 bit Big Endian using low three bytes in 32-bit word */
S24_BE,
/** Unsigned 24 bit Little Endian using low three bytes in 32-bit word */
U24_LE,
/** Unsigned 24 bit Big Endian using low three bytes in 32-bit word */
U24_BE,
/** Signed 32 bit Little Endian */
S32_LE,
/** Signed 32 bit Big Endian */
S32_BE,
/** Unsigned 32 bit Little Endian */
U32_LE,
/** Unsigned 32 bit Big Endian */
U32_BE,
/** Float 32 bit Little Endian, Range -1.0 to 1.0 */
FLOAT_LE,
/** Float 32 bit Big Endian, Range -1.0 to 1.0 */
FLOAT_BE,
/** Float 64 bit Little Endian, Range -1.0 to 1.0 */
FLOAT64_LE,
/** Float 64 bit Big Endian, Range -1.0 to 1.0 */
FLOAT64_BE,
/** IEC-958 Little Endian */
IEC958_SUBFRAME_LE,
/** IEC-958 Big Endian */
IEC958_SUBFRAME_BE,
/** Mu-Law */
MU_LAW,
/** A-Law */
A_LAW,
/** Ima-ADPCM */
IMA_ADPCM,
/** MPEG */
MPEG,
/** GSM */
GSM,
/** Signed 20bit Little Endian in 4bytes format, LSB justified */
S20_LE,
/** Signed 20bit Big Endian in 4bytes format, LSB justified */
S20_BE,
/** Unsigned 20bit Little Endian in 4bytes format, LSB justified */
U20_LE,
/** Unsigned 20bit Big Endian in 4bytes format, LSB justified */
U20_BE,
/** Special */
SPECIAL = 31,
/** Signed 24bit Little Endian in 3bytes format */
S24_3LE = 32,
/** Signed 24bit Big Endian in 3bytes format */
S24_3BE,
/** Unsigned 24bit Little Endian in 3bytes format */
U24_3LE,
/** Unsigned 24bit Big Endian in 3bytes format */
U24_3BE,
/** Signed 20bit Little Endian in 3bytes format */
S20_3LE,
/** Signed 20bit Big Endian in 3bytes format */
S20_3BE,
/** Unsigned 20bit Little Endian in 3bytes format */
U20_3LE,
/** Unsigned 20bit Big Endian in 3bytes format */
U20_3BE,
/** Signed 18bit Little Endian in 3bytes format */
S18_3LE,
/** Signed 18bit Big Endian in 3bytes format */
S18_3BE,
/** Unsigned 18bit Little Endian in 3bytes format */
U18_3LE,
/** Unsigned 18bit Big Endian in 3bytes format */
U18_3BE,
/* G.723 (ADPCM) 24 kbit/s, 8 samples in 3 bytes */
G723_24,
/* G.723 (ADPCM) 24 kbit/s, 1 sample in 1 byte */
G723_24_1B,
/* G.723 (ADPCM) 40 kbit/s, 8 samples in 3 bytes */
G723_40,
/* G.723 (ADPCM) 40 kbit/s, 1 sample in 1 byte */
G723_40_1B,
/* Direct Stream Digital (DSD) in 1-byte samples (x8) */
DSD_U8,
/* Direct Stream Digital (DSD) in 2-byte samples (x16) */
DSD_U16_LE,
/* Direct Stream Digital (DSD) in 4-byte samples (x32) */
DSD_U32_LE,
/* Direct Stream Digital (DSD) in 2-byte samples (x16) */
DSD_U16_BE,
/* Direct Stream Digital (DSD) in 4-byte samples (x32) */
DSD_U32_BE,
LAST = DSD_U32_BE,
2025-06-28 10:40:05 +02:00
2025-06-28 21:19:00 +02:00
/** Signed 16 bit CPU endian */
S16 = S16_BE when ODIN_ENDIAN == .Big else S16_LE,
/** Unsigned 16 bit CPU endian */
U16 = U16_BE when ODIN_ENDIAN == .Big else U16_LE,
/** Signed 24 bit CPU endian */
S24 = S24_BE when ODIN_ENDIAN == .Big else S32_LE,
/** Unsigned 24 bit CPU endian */
U24 = U24_BE when ODIN_ENDIAN == .Big else U24_LE,
/** Signed 32 bit CPU endian */
S32 = S32_BE when ODIN_ENDIAN == .Big else S32_LE,
/** Unsigned 32 bit CPU endian */
U32 = U32_BE when ODIN_ENDIAN == .Big else U32_LE,
/** Float 32 bit CPU endian */
FLOAT = FLOAT_BE when ODIN_ENDIAN == .Big else FLOAT_LE,
/** Float 64 bit CPU endian */
FLOAT64 = FLOAT64_BE when ODIN_ENDIAN == .Big else FLOAT64_LE,
/** IEC-958 CPU Endian */
IEC958_SUBFRAME = IEC958_SUBFRAME_BE when ODIN_ENDIAN == .Big else IEC958_SUBFRAME_LE,
/** Signed 20bit in 4bytes format, LSB justified, CPU Endian */
S20 = S20_BE when ODIN_ENDIAN == .Big else S20_LE,
/** Unsigned 20bit in 4bytes format, LSB justified, CPU Endian */
U20 = U20_BE when ODIN_ENDIAN == .Big else U20_LE,
2025-06-28 10:40:05 +02:00
}
/** PCM access type */
pcm_access_t :: enum {
2025-06-28 21:19:00 +02:00
/** mmap access with simple interleaved channels */
MMAP_INTERLEAVED = 0,
/** mmap access with simple non interleaved channels */
MMAP_NONINTERLEAVED,
/** mmap access with complex placement */
MMAP_COMPLEX,
/** snd_pcm_readi/snd_pcm_writei access */
RW_INTERLEAVED,
/** snd_pcm_readn/snd_pcm_writen access */
RW_NONINTERLEAVED,
LAST = RW_NONINTERLEAVED
2025-06-28 10:40:05 +02:00
}
/** channel positions */
pcm_chmap_position :: enum i32 {
UNKNOWN = 0, /**< unspecified */
NA, /**< N/A, silent */
MONO, /**< mono stream */
FL, /**< front left */
FR, /**< front right */
RL, /**< rear left */
RR, /**< rear right */
FC, /**< front center */
LFE, /**< LFE */
SL, /**< side left */
SR, /**< side right */
RC, /**< rear center */
FLC, /**< front left center */
FRC, /**< front right center */
RLC, /**< rear left center */
RRC, /**< rear right center */
FLW, /**< front left wide */
FRW, /**< front right wide */
FLH, /**< front left high */
FCH, /**< front center high */
FRH, /**< front right high */
TC, /**< top center */
TFL, /**< top front left */
TFR, /**< top front right */
TFC, /**< top front center */
TRL, /**< top rear left */
TRR, /**< top rear right */
TRC, /**< top rear center */
TFLC, /**< top front left center */
TFRC, /**< top front right center */
TSL, /**< top side left */
TSR, /**< top side right */
LLFE, /**< left LFE */
RLFE, /**< right LFE */
BC, /**< bottom center */
BLC, /**< bottom left center */
BRC, /**< bottom right center */
LAST = BRC,
}
pcm_uframes_t :: c.ulong
pcm_sframes_t :: c.long
pcm_t :: struct{}
pcm_hw_params_t :: struct{}
pcm_chmap_t :: struct {
// Number of channels
channels: u32,
// Channel position array
pos: [0]u32,
}
@(link_prefix="snd_")
foreign alsa {
2025-06-28 21:19:00 +02:00
pcm_open :: proc(pcmp: ^^pcm_t, name: cstring, stream: pcm_stream_t, mode: pcm_open_flags) -> i32 ---
strerror :: proc(errnum: i32) -> cstring ---
pcm_set_params :: proc(
pcm: ^pcm_t,
format: pcm_format_t,
access: pcm_access_t,
channels: u32,
rate: u32,
soft_resample: i32,
latency: u32) -> i32 ---
pcm_drain :: proc(pcm: ^pcm_t) -> i32 ---
pcm_close :: proc(pcm: ^pcm_t) -> i32 ---
pcm_prepare :: proc(pcm: ^pcm_t) -> i32 ---
pcm_writei :: proc(pcm: ^pcm_t, buffer: rawptr, size: pcm_uframes_t) -> pcm_sframes_t ---
pcm_writen :: proc(pcm: ^pcm_t, bufs: [^]rawptr, size: pcm_uframes_t) -> pcm_sframes_t ---
pcm_readi :: proc(pcm: ^pcm_t, buffer: rawptr, size: pcm_uframes_t) -> pcm_sframes_t ---
pcm_readn :: proc(pcm: ^pcm_t, bufs: [^]rawptr, size: pcm_uframes_t) -> pcm_sframes_t ---
pcm_format_width :: proc(format: pcm_format_t) -> i32 ---
2025-06-28 10:40:05 +02:00
pcm_hw_params_set_channels :: proc(pcm: ^pcm_t, params: ^pcm_hw_params_t, val: u32) ---
pcm_chmap_long_name :: proc(val: pcm_chmap_position) -> cstring ---
pcm_get_chmap :: proc(pcm: ^pcm_t) -> ^pcm_chmap_t ---
}