summaryrefslogtreecommitdiffstats
path: root/pulsecaster/pulseaudio/lib_pulseaudio.py
diff options
context:
space:
mode:
Diffstat (limited to 'pulsecaster/pulseaudio/lib_pulseaudio.py')
-rw-r--r--pulsecaster/pulseaudio/lib_pulseaudio.py733
1 files changed, 733 insertions, 0 deletions
diff --git a/pulsecaster/pulseaudio/lib_pulseaudio.py b/pulsecaster/pulseaudio/lib_pulseaudio.py
new file mode 100644
index 0000000..95a26d7
--- /dev/null
+++ b/pulsecaster/pulseaudio/lib_pulseaudio.py
@@ -0,0 +1,733 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# lib_pulseaudio.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#
+# Provides pulseaudio interface for python
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+from ctypes import *
+
+pulse = CDLL("libpulse.so.0");
+
+################################################################################
+#
+# Constrants
+#
+################################################################################
+
+PA_CHANNELS_MAX = 32
+PA_VOLUME_NORM = 0x10000
+
+# sample types
+(
+ PA_SAMPLE_U8,
+ PA_SAMPLE_ALAW,
+ PA_SAMPLE_ULAW,
+ PA_SAMPLE_S16LE,
+ PA_SAMPLE_S16BE,
+ PA_SAMPLE_FLOAT32LE,
+ PA_SAMPLE_FLOAT32BE,
+ PA_SAMPLE_S32LE,
+ PA_SAMPLE_S32BE,
+ PA_SAMPLE_S24LE,
+ PA_SAMPLE_S24BE,
+ PA_SAMPLE_S24_32LE,
+ PA_SAMPLE_S24_32BE,
+ PA_SAMPLE_MAX,
+ PA_SAMPLE_INVALID
+) = map(c_int, xrange(15))
+
+# channel positions
+(
+ PA_CHANNEL_POSITION_INVALID,
+ PA_CHANNEL_POSITION_MONO,
+ PA_CHANNEL_POSITION_LEFT,
+ PA_CHANNEL_POSITION_RIGHT,
+ PA_CHANNEL_POSITION_CENTER,
+ PA_CHANNEL_POSITION_FRONT_LEFT,
+ PA_CHANNEL_POSITION_FRONT_RIGHT,
+ PA_CHANNEL_POSITION_FRONT_CENTER,
+ PA_CHANNEL_POSITION_REAR_CENTER,
+ PA_CHANNEL_POSITION_REAR_LEFT,
+ PA_CHANNEL_POSITION_REAR_RIGHT,
+ PA_CHANNEL_POSITION_LFE,
+ PA_CHANNEL_POSITION_SUBWOOFER,
+ PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ PA_CHANNEL_POSITION_SIDE_LEFT,
+ PA_CHANNEL_POSITION_SIDE_RIGHT,
+ PA_CHANNEL_POSITION_AUX0,
+ PA_CHANNEL_POSITION_AUX1,
+ PA_CHANNEL_POSITION_AUX2,
+ PA_CHANNEL_POSITION_AUX3,
+ PA_CHANNEL_POSITION_AUX4,
+ PA_CHANNEL_POSITION_AUX5,
+ PA_CHANNEL_POSITION_AUX6,
+ PA_CHANNEL_POSITION_AUX7,
+ PA_CHANNEL_POSITION_AUX8,
+ PA_CHANNEL_POSITION_AUX9,
+ PA_CHANNEL_POSITION_AUX10,
+ PA_CHANNEL_POSITION_AUX11,
+ PA_CHANNEL_POSITION_AUX12,
+ PA_CHANNEL_POSITION_AUX13,
+ PA_CHANNEL_POSITION_AUX14,
+ PA_CHANNEL_POSITION_AUX15,
+ PA_CHANNEL_POSITION_AUX16,
+ PA_CHANNEL_POSITION_AUX17,
+ PA_CHANNEL_POSITION_AUX18,
+ PA_CHANNEL_POSITION_AUX19,
+ PA_CHANNEL_POSITION_AUX20,
+ PA_CHANNEL_POSITION_AUX21,
+ PA_CHANNEL_POSITION_AUX22,
+ PA_CHANNEL_POSITION_AUX23,
+ PA_CHANNEL_POSITION_AUX24,
+ PA_CHANNEL_POSITION_AUX25,
+ PA_CHANNEL_POSITION_AUX26,
+ PA_CHANNEL_POSITION_AUX27,
+ PA_CHANNEL_POSITION_AUX28,
+ PA_CHANNEL_POSITION_AUX29,
+ PA_CHANNEL_POSITION_AUX30,
+ PA_CHANNEL_POSITION_AUX31,
+ PA_CHANNEL_POSITION_TOP_CENTER,
+ PA_CHANNEL_POSITION_TOP_FRONT_LEFT,
+ PA_CHANNEL_POSITION_TOP_FRONT_RIGHT,
+ PA_CHANNEL_POSITION_TOP_FRONT_CENTER,
+ PA_CHANNEL_POSITION_TOP_REAR_LEFT,
+ PA_CHANNEL_POSITION_TOP_REAR_RIGHT,
+ PA_CHANNEL_POSITION_TOP_REAR_CENTER,
+ PA_CHANNEL_POSITION_MAX
+) = map(c_int, xrange(57))
+
+# stream states
+(
+ PA_STREAM_UNCONNECTED,
+ PA_STREAM_CREATING,
+ PA_STREAM_READY,
+ PA_STREAM_FAILED,
+ PA_STREAM_TERMINATED
+) = map(c_int, xrange(5))
+
+# stream directions
+(
+ PA_STREAM_NODIRECTION,
+ PA_STREAM_PLAYBACK,
+ PA_STREAM_RECORD,
+ PA_STREAM_UPLOAD
+) = map(c_int, xrange(4))
+
+# stream flags
+(
+ PA_STREAM_START_CORKED,
+ PA_STREAM_INTERPOLATE_TIMING,
+ PA_STREAM_NOT_MONOTONIC,
+ PA_STREAM_AUTO_TIMING_UPDATE,
+ PA_STREAM_NO_REMAP_CHANNELS,
+ PA_STREAM_NO_REMIX_CHANNELS,
+ PA_STREAM_FIX_FORMAT,
+ PA_STREAM_FIX_RATE,
+ PA_STREAM_FIX_CHANNELS,
+ PA_STREAM_DONT_MOVE,
+ PA_STREAM_VARIABLE_RATE,
+ PA_STREAM_PEAK_DETECT,
+ PA_STREAM_START_MUTED,
+ PA_STREAM_ADJUST_LATENCY,
+ PA_STREAM_EARLY_REQUESTS,
+ PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND,
+ PA_STREAM_START_UNMUTED,
+ PA_STREAM_FAIL_ON_SUSPEND
+) = map(c_int, xrange(18))
+
+# subscription event masks
+PA_SUBSCRIPTION_MASK_NULL = 0x0000
+PA_SUBSCRIPTION_MASK_SINK = 0x0001
+PA_SUBSCRIPTION_MASK_SOURCE = 0x0002
+PA_SUBSCRIPTION_MASK_SINK_INPUT = 0x0004
+PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT = 0x0008
+PA_SUBSCRIPTION_MASK_MODULE = 0x0010
+PA_SUBSCRIPTION_MASK_CLIENT = 0x0020
+PA_SUBSCRIPTION_MASK_SAMPLE_CACHE = 0x0040
+PA_SUBSCRIPTION_MASK_SERVER = 0x0080
+PA_SUBSCRIPTION_MASK_CARD = 0x0200
+PA_SUBSCRIPTION_MASK_ALL = 0x02ff
+
+# subscription event types
+PA_SUBSCRIPTION_EVENT_SINK = 0x0000
+PA_SUBSCRIPTION_EVENT_SOURCE = 0x0001
+PA_SUBSCRIPTION_EVENT_SINK_INPUT = 0x0002
+PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT = 0x0003
+PA_SUBSCRIPTION_EVENT_MODULE = 0x0004
+PA_SUBSCRIPTION_EVENT_CLIENT = 0x0005
+PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE = 0x0006
+PA_SUBSCRIPTION_EVENT_SERVER = 0x0007
+PA_SUBSCRIPTION_EVENT_CARD = 0x0009
+PA_SUBSCRIPTION_EVENT_FACILITY_MASK = 0x000F
+PA_SUBSCRIPTION_EVENT_NEW = 0x0000
+PA_SUBSCRIPTION_EVENT_CHANGE = 0x0010
+PA_SUBSCRIPTION_EVENT_REMOVE = 0x0020
+PA_SUBSCRIPTION_EVENT_TYPE_MASK = 0x0030
+
+################################################################################
+#
+# Structs
+#
+################################################################################
+
+class PA_IO_EVENT(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_MAINLOOP(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_MAINLOOP_API(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_SIGNAL_EVENT(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_CONTEXT(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_OPERATION(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_STREAM(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_SAMPLE_SPEC(Structure):
+ _fields_ = [
+ ("format", c_int), # FIXME check this
+ ("rate", c_uint32),
+ ("channels", c_uint8)
+ ]
+
+class PA_CHANNEL_MAP(Structure):
+ _fields_ = [
+ ("channels", c_uint8),
+ ("map", c_int * PA_CHANNELS_MAX)
+ ]
+
+class PA_CVOLUME(Structure):
+ _fields_ = [
+ ("channels", c_uint8),
+ ("values", c_uint32 * PA_CHANNELS_MAX)
+ ]
+
+class PA_BUFFER_ATTR(Structure):
+ _fields_ = [
+ ("maxlength", c_uint32),
+ ("tlength", c_uint32),
+ ("prebuf", c_uint32),
+ ("minreq", c_uint32),
+ ("fragsize", c_uint32)
+ ]
+
+PA_USEC_T = c_uint64
+
+class PA_SERVER_INFO(Structure):
+ _fields_ = [
+ ('user_name', c_char_p),
+ ('host_name', c_char_p),
+ ('server_version', c_char_p),
+ ('server_name', c_char_p),
+ ('sample_spec', PA_SAMPLE_SPEC),
+ ('default_sink_name', c_char_p),
+ ('default_source_name', c_char_p),
+ ('cookie', c_uint32),
+ ('channel_map', PA_CHANNEL_MAP)
+ ]
+
+class PA_SINK_INPUT_INFO(Structure):
+ __slots__ = [
+ 'index',
+ 'name',
+ 'owner_module',
+ 'client',
+ 'sink',
+ 'sample_spec',
+ 'channel_map',
+ 'volume',
+ 'buffer_usec',
+ 'sink_usec',
+ 'resample_method',
+ 'driver',
+ 'mute',
+ ]
+ _fields_ = [
+ ("index", c_uint32),
+ ("name", c_char_p),
+ ("owner_module", c_uint32),
+ ("client", c_uint32),
+ ("sink", c_uint32),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("volume", PA_CVOLUME),
+ ("buffer_usec", PA_USEC_T),
+ ("sink_usec", PA_USEC_T),
+ ("resample_method", c_char_p),
+ ("driver", c_char_p),
+ ("mute", c_int)
+ #("proplist", POINTER(c_int))
+ ]
+
+class PA_SINK_INFO(Structure):
+ _fields_ = [
+ ("name", c_char_p),
+ ("index", c_uint32),
+ ("description", c_char_p),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("owner_module", c_uint32),
+ ("volume", PA_CVOLUME),
+ ("mute", c_int),
+ ("monitor_source", c_uint32),
+ ("monitor_source_name", c_char_p),
+ ("latency", PA_USEC_T),
+ ("driver", c_char_p),
+ ("flags", c_int),
+ ("proplist", POINTER(c_int)),
+ ("configured_latency", PA_USEC_T)
+ ]
+
+class PA_SOURCE_OUTPUT_INFO(Structure):
+ __slots__ = [
+ 'index',
+ 'name',
+ 'owner_module',
+ 'client',
+ 'source',
+ 'sample_spec',
+ 'channel_map',
+ 'volume',
+ 'buffer_usec',
+ 'sink_usec',
+ 'resample_method',
+ 'driver',
+ 'mute',
+ ]
+ _fields_ = [
+ ("index", c_uint32),
+ ("name", c_char_p),
+ ("owner_module", c_uint32),
+ ("client", c_uint32),
+ ("source", c_uint32),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("volume", PA_CVOLUME),
+ ("buffer_usec", PA_USEC_T),
+ ("sink_usec", PA_USEC_T),
+ ("resample_method", c_char_p),
+ ("driver", c_char_p),
+ ("mute", c_int)
+ #("proplist", POINTER(c_int))
+ ]
+
+class PA_SOURCE_INFO(Structure):
+ _fields_ = [
+ ("name", c_char_p),
+ ("index", c_uint32),
+ ("description", c_char_p),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("owner_module", c_uint32),
+ ("volume", PA_CVOLUME),
+ ("mute", c_int),
+ ("monitor_of_sink", c_uint32),
+ ("monitor_of_sink_name", c_char_p),
+ ("latency", PA_USEC_T),
+ ("driver", c_char_p),
+ ("flags", c_int),
+ ("proplist", POINTER(c_int)),
+ ("configured_latency", PA_USEC_T)
+ ]
+
+class PA_CLIENT_INFO(Structure):
+ _fields_ = [
+ ("index", c_uint32),
+ ("name", c_char_p),
+ ("owner_module", c_uint32),
+ ("driver", c_char_p)
+ #("proplist", POINTER(c_int))
+ ]
+
+################################################################################
+#
+# Callback types
+#
+################################################################################
+
+#PA_IO_EVENT_CB_T = CFUNCTYPE(c_void_p,
+# POINTER(PA_MAINLOOP_API),
+# POINTER(PA_IO_EVENT),
+# c_int,
+# c_int,
+# c_void_p)
+
+# SIGNAL
+PA_SIGNAL_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_MAINLOOP_API),
+ POINTER(PA_SIGNAL_EVENT),
+ c_int,
+ c_void_p)
+
+# STATE
+PA_STATE_CB_T = CFUNCTYPE(c_int,
+ POINTER(PA_CONTEXT),
+ c_void_p)
+
+# CLIENT
+PA_CLIENT_INFO_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ POINTER(PA_CLIENT_INFO),
+ c_int,
+ c_void_p)
+# SINK INPUT
+PA_SINK_INPUT_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SINK_INPUT_INFO),
+ c_int,
+ c_void_p)
+
+# SINK
+PA_SINK_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SINK_INFO),
+ c_int,
+ c_void_p)
+# SOURCE OUTPUT
+PA_SOURCE_OUTPUT_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SOURCE_OUTPUT_INFO),
+ c_int,
+ c_void_p)
+
+# SOURCE
+PA_SOURCE_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SOURCE_INFO),
+ c_int,
+ c_void_p)
+# CONTEXT
+PA_CONTEXT_DRAIN_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ c_void_p)
+
+PA_CONTEXT_SUCCESS_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ c_int,
+ c_void_p)
+
+PA_CONTEXT_SUBSCRIBE_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ c_int,
+ c_uint32,
+ c_void_p)
+
+################################################################################
+#
+# Functions
+#
+################################################################################
+
+#
+# pa_strerror
+pa_strerror = pulse.pa_strerror
+pa_strerror.restype = c_char_p
+pa_strerror.argtypes = [
+ c_int
+]
+
+#
+# pa_mainloop_*
+pa_mainloop_new = pulse.pa_mainloop_new
+pa_mainloop_new.restype = POINTER(PA_MAINLOOP)
+pa_mainloop_new.argtypes = [
+]
+
+pa_mainloop_get_api = pulse.pa_mainloop_get_api
+pa_mainloop_get_api.restype = POINTER(PA_MAINLOOP_API)
+pa_mainloop_get_api.argtypes = [
+ POINTER(PA_MAINLOOP)
+]
+
+pa_mainloop_run = pulse.pa_mainloop_run
+pa_mainloop_run.restype = c_int
+pa_mainloop_run.argtypes = [
+ POINTER(PA_MAINLOOP),
+ POINTER(c_int)
+]
+
+pa_mainloop_iterate = pulse.pa_mainloop_iterate
+pa_mainloop_iterate.restype = c_int
+pa_mainloop_iterate.argtypes = [
+ POINTER(PA_MAINLOOP),
+ c_int,
+ POINTER(c_int)
+]
+
+pa_mainloop_quit = pulse.pa_mainloop_quit
+pa_mainloop_quit.restype = c_int
+pa_mainloop_quit.argtypes = [
+ POINTER(PA_MAINLOOP),
+ c_int
+]
+
+pa_mainloop_dispatch = pulse.pa_mainloop_dispatch
+pa_mainloop_dispatch.restype = c_int
+pa_mainloop_dispatch.argtypes = [
+ POINTER(PA_MAINLOOP)
+]
+
+pa_mainloop_free = pulse.pa_mainloop_run
+pa_mainloop_free.restype = c_int
+pa_mainloop_free.argtypes = [
+ POINTER(PA_MAINLOOP)
+]
+
+#
+# pa_signal_*
+pa_signal_init = pulse.pa_signal_init
+pa_signal_init.restype = c_int
+pa_signal_init.argtypes = [
+ POINTER(PA_MAINLOOP_API)
+]
+
+pa_signal_new = pulse.pa_signal_new
+pa_signal_new.restype = POINTER(PA_SIGNAL_EVENT)
+pa_signal_new.argtypes = [
+ c_int,
+ PA_SIGNAL_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*
+pa_context_errno = pulse.pa_context_errno
+pa_context_errno.restype = c_int
+pa_context_errno.argtypes = [
+ POINTER(PA_CONTEXT)
+]
+
+pa_context_new = pulse.pa_context_new
+pa_context_new.restype = POINTER(PA_CONTEXT)
+pa_context_new.argtypes = [
+ POINTER(PA_MAINLOOP_API),
+ c_char_p
+]
+
+
+pa_context_set_state_callback = pulse.pa_context_set_state_callback
+pa_context_set_state_callback.restype = None
+pa_context_set_state_callback.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_STATE_CB_T,
+ c_void_p
+]
+
+pa_context_connect = pulse.pa_context_connect
+pa_context_connect.restype = c_int
+pa_context_connect.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_char_p,
+ c_int, #FIXME | isn't correct
+ POINTER(c_int)
+]
+
+pa_context_get_state = pulse.pa_context_get_state
+pa_context_get_state.restype = c_int;
+pa_context_get_state.argtypes = [
+ POINTER(PA_CONTEXT)
+]
+
+pa_context_drain = pulse.pa_context_drain
+pa_context_drain.restype = POINTER(PA_OPERATION)
+pa_context_drain.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_CONTEXT_DRAIN_CB_T,
+ c_void_p
+]
+
+pa_context_disconnect = pulse.pa_context_disconnect
+pa_context_disconnect.restype = c_int;
+pa_context_disconnect.argtypes = [
+ POINTER(PA_CONTEXT)
+]
+
+#
+# pa_context_*_sink_*
+pa_context_get_sink_input_info_list = pulse.pa_context_get_sink_input_info_list
+pa_context_get_sink_input_info_list.restype = POINTER(c_int)
+pa_context_get_sink_input_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SINK_INPUT_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_get_sink_info_list = pulse.pa_context_get_sink_info_list
+pa_context_get_sink_info_list.restype = POINTER(c_int)
+pa_context_get_sink_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SINK_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_mute_by_index = pulse.pa_context_set_sink_mute_by_index
+pa_context_set_sink_mute_by_index.restype = POINTER(c_int)
+pa_context_set_sink_mute_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_input_mute = pulse.pa_context_set_sink_input_mute
+pa_context_set_sink_input_mute.restype = POINTER(c_int)
+pa_context_set_sink_input_mute.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_volume_by_index = pulse.pa_context_set_sink_volume_by_index
+pa_context_set_sink_volume_by_index.restype = POINTER(c_int)
+pa_context_set_sink_volume_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ POINTER(PA_CVOLUME),
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_input_volume = pulse.pa_context_set_sink_input_volume
+pa_context_set_sink_input_volume.restype = POINTER(c_int)
+pa_context_set_sink_input_volume.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ POINTER(PA_CVOLUME),
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*_source_*
+pa_context_get_source_output_info_list = pulse.pa_context_get_source_output_info_list
+pa_context_get_source_output_info_list.restype = POINTER(c_int)
+pa_context_get_source_output_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SOURCE_OUTPUT_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_get_source_info_list = pulse.pa_context_get_source_info_list
+pa_context_get_source_info_list.restype = POINTER(c_int)
+pa_context_get_source_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SOURCE_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_set_source_mute_by_index = pulse.pa_context_set_source_mute_by_index
+pa_context_set_source_mute_by_index.restype = POINTER(c_int)
+pa_context_set_source_mute_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_source_volume_by_index = pulse.pa_context_set_source_volume_by_index
+pa_context_set_source_volume_by_index.restype = POINTER(c_int)
+pa_context_set_source_volume_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ POINTER(PA_CVOLUME),
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*_client_*
+
+pa_context_get_client_info_list = pulse.pa_context_get_client_info_list
+pa_context_get_client_info_list.restype = POINTER(c_int)
+pa_context_get_client_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_CLIENT_INFO_CB_T,
+ c_void_p
+]
+pa_context_get_client_info = pulse.pa_context_get_client_info
+pa_context_get_client_info.restype = POINTER(c_int)
+pa_context_get_client_info.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ PA_CLIENT_INFO_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*_subscribe*
+pa_context_set_subscribe_callback = pulse.pa_context_set_subscribe_callback
+pa_context_set_subscribe_callback.restype = c_int
+pa_context_set_subscribe_callback.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_CONTEXT_SUBSCRIBE_CB_T,
+ c_void_p
+]
+
+pa_context_subscribe = pulse.pa_context_subscribe
+pa_context_subscribe.restype = POINTER(PA_OPERATION)
+pa_context_subscribe.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+#
+# pa_operation_*
+pa_operation_unref = pulse.pa_operation_unref
+pa_operation_unref.restype = c_int
+pa_operation_unref.argtypes = [
+ POINTER(PA_OPERATION)
+]
+
+#
+# pa_stream_*
+pa_stream_connect_record = pulse.pa_stream_connect_record
+pa_stream_connect_record.restype = c_int
+pa_stream_connect_record.argtypes = [
+ POINTER(PA_STREAM),
+ c_char_p,
+ POINTER(PA_BUFFER_ATTR),
+ c_int # original pa_stream_flags_t
+]
+
+pa_stream_peek = pulse.pa_stream_peek
+pa_stream_peek.restype = c_int
+pa_stream_peek.argtypes = [
+ POINTER(PA_STREAM),
+ POINTER(c_void_p), # original is void **data, no idea if this works
+ POINTER(c_size_t)
+]
+