349 lines
11 KiB
Odin
349 lines
11 KiB
Odin
package pulse
|
|||
|
|
|
||
|
|
import "core:text/regex/virtual_machine"
|
||
|
|
import "core:sys/posix"
|
||
|
|
import "core:c"
|
||
|
|
|
||
|
|
foreign import pulse "system:pulse"
|
||
|
|
|
||
|
|
pa_context_flags :: enum c.int {
|
||
|
|
NOFLAGS,
|
||
|
|
NOAUTOSPAWN,
|
||
|
|
NOFAIL,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_io_event_flags_bits :: enum c.int {
|
||
|
|
INPUT,
|
||
|
|
OUTPUT,
|
||
|
|
HANGUP,
|
||
|
|
ERROR,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_context_state :: enum c.int {
|
||
|
|
UNCONNECTED,
|
||
|
|
CONNECTING,
|
||
|
|
AUTHORIZING,
|
||
|
|
SETTING_NAME,
|
||
|
|
READY,
|
||
|
|
FAILED,
|
||
|
|
TERMINATED,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_update_mode :: enum c.int {
|
||
|
|
SET,
|
||
|
|
MERGE,
|
||
|
|
REPLACE,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_sink_flags_bits :: enum c.int {
|
||
|
|
HW_VOLUME_CTRL,
|
||
|
|
LATENCY,
|
||
|
|
HARDWARE,
|
||
|
|
NETWORK,
|
||
|
|
HW_MUTE_CTRL,
|
||
|
|
DECIBEL_VOLUME,
|
||
|
|
FLAT_VOLUME,
|
||
|
|
DYNAMIC_LATENCY,
|
||
|
|
SET_FORMATS,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_sink_state :: enum c.int {
|
||
|
|
INVALID = -1,
|
||
|
|
RUNNING,
|
||
|
|
IDLE,
|
||
|
|
SUSPENDED,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_port_available :: enum c.int {
|
||
|
|
UNKNOWN,
|
||
|
|
NO,
|
||
|
|
YES,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_device_port_type :: enum u32 {
|
||
|
|
UNKNOWN,
|
||
|
|
AUX,
|
||
|
|
SPEAKER,
|
||
|
|
HEADPHONES,
|
||
|
|
LINE,
|
||
|
|
MIC,
|
||
|
|
HEADSET,
|
||
|
|
HANDSET,
|
||
|
|
EARPIECE,
|
||
|
|
SPDIF,
|
||
|
|
HDMI,
|
||
|
|
TV,
|
||
|
|
RADIO,
|
||
|
|
VIDEO,
|
||
|
|
USB,
|
||
|
|
BLUETOOTH,
|
||
|
|
PORTABLE,
|
||
|
|
HANDSFREE,
|
||
|
|
CAR,
|
||
|
|
HIFI,
|
||
|
|
PHONE,
|
||
|
|
NETWORK,
|
||
|
|
ANALOG,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_encoding :: enum c.int {
|
||
|
|
INVALID = -1,
|
||
|
|
ANY,
|
||
|
|
PCM,
|
||
|
|
AC3_IEC61937,
|
||
|
|
EAC_3_IEC61937,
|
||
|
|
MPEG_IEC61937,
|
||
|
|
DTS_IEC61937,
|
||
|
|
MPEG2_AAC_IEC61937,
|
||
|
|
TRUEHD_IEC61937,
|
||
|
|
DTSHD_IEC61937,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_operation_state :: enum c.int {
|
||
|
|
RUNNING,
|
||
|
|
DONE,
|
||
|
|
CANCELLED,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_source_flags_bits :: enum c.int {
|
||
|
|
HW_VOLUME_CTRL,
|
||
|
|
LATENCY,
|
||
|
|
HARDWARE,
|
||
|
|
NETWORK,
|
||
|
|
HW_MUTE_CTRL,
|
||
|
|
DECIBEL_VOLUME,
|
||
|
|
DYNAMIC_LATENCY,
|
||
|
|
FLAT_VOLUME,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_source_state :: enum c.int {
|
||
|
|
INVALID = -1,
|
||
|
|
RUNNING,
|
||
|
|
IDLE,
|
||
|
|
SUSPENDED,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_stream_flags_bits :: enum c.int {
|
||
|
|
START_CORKED,
|
||
|
|
INTERPOLATE_TIMING,
|
||
|
|
NOT_MONOTONIC,
|
||
|
|
AUTO_TIMING_UPDATE,
|
||
|
|
NO_REMAP_CHANNELS,
|
||
|
|
NO_REMIX_CHANNELS,
|
||
|
|
FIX_FORMAT,
|
||
|
|
FIX_RATE,
|
||
|
|
FIX_CHANNELS,
|
||
|
|
DONT_MOVE,
|
||
|
|
VARIABLE_RATE,
|
||
|
|
PEAK_DETECT,
|
||
|
|
START_MUTED,
|
||
|
|
ADJUST_LATENCY,
|
||
|
|
EARLY_REQUESTS,
|
||
|
|
DONT_INHIBIT_AUTO_SUSPEND,
|
||
|
|
START_UNMUTED,
|
||
|
|
FAIL_ON_SUSPEND,
|
||
|
|
RELATIVE_VOLUME,
|
||
|
|
PASSTHROUGH,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_stream_flags :: bit_set[pa_stream_flags_bits; c.int]
|
||
|
|
|
||
|
|
pa_sink_flags :: bit_set[pa_sink_flags_bits; c.int]
|
||
|
|
pa_io_event_flags :: bit_set[pa_io_event_flags_bits; c.int]
|
||
|
|
pa_source_flags :: bit_set[pa_source_flags_bits; c.int]
|
||
|
|
|
||
|
|
pa_mainloop :: struct{}
|
||
|
|
pa_context :: struct{}
|
||
|
|
pa_io_event :: struct{}
|
||
|
|
pa_time_event :: struct{}
|
||
|
|
pa_defer_event :: struct{}
|
||
|
|
pa_operation :: struct{}
|
||
|
|
pa_proplist :: struct{}
|
||
|
|
pa_stream :: struct{}
|
||
|
|
|
||
|
|
pa_volume :: u32
|
||
|
|
|
||
|
|
pa_cvolume :: struct {
|
||
|
|
channels: u8,
|
||
|
|
values: [PA_CHANNELS_MAX]pa_volume,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_sink_port_info :: struct {
|
||
|
|
name: cstring,
|
||
|
|
description: cstring,
|
||
|
|
priority: u32,
|
||
|
|
available: pa_port_available,
|
||
|
|
availability_group: cstring,
|
||
|
|
type: pa_device_port_type,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_format_info :: struct {
|
||
|
|
encoding: pa_encoding,
|
||
|
|
plist: ^pa_proplist,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_sink_info :: struct {
|
||
|
|
name: cstring,
|
||
|
|
index: u32,
|
||
|
|
description: cstring,
|
||
|
|
sample_spec: pa_sample_spec,
|
||
|
|
channel_map: pa_channel_map,
|
||
|
|
owner_module: u32,
|
||
|
|
volume: pa_cvolume,
|
||
|
|
mute: c.int,
|
||
|
|
monitor_source: u32,
|
||
|
|
monitor_source_name: cstring,
|
||
|
|
latency: pa_usec,
|
||
|
|
driver: cstring,
|
||
|
|
flags: pa_sink_flags,
|
||
|
|
proplist: ^pa_proplist,
|
||
|
|
configured_latency: pa_usec,
|
||
|
|
base_volume: pa_volume,
|
||
|
|
state: pa_sink_state,
|
||
|
|
n_volume_steps: u32,
|
||
|
|
card: u32,
|
||
|
|
n_ports: u32,
|
||
|
|
ports: [^]^pa_sink_port_info,
|
||
|
|
active_port: ^pa_sink_port_info,
|
||
|
|
n_formats: u8,
|
||
|
|
formats: [^]^pa_format_info,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_source_port_info :: struct {
|
||
|
|
name: cstring,
|
||
|
|
description: cstring,
|
||
|
|
priority: u32,
|
||
|
|
available: pa_port_available,
|
||
|
|
availability_group: cstring,
|
||
|
|
type: pa_device_port_type,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_source_info :: struct {
|
||
|
|
name: cstring,
|
||
|
|
index: u32,
|
||
|
|
description: cstring,
|
||
|
|
sample_spec: pa_sample_spec,
|
||
|
|
channel_map: pa_channel_map,
|
||
|
|
owner_module: u32,
|
||
|
|
volume: pa_cvolume,
|
||
|
|
mute: c.int,
|
||
|
|
monitor_of_sink: u32,
|
||
|
|
monitor_of_sink_name: cstring,
|
||
|
|
latency: pa_usec,
|
||
|
|
driver: cstring,
|
||
|
|
flags: pa_source_flags,
|
||
|
|
proplist: ^pa_proplist,
|
||
|
|
configured_latency: pa_usec,
|
||
|
|
base_volume: pa_volume,
|
||
|
|
state: pa_source_state,
|
||
|
|
n_volume_steps: u32,
|
||
|
|
card: u32,
|
||
|
|
n_ports: u32,
|
||
|
|
ports: [^]^pa_source_port_info,
|
||
|
|
active_port: ^pa_source_port_info,
|
||
|
|
n_formats: u8,
|
||
|
|
formats: [^]^pa_format_info,
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_poll_func :: #type proc "c" (ufds: ^posix.pollfd, nfds: c.ulong, timeout: c.int, userdata: rawptr) -> c.int
|
||
|
|
pa_io_event_cb :: #type proc "c" (ea: ^pa_mainloop_api, e: ^pa_io_event, fd: c.int, events: pa_io_event_flags, userdata: rawptr)
|
||
|
|
pa_io_event_destroy_cb :: #type proc "c" (a: ^pa_mainloop_api, e: ^pa_io_event, userdata: rawptr)
|
||
|
|
pa_time_event_cb :: #type proc "c" (a: ^pa_mainloop_api, e: ^pa_time_event, tv: ^posix.timeval, userdata: rawptr)
|
||
|
|
pa_time_event_destroy_cb :: #type proc "c" (a: ^pa_mainloop_api, e: ^pa_time_event, userdata: rawptr)
|
||
|
|
pa_defer_event_cb :: #type proc "c" (a: ^pa_mainloop_api, e: ^pa_defer_event, userdata: rawptr)
|
||
|
|
pa_defer_event_destroy_cb :: #type proc "c" (a: ^pa_mainloop_api, e: ^pa_defer_event, userdata: rawptr)
|
||
|
|
pa_context_success_cb :: #type proc "c" (_c: ^pa_context, success: c.int, userdata: rawptr)
|
||
|
|
pa_context_notify_cb :: #type proc "c" (c: ^pa_context, userdata: rawptr)
|
||
|
|
pa_context_event_cb :: #type proc "c" (c: ^pa_context, name: cstring, p: ^pa_proplist, userdata: rawptr)
|
||
|
|
pa_sink_info_cb :: #type proc "c" (_c: ^pa_context, i: ^pa_sink_info, end_of_list: b32, userdata: rawptr)
|
||
|
|
pa_source_info_cb :: #type proc "c" (_c: ^pa_context, i: ^pa_source_info, end_of_list: b32, userdata: rawptr)
|
||
|
|
pa_operation_notify_cb :: #type proc "c" (o: ^pa_operation, userdata: rawptr)
|
||
|
|
pa_stream_request_cb :: #type proc "c" (p: ^pa_stream, nbytes: c.size_t, userdata: rawptr)
|
||
|
|
|
||
|
|
pa_spawn_api :: struct {
|
||
|
|
prefork: #type proc "c" (),
|
||
|
|
postfork: #type proc "c" (),
|
||
|
|
atfork: #type proc "c" (),
|
||
|
|
}
|
||
|
|
|
||
|
|
pa_mainloop_api :: struct {
|
||
|
|
userdata: rawptr,
|
||
|
|
io_new: #type proc "c" (a: ^pa_mainloop_api, fd: c.int, events: pa_io_event_flags, cb: pa_io_event_cb, userdata: rawptr) -> ^pa_io_event,
|
||
|
|
io_enable: #type proc "c" (e: ^pa_io_event, events: pa_io_event_flags),
|
||
|
|
io_free: #type proc "c" (e: ^pa_io_event),
|
||
|
|
io_set_destroy: #type proc "c" (e: ^pa_io_event, cb: pa_io_event_destroy_cb),
|
||
|
|
time_new: #type proc "c" (a: ^pa_mainloop_api, tv: ^posix.timeval, cb: pa_time_event_cb, userdata: rawptr) -> ^pa_time_event,
|
||
|
|
time_restart: #type proc "c" (e: ^pa_time_event, tv: ^posix.timeval),
|
||
|
|
time_free: #type proc "c" (e: ^pa_time_event),
|
||
|
|
time_set_destroy: #type proc "c" (e: ^pa_time_event, cb: pa_time_event_destroy_cb),
|
||
|
|
defer_new: #type proc "c" (a: ^pa_mainloop_api, cb: pa_defer_event_cb, userdata: rawptr) -> ^pa_defer_event,
|
||
|
|
defer_enable: #type proc "c" (e: ^pa_defer_event, b: c.int),
|
||
|
|
defer_free: #type proc "c" (e: ^pa_defer_event),
|
||
|
|
defer_set_destroy: #type proc "c" (e: ^pa_defer_event, cb: pa_defer_event_destroy_cb),
|
||
|
|
quit: #type proc "c" (a: ^pa_mainloop_api, retval: c.int),
|
||
|
|
}
|
||
|
|
|
||
|
|
@(link_prefix="pa_")
|
||
|
|
foreign pulse {
|
||
|
|
strerror :: proc(error: c.int) -> cstring ---
|
||
|
|
|
||
|
|
mainloop_new :: proc() -> ^pa_mainloop ---
|
||
|
|
mainloop_free :: proc(m: ^pa_mainloop) ---
|
||
|
|
mainloop_prepare :: proc(m: ^pa_mainloop, timeout: c.int) -> c.int ---
|
||
|
|
mainloop_poll :: proc(m: ^pa_mainloop) -> c.int ---
|
||
|
|
mainloop_dispatch :: proc(m: ^pa_mainloop) -> c.int ---
|
||
|
|
mainloop_get_retval :: proc(m: ^pa_mainloop) -> c.int ---
|
||
|
|
mainloop_iterate :: proc(m: ^pa_mainloop, block: b32, retval: ^c.int) -> c.int ---
|
||
|
|
mainloop_run :: proc(m: ^pa_mainloop, retval: ^c.int) -> c.int ---
|
||
|
|
mainloop_get_api :: proc(m: ^pa_mainloop) -> ^pa_mainloop_api ---
|
||
|
|
mainloop_quit :: proc(m: ^pa_mainloop, retval: c.int) ---
|
||
|
|
mainloop_wakeup :: proc(m: ^pa_mainloop) ---
|
||
|
|
mainloop_set_poll_func :: proc(m: ^pa_mainloop, poll_func: pa_poll_func, userdata: rawptr) ---
|
||
|
|
|
||
|
|
context_new :: proc(mainloop: ^pa_mainloop_api, name: cstring) -> ^pa_context ---
|
||
|
|
context_new_with_proplist :: proc(mainloop: ^pa_mainloop_api, name: cstring, proplist: ^pa_proplist) -> ^pa_context ---
|
||
|
|
context_unref :: proc(c: ^pa_context) ---
|
||
|
|
context_ref :: proc(c: ^pa_context) -> ^pa_context ---
|
||
|
|
context_set_state_callback :: proc(c: ^pa_context, cb: pa_context_notify_cb, userdata: rawptr) ---
|
||
|
|
context_set_event_callback :: proc(c: ^pa_context, cb: pa_context_event_cb, userdata: rawptr) ---
|
||
|
|
context_errno :: proc(_c: ^pa_context) -> c.int ---
|
||
|
|
context_is_pending :: proc(_c: ^pa_context) -> c.int ---
|
||
|
|
context_get_state :: proc(c: ^pa_context) -> pa_context_state ---
|
||
|
|
context_connect :: proc(_c: ^pa_context, server: cstring, flags: pa_context_flags, api: ^pa_spawn_api) -> c.int ---
|
||
|
|
context_disconnect :: proc(_c: ^pa_context) ---
|
||
|
|
context_drain :: proc(c: ^pa_context, cb: pa_context_notify_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_exit_daemon :: proc(c: ^pa_context, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_set_default_sink :: proc(c: ^pa_context, name: cstring, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_set_default_source :: proc(c: ^pa_context, name: cstring, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_is_local :: proc(_c: ^pa_context) -> b32 ---
|
||
|
|
context_set_name :: proc(c: ^pa_context, name: cstring, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_get_server :: proc(c: ^pa_context) -> cstring ---
|
||
|
|
context_get_protocol_version :: proc(c: ^pa_context) -> u32 ---
|
||
|
|
context_get_server_protocol_version :: proc(c: ^pa_context) -> u32 ---
|
||
|
|
context_proplist_update :: proc(c: ^pa_context, mode: pa_update_mode, p: ^pa_proplist, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_proplist_remove :: proc(c: ^pa_context, keys: [^]cstring, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_get_index :: proc(s: ^pa_context) -> u32 ---
|
||
|
|
context_rttime_new :: proc(c: ^pa_context, usec: pa_usec, cb: pa_time_event_cb, userdata: rawptr) -> ^pa_time_event ---
|
||
|
|
context_rttime_restart :: proc(c: ^pa_context, e: ^pa_time_event, usec: pa_usec) ---
|
||
|
|
context_get_tile_size :: proc(_c: ^pa_context, ss: ^pa_sample_spec) -> c.size_t ---
|
||
|
|
context_load_cookie_from_file :: proc(_c: ^pa_context, cookie_file_path: cstring) -> c.int ---
|
||
|
|
context_get_sink_info_list :: proc(c: ^pa_context, cb: pa_sink_info_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_get_source_info_list :: proc(c: ^pa_context, cb: pa_source_info_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
context_set_source_mute_by_name :: proc(c: ^pa_context, name: cstring, mute: b32, cb: pa_context_success_cb, userdata: rawptr) -> ^pa_operation ---
|
||
|
|
|
||
|
|
operation_ref :: proc(o: ^pa_operation) -> ^pa_operation ---
|
||
|
|
operation_unref :: proc(o: ^pa_operation) ---
|
||
|
|
operation_cancel :: proc(o: ^pa_operation) ---
|
||
|
|
operation_get_state :: proc(o: ^pa_operation) -> pa_operation_state ---
|
||
|
|
operation_set_state_callback :: proc(o: ^pa_operation, cb: pa_operation_notify_cb, userdata: rawptr) ---
|
||
|
|
|
||
|
|
stream_new :: proc(c: ^pa_context, name: cstring, ss: ^pa_sample_spec, _map: ^pa_channel_map) -> ^pa_stream ---
|
||
|
|
stream_connect_record :: proc(s: ^pa_stream, dev: cstring, attr: ^pa_buffer_attr, flags: pa_stream_flags) -> c.int ---
|
||
|
|
stream_disconnect :: proc(s: ^pa_stream) -> c.int ---
|
||
|
|
stream_peek :: proc(p: ^pa_stream, data: ^rawptr, nbytes: ^c.size_t) -> c.int ---
|
||
|
|
stream_readable_size :: proc(p: ^pa_stream) -> c.size_t ---
|
||
|
|
stream_set_read_callback :: proc(p: ^pa_stream, cb: pa_stream_request_cb, userdata: rawptr) ---
|
||
|
|
stream_drop :: proc(p: ^pa_stream) -> c.int ---
|
||
|
|
stream_unref :: proc(p: ^pa_stream) ---
|
||
|
|
}
|