From fbd7bca5fcb8758ce5cd774f5dc6805763ec824b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 20 Feb 2010 01:22:14 +0100 Subject: initial checkin --- Makefile | 7 + gnome-speaker-setup.vala | 840 +++++++++++++++++++++++++ libpulse.vapi | 1519 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2366 insertions(+) create mode 100644 Makefile create mode 100644 gnome-speaker-setup.vala create mode 100644 libpulse.vapi diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d170d6e --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ + + +gnome-speaker-setup: gnome-speaker-setup.vala + valac -g --save-temps --pkg canberra --pkg gtk+-2.0 --pkg libpulse --vapidir=. --pkg posix gnome-speaker-setup.vala --Xcc=-lpulse --Xcc=-lpulse-mainloop-glib --Xcc=-lcanberra --pkg=gee-1.0 + +clean: + rm -f gnome-speaker-setup gnome-speaker-setup.c diff --git a/gnome-speaker-setup.vala b/gnome-speaker-setup.vala new file mode 100644 index 0000000..343acfc --- /dev/null +++ b/gnome-speaker-setup.vala @@ -0,0 +1,840 @@ +using Gtk; +using PulseAudio; +using Gee; +using Canberra; + +public class BoldLabel : Label { + public BoldLabel(string? text = null) { + if (text != null) + set_markup("%s".printf(text)); + set_alignment(0, 0.5f); + } +} + +public class FieldLabel : Label { + public FieldLabel(string? text = null) { + if (text != null) + set_markup_with_mnemonic(text); + set_alignment(0, 0.5f); + } +} + +public class ChannelControl : VBox { + + private Label label; + private Image image; + private Button test_button; + private ChannelPosition position; + private Canberra.Context *canberra; + private bool playing; + + public ChannelControl(Canberra.Context? canberra, ChannelPosition p) { + position = p; + set_spacing(6); + + image = new Image.from_icon_name("audio-volume-medium", IconSize.DIALOG); + pack_start(image, false, false, 0); + + label = new Label(p.to_pretty_string()); + pack_start(label, false, false, 0); + + test_button = new Button.with_label("Test"); + test_button.clicked += on_test_button_clicked; + + Box box = new HBox(false, 0); + box.pack_start(test_button, true, false, 0); + pack_start(box, false, false, 0); + + this.canberra = canberra; + } + + public void on_test_button_clicked() { + Canberra.Proplist p; + + canberra->cancel(1); + + if (playing) + playing = false; + else { + Canberra.Proplist.create(out p); + p.sets("canberra.force_channel", position.to_string()); + + unowned string? name = sound_name(); + if (name != null) { + p.sets(PROP_EVENT_ID, name); + playing = canberra->play_full(1, p, finish_cb) >= 0; + } + + if (!playing) { + p.sets(PROP_EVENT_ID, "audio-test-signal"); + playing = canberra->play_full(1, p, finish_cb) >= 0; + } + + if (!playing) { + p.sets(PROP_EVENT_ID, "bell-window-system"); + playing = canberra->play_full(1, p, finish_cb) >= 0; + } + } + + update_button(); + } + + public void update_button() { + test_button.set_label(playing ? "Stop" : "Test"); + } + + public void finish_cb(Canberra.Context c, uint32 id, int code) { + + /* This is called in the background thread, hence + * forward to main thread via idle callback */ + Idle.add(idle_cb); + } + + public bool idle_cb() { + playing = false; + update_button(); + return false; + } + + public unowned string? sound_name() { + switch (position) { + case ChannelPosition.FRONT_LEFT: + return "audio-channel-front-left"; + + case ChannelPosition.FRONT_RIGHT: + return "audio-channel-front-right"; + + case ChannelPosition.FRONT_CENTER: + return "audio-channel-front-center"; + + case ChannelPosition.REAR_LEFT: + return "audio-channel-rear-left"; + + case ChannelPosition.REAR_RIGHT: + return "audio-channel-rear-right"; + + case ChannelPosition.REAR_CENTER: + return "audio-channel-rear-center"; + + case ChannelPosition.LFE: + return "audio-channel-lfe"; + + case ChannelPosition.SIDE_LEFT: + return "audio-channel-side-left"; + + case ChannelPosition.SIDE_RIGHT: + return "audio-channel-side-right"; + + default: + return null; + } + } +} + +public class SpeakerSetupWindow : Window { + + private Label card_title_label; + private Label card_label; + private Label profile_label; + + private Alignment device_title_alignment; + private Label device_title_label; + private Label device_label; + private Label port_label; + + private ComboBox card_combo_box; + private ComboBox profile_combo_box; + private ComboBox device_combo_box; + private ComboBox port_combo_box; + + private ChannelControl[] channel_controls = new ChannelControl[ChannelPosition.MAX]; + + private Table channel_table; + private Notebook channel_notebook; + + private Button close_button; + + private PulseAudio.Context context; + private PulseAudio.GLibMainLoop main_loop; + + private Canberra.Context canberra; + + private bool suppress_feedback; + private bool finished_startup; + + [Compact] + class CardData { + public uint32 index; + public string description; + + public int active_profile; + + public ListStore profiles; + public ListStore devices; + } + + [Compact] + class DeviceData { + public uint32 index; + public string name; + public string description; + public ChannelMap channel_map; + public int active_port; + + public ListStore ports; + public CardData* card; + } + + private ListStore unowned_devices; + private ListStore cards; + + private ListStore *current_profiles; + private ListStore *current_devices; + private ListStore *current_ports; + + private HashMap device_lookup; + private HashMap card_lookup; + + public SpeakerSetupWindow() { + + title = "Speaker Setup"; + icon_name = "audio-card"; + position = WindowPosition.CENTER; + border_width = 12; + + Canberra.Context.create(out canberra); + canberra.set_driver("pulse"); + + device_lookup = new HashMap(); + card_lookup = new HashMap(); + + unowned_devices = new ListStore(2, typeof(string), typeof(uint32)); + cards = new ListStore(2, typeof(string), typeof(uint32)); + + Box vbox = new VBox(false, 0); + add(vbox); + + Table upper_table = new Table(7, 2, false); + vbox.pack_start(upper_table, false, true, 0); + + upper_table.set_col_spacings(6); + upper_table.set_row_spacings(0); + + card_title_label = new BoldLabel("Hardware"); + Alignment a = new Alignment(0, 0, 1, 1); + a.set_padding(0, 3, 0, 0); + a.add(card_title_label); + upper_table.attach(a, 0, 2, 0, 1, AttachOptions.FILL, AttachOptions.FILL, 0, 0); + card_label = new FieldLabel("Sound _Card:"); + upper_table.attach(card_label, 0, 1, 1, 2, AttachOptions.FILL, AttachOptions.FILL, 0, 3); + card_combo_box = new ComboBox.with_model(cards); + upper_table.attach(card_combo_box, 1, 2, 1, 2, AttachOptions.EXPAND|AttachOptions.FILL, AttachOptions.FILL, 0, 3); + profile_label = new FieldLabel("_Profile:"); + upper_table.attach(profile_label, 0, 1, 2, 3, AttachOptions.FILL, AttachOptions.FILL, 0, 3); + profile_combo_box = new ComboBox(); + upper_table.attach(profile_combo_box, 1, 2, 2, 3, AttachOptions.EXPAND|AttachOptions.FILL, AttachOptions.FILL, 0, 3); + + device_title_label = new BoldLabel("Output"); + device_title_alignment = new Alignment(0, 0, 1, 1); + device_title_alignment.set_padding(15, 3, 0, 0); + device_title_alignment.add(device_title_label); + upper_table.attach(device_title_alignment, 0, 2, 3, 4, AttachOptions.FILL, AttachOptions.FILL, 0, 0); + device_label = new FieldLabel("Sound _Output:"); + upper_table.attach(device_label, 0, 1, 4, 5, AttachOptions.FILL, AttachOptions.FILL, 0, 3); + device_combo_box = new ComboBox(); + upper_table.attach(device_combo_box, 1, 2, 4, 5, AttachOptions.EXPAND|AttachOptions.FILL, AttachOptions.FILL, 0, 3); + port_label = new FieldLabel("_Connector:"); + upper_table.attach(port_label, 0, 1, 5, 6, AttachOptions.FILL, AttachOptions.FILL, 0, 3); + port_combo_box = new ComboBox(); + upper_table.attach(port_combo_box, 1, 2, 5, 6, AttachOptions.EXPAND|AttachOptions.FILL, AttachOptions.FILL, 0, 3); + + Label label = new BoldLabel("Speaker Placement and Testing"); + a = new Alignment(0, 0, 1, 1); + a.set_padding(15, 6, 0, 0); + a.add(label); + upper_table.attach(a, 0, 2, 6, 7, AttachOptions.FILL, AttachOptions.FILL, 0, 0); + + Frame frame = new Frame(null); + frame.shadow_type = ShadowType.OUT; + vbox.pack_start(frame, true, true, 0); + + channel_notebook = new Notebook(); + channel_notebook.set_show_border(false); + channel_notebook.set_show_tabs(false); + frame.add(channel_notebook); + + Label empty_label = new Label(null); + empty_label.set_markup("Please select a sound card and output to configure."); + channel_notebook.append_page(empty_label, null); + + channel_table = new Table(3, 5, true); + channel_notebook.append_page(channel_table, null); + + channel_table.set_col_spacings(6); + channel_table.set_row_spacings(36); + channel_table.set_border_width(36); + + create_channel_controls(); + + channel_table.attach(new Image.from_icon_name("face-smile", IconSize.DIALOG), 2, 3, 1, 2, + AttachOptions.EXPAND, AttachOptions.EXPAND, 0, 0); + + ButtonBox button_box = new HButtonBox(); + button_box.set_layout(ButtonBoxStyle.END); + close_button = new Button.from_stock(STOCK_CLOSE); + button_box.pack_start(close_button, false, false, 0); + + a = new Alignment(0, 0, 1, 1); + a.set_padding(12, 0, 0, 0); + a.add(button_box); + vbox.pack_start(a, false, false, 0); + close_button.clicked += on_close_button_clicked; + + destroy += Gtk.main_quit; + + main_loop = new PulseAudio.GLibMainLoop(); + context = new PulseAudio.Context(main_loop.get_api(), "Speaker Test"); + + context.connect(); + + context.set_state_callback(context_state_cb); + context.set_subscribe_callback(context_subscribe_cb); + + CellRenderer r = new CellRendererText(); + card_combo_box.pack_start(r, true); + card_combo_box.set_attributes(r, "text", 0, null); + + r = new CellRendererText(); + profile_combo_box.pack_start(r, true); + profile_combo_box.set_attributes(r, "text", 0, null); + + r = new CellRendererText(); + device_combo_box.pack_start(r, true); + device_combo_box.set_attributes(r, "text", 0, null); + + r = new CellRendererText(); + port_combo_box.pack_start(r, true); + port_combo_box.set_attributes(r, "text", 0, null); + + card_combo_box.changed += on_card_combo_box_changed; + profile_combo_box.changed += on_profile_combo_box_changed; + device_combo_box.changed += on_device_combo_box_changed; + port_combo_box.changed += on_port_combo_box_changed; + + device_combo_box.set_model(unowned_devices); + current_devices = unowned_devices; + + TreeIter i; + cards.append(out i); + cards.set(i, 0, "Non-Hardware", 1, INVALID_INDEX); + } + + private const int position_table[] = { + /* Position, X, Y */ + ChannelPosition.FRONT_LEFT, 0, 0, + ChannelPosition.FRONT_LEFT_OF_CENTER, 1, 0, + ChannelPosition.FRONT_CENTER, 2, 0, + ChannelPosition.MONO, 2, 0, + ChannelPosition.FRONT_RIGHT_OF_CENTER, 3, 0, + ChannelPosition.FRONT_RIGHT, 4, 0, + ChannelPosition.SIDE_LEFT, 0, 1, + ChannelPosition.SIDE_RIGHT, 4, 1, + ChannelPosition.REAR_LEFT, 0, 2, + ChannelPosition.REAR_CENTER, 2, 2, + ChannelPosition.REAR_RIGHT, 4, 2, + ChannelPosition.LFE, 3, 2 + }; + + void create_channel_controls() { + + for (int i = 0; i < position_table.length; i += 3) { + channel_controls[position_table[i]] = new ChannelControl(canberra, (ChannelPosition) position_table[i]); + channel_table.attach(channel_controls[position_table[i]], + position_table[i+1], + position_table[i+1]+1, + position_table[i+2], + position_table[i+2]+1, + AttachOptions.EXPAND, AttachOptions.EXPAND, 0, 0); + } + } + + void update_channel_map(ChannelMap? m) { + + if (m == null) + channel_notebook.set_current_page(0); + else { + for (int i = 0; i < position_table.length; i += 3) + channel_controls[position_table[i]].set_visible( + m != null && m.has_position((ChannelPosition) position_table[i])); + + channel_notebook.set_current_page(1); + } + } + + void context_state_cb(PulseAudio.Context c) { + + PulseAudio.Context.State state = c.get_state(); + + if (!state.IS_GOOD()) { + stderr.printf("Couldn't establish connection: %s\n", PulseAudio.strerror(c.errno())); + Gtk.main_quit(); + return; + }; + + if (state == PulseAudio.Context.State.READY) { + /* Connection is ready, let's query cards and sinks */ + context.subscribe(PulseAudio.Context.SubscriptionMask.SINK | PulseAudio.Context.SubscriptionMask.CARD); + c.get_card_info_list(context_card_info_cb); + c.get_sink_info_list(context_sink_info_cb); + } + } + + bool find_card_iter(uint32 idx, out TreeIter iter) { + + if (!cards.get_iter_first(out iter)) + return false; + + do { + uint32 j; + cards.get(iter, 1, out j); + + if (j == idx) + return true; + + } while (cards.iter_next(ref iter)); + + return false; + } + + bool find_device_iter(ListStore devices, uint32 idx, out TreeIter iter) { + + if (!devices.get_iter_first(out iter)) + return false; + + do { + uint32 j; + devices.get(iter, 1, out j); + + if (j == idx) + return true; + + } while (devices.iter_next(ref iter)); + + return false; + } + + void context_subscribe_cb(PulseAudio.Context c, PulseAudio.Context.SubscriptionEventType t, uint32 idx) { + + switch (t & PulseAudio.Context.SubscriptionEventType.FACILITY_MASK) { + + case PulseAudio.Context.SubscriptionEventType.CARD: + + if ((t & PulseAudio.Context.SubscriptionEventType.TYPE_MASK) == + PulseAudio.Context.SubscriptionEventType.REMOVE) { + + if (idx in card_lookup) { + CardData *d = card_lookup[idx]; + + TreeIter iter; + if (find_card_iter(idx, out iter)) + cards.remove(iter); + + if (current_devices == d->devices) + current_devices = null; + + card_lookup.remove(idx); + delete d; + + /* Make sure the UI is properly updated when the last device of a card is gone */ + on_card_combo_box_changed(); + } + } else + context.get_card_info_by_index(idx, context_card_info_cb); + + break; + + case PulseAudio.Context.SubscriptionEventType.SINK: + + if ((t & PulseAudio.Context.SubscriptionEventType.TYPE_MASK) == + PulseAudio.Context.SubscriptionEventType.REMOVE) { + + if (idx in device_lookup) { + DeviceData *d = device_lookup[idx]; + + TreeIter iter; + if (d->card != null) { + if (find_device_iter(d->card->devices, idx, out iter)) + d->card->devices.remove(iter); + } else + if (find_device_iter(unowned_devices, idx, out iter)) + unowned_devices.remove(iter); + + device_lookup.remove(idx); + delete d; + + /* Make sure the UI is properly updated when the last device of a card is gone */ + on_card_combo_box_changed(); + } + + } else + context.get_sink_info_by_index(idx, context_sink_info_cb); + + break; + } + } + + void pick_initial_card() { + if (finished_startup) + return; + + finished_startup = true; + + if (card_combo_box.get_active() >= 0) + return; + + TreeIter i; + if (cards.get_iter_first(out i) && + cards.iter_next(ref i)) + card_combo_box.set_active(1); + else + card_combo_box.set_active(0); + } + + void context_card_info_cb(PulseAudio.Context c, CardInfo? info, int eol) { + + if (info == null) { + pick_initial_card(); + return; + } + + CardData *d; + TreeIter iter; + + if (info.index in card_lookup) { + + d = card_lookup[info.index]; + d->profiles.clear(); + + find_card_iter(d->index, out iter); + } else { + d = new CardData(); + + d->devices = new ListStore(2, typeof(string), typeof(uint32)); + d->profiles = new ListStore(2, typeof(string), typeof(string)); + d->index = info.index; + + card_lookup[d->index] = d; + cards.append(out iter); + } + + d->description = info.proplist.gets(PulseAudio.Proplist.PROP_DEVICE_DESCRIPTION); + if (d->description == null) + d->description = info.name; + + cards.set(iter, 0, d->description, 1, d->index); + + d->active_profile = -1; + for (int j = 0; j < info.n_profiles; j++) { + d->profiles.append(out iter); + d->profiles.set(iter, + 0, info.profiles[j].description, + 1, info.profiles[j].name); + + if (info.active_profile == &info.profiles[j]) + d->active_profile = j; + } + + /* The card we are showing might have changed, so + * let's make sure to show all fields correctly */ + on_card_combo_box_changed(); + } + + void context_sink_info_cb(PulseAudio.Context c, SinkInfo? info, int eol) { + + if (info == null) + return; + + DeviceData *d; + TreeIter iter; + ListStore *devices; + + if (info.index in device_lookup) { + + d = device_lookup[info.index]; + d->ports.clear(); + + if (d->card == null) + devices = unowned_devices; + else + devices = d->card->devices; + + find_device_iter(devices, d->index, out iter); + + } else { + + d = new DeviceData(); + d->ports = new ListStore(2, typeof(string), typeof(string)); + d->index = info.index; + d->name = info.name; + + if (info.card == INVALID_INDEX) { + d->card = null; + devices = unowned_devices; + } else { + d->card = card_lookup[info.card]; + devices = d->card->devices; + } + + device_lookup[info.index] = d; + devices->append(out iter); + } + + d->channel_map = info.channel_map; + d->description = info.proplist.gets(PulseAudio.Proplist.PROP_DEVICE_DESCRIPTION); + if (d->description == null) + d->description = info.name; + + devices->set(iter, 0, d->description, 1, d->index); + + d->active_port = -1; + for (int j = 0; j < info.n_ports; j++) { + d->ports.append(out iter); + d->ports.set(iter, + 0, info.ports[j]->description, + 1, info.ports[j]->name); + + if (info.active_port == info.ports[j]) + d->active_port = j; + } + + /* A card might just have added a sink, so let's make + * sure the sink dropdown is visible */ + on_card_combo_box_changed(); + } + + void on_close_button_clicked() { + Gtk.main_quit(); + } + + unowned CardData? get_current_card() { + TreeIter i; + uint32 index; + + if (!card_combo_box.get_active_iter(out i)) + return null; + + cards.get(i, 1, out index); + if (index in card_lookup) + return card_lookup[index]; + + return null; + } + + unowned string? get_current_profile() { + TreeIter i; + unowned string name; + + if (current_profiles == null) + return null; + + if (!profile_combo_box.get_active_iter(out i)) + return null; + + current_profiles->get(i, 1, out name); + return name; + } + + unowned DeviceData? get_current_device() { + TreeIter i; + uint32 index; + + if (current_devices == null) + return null; + + if (!device_combo_box.get_active_iter(out i)) + return null; + + current_devices->get(i, 1, out index); + if (index in device_lookup) + return device_lookup[index]; + + return null; + } + + unowned string? get_current_port() { + TreeIter i; + unowned string name; + + if (current_ports == null) + return null; + + if (!port_combo_box.get_active_iter(out i)) + return null; + + current_ports->get(i, 1, out name); + return name; + } + + void show_ports(ListStore? ports, int active_port) { + TreeIter i; + + if (ports != null && ports.get_iter_first(out i)) { + current_ports = ports; + port_combo_box.set_model(current_ports); + port_label.set_visible(true); + port_combo_box.set_visible(true); + + if (active_port >= 0) + port_combo_box.set_active(active_port); + } else { + current_ports = null; + port_label.set_visible(false); + port_combo_box.set_visible(false); + port_combo_box.set_model(current_ports); + } + } + + void show_profiles(ListStore? profiles, int active_profile) { + TreeIter i; + + if (profiles != null && profiles.get_iter_first(out i)) { + current_profiles = profiles; + profile_combo_box.set_model(current_profiles); + profile_label.set_visible(true); + profile_combo_box.set_visible(true); + + if (active_profile >= 0) + profile_combo_box.set_active(active_profile); + } else { + current_profiles = null; + profile_label.set_visible(false); + profile_combo_box.set_visible(false); + profile_combo_box.set_model(current_profiles); + } + } + + void show_devices(ListStore? devices) { + TreeIter i; + + if (devices != null && devices.get_iter_first(out i)) { + current_devices = devices; + device_combo_box.set_model(current_devices); + device_title_label.set_visible(true); + device_title_alignment.set_visible(true); + device_label.set_visible(true); + device_combo_box.set_visible(true); + } else { + current_devices = null; + device_title_label.set_visible(false); + device_title_alignment.set_visible(false); + device_label.set_visible(false); + device_combo_box.set_visible(false); + device_combo_box.set_model(current_devices); + show_ports(null, -1); + update_channel_map(null); + } + } + + void select_something(ComboBox combo_box) { + TreeIter iter; + unowned TreeModel m; + + if (combo_box.get_active_iter(out iter)) + return; + + m = combo_box.get_model(); + if (m == null) + return; + + if (!m.get_iter_first(out iter)) + return; + + device_combo_box.set_active_iter(iter); + } + + void on_card_combo_box_changed() { + unowned CardData info; + + suppress_feedback = true; + + info = get_current_card(); + if (info == null) { + show_profiles(null, -1); + show_devices(unowned_devices); + } else { + show_profiles(info.profiles, info.active_profile); + show_devices(info.devices); + } + + select_something(device_combo_box); + suppress_feedback = false; + + on_device_combo_box_changed(); + } + + void on_profile_combo_box_changed() { + unowned CardData? info; + unowned string? profile; + + if (suppress_feedback) + return; + + info = get_current_card(); + if (info == null) + return; + + profile = get_current_profile(); + if (profile == null) + return; + + context.set_card_profile_by_index(info.index, profile); + } + + void on_device_combo_box_changed() { + unowned DeviceData info; + + suppress_feedback = true; + + info = get_current_device(); + if (info == null) { + show_ports(null, -1); + + update_channel_map(null); + } else { + show_ports(info.ports, info.active_port); + canberra.change_device(info.name); + update_channel_map(info.channel_map); + } + + suppress_feedback = false; + } + + void on_port_combo_box_changed() { + unowned DeviceData? info; + unowned string? port; + + if (suppress_feedback) + return; + + info = get_current_device(); + if (info == null) + return; + + port = get_current_port(); + if (port == null) + return; + + context.set_sink_port_by_index(info.index, port); + } +} + +int main (string[] args) { + Gtk.init (ref args); + + var window = new SpeakerSetupWindow(); + window.show_all(); + + Gtk.main(); + + return 0; +} diff --git a/libpulse.vapi b/libpulse.vapi new file mode 100644 index 0000000..21c0f7c --- /dev/null +++ b/libpulse.vapi @@ -0,0 +1,1519 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio 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; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +using GLib; +using Posix; + +[CCode (cheader_filename="pulse/pulseaudio.h")] +namespace PulseAudio { + + [CCode (cname="pa_get_library_version")] + public unowned string get_library_version(); + + [CCode (cname="PA_API_VERSION")] + public const int API_VERSION; + + [CCode (cname="PA_PROTOCOL_VERSION")] + public const int PROTOCOL_VERSION; + + [CCode (cname="PA_MAJOR")] + public const int MAJOR; + + [CCode (cname="PA_MINOR")] + public const int MINOR; + + [CCode (cname="PA_MICRO")] + public const int MICRO; + + [CCode (cname="PA_CHECK_VERSION")] + public bool CHECK_VERSION(int major, int minor, int micro); + + [CCode (cname="PA_INVALID_INDEX")] + public const uint32 INVALID_INDEX; + + [CCode (cname="pa_free_cb_t")] + public delegate void FreeCb(void *p); + + [CCode (cname="pa_sample_format_t", cprefix="PA_SAMPLE_")] + public enum SampleFormat { + U8, + ALAW, + ULAW, + S16LE, + S16BE, + FLOAT32LE, + FLOAT32BE, + S32LE, + S32BE, + S24LE, + S24BE, + S24_32LE, + S24_32BE, + MAX, + S16NE, + S16RE, + FLOAT32NE, + FLOAT32RE, + S32NE, + S32RE, + S24NE, + S24RE, + S24_32NE, + S24_32RE; + + [CCode (cname="pa_sample_size_of_format")] + public size_t size(); + + [CCode (cname="pa_sample_format_to_string")] + public unowned string? to_string(); + + [CCode (cname="pa_sample_format_is_le")] + public int is_le(); + + [CCode (cname="pa_sample_format_is_be")] + public int is_be(); + + [CCode (cname="pa_sample_format_is_ne")] + public int is_ne(); + + [CCode (cname="pa_sample_format_is_re")] + public int is_re(); + + [CCode (cname="pa_parse_sample_format")] + public static SampleFormat parse(string b); + } + + [CCode (cname="pa_usec_t")] + public struct usec : uint64 { + } + + [CCode (cname="pa_sample_spec")] + public struct SampleSpec { + public SampleFormat format; + public uint32 rate; + public uint8 channels; + + [CCode (cname="PA_SAMPLE_SPEC_SNPRINT_MAX")] + public static const size_t SNPRINT_MAX; + + [CCode (cname="pa_bytes_per_second")] + public size_t bytes_per_second(); + + [CCode (cname="pa_frame_size")] + public size_t frame_size(); + + [CCode (cname="pa_sample_size")] + public size_t sample_size(); + + [CCode (cname="pa_bytes_to_usec", instance_pos=1.1)] + public usec bytes_to_usec(size_t size); + + [CCode (cname="pa_usec_to_bytes", instance_pos=1.1)] + public size_t usec_to_bytes(usec u); + + [CCode (cname="pa_sample_spec_init")] + public unowned SampleSpec? init(); + + [CCode (cname="pa_sample_spec_valid")] + public bool valid(); + + [CCode (cname="pa_sample_spec_equal")] + public bool equal(SampleSpec other); + + [CCode (cname="pa_sample_spec_snprint", instance_pos=3.1)] + public unowned string snprint(char[] buf); + + public string sprint() { + var buffer = new char[SNPRINT_MAX]; + this.snprint(buffer); + return (string) buffer; + } + + public string to_string() { + return sprint(); + } + + [CCode (cname="pa_sample_spec_init")] + public SampleSpec(); + } + + // [CCode (cname="PA_BYTES_SNPRINT_MAX")] + [CCode (cname="PA_SAMPLE_SPEC_SNPRINT_MAX")] + public const size_t BYTES_SNPRINT_MAX; + + [CCode (cname="pa_bytes_snprint")] + public unowned string bytes_snprint(char[] buf, uint bytes); + + public string bytes_sprint(uint bytes) { + var buffer = new char[BYTES_SNPRINT_MAX]; + bytes_snprint(buffer, bytes); + return (string) buffer; + } + + [CCode (cname="pa_volume_t")] + public struct Volume : uint32 { + + [CCode (cname="PA_SW_VOLUME_SNPRINT_DB_MAX")] + public static const size_t SW_SNPRINT_DB_MAX; + + [CCode (cname="PA_VOLUME_SNPRINT_MAX")] + public static const size_t SNPRINT_MAX; + + [CCode (cname="PA_VOLUME_MAX")] + public static const Volume MAX; + + [CCode (cname="PA_VOLUME_NORM")] + public static const Volume NORM; + + [CCode (cname="PA_VOLUME_MUTED")] + public static const Volume MUTED; + + // [CCode (cname="PA_VOLUME_INVALID")] + [CCode (cname="PA_VOLUME_MAX")] + public static const Volume INVALID; + + [CCode (cname="pa_volume_snprint", instance_pos = 3.1)] + public unowned string snprint(char[] s); + + public string sprint() { + var buffer = new char[SNPRINT_MAX]; + this.snprint(buffer); + return (string) buffer; + } + + public string to_string() { + return sprint(); + } + + [CCode (cname="pa_sw_volume_snprint_dB", instance_pos = 3.1)] + public unowned string sw_snprint_dB(char[] s); + + public string sw_sprint_dB() { + var buffer = new char[SW_SNPRINT_DB_MAX]; + this.sw_snprint_dB(buffer); + return (string) buffer; + } + + [CCode (cname="pa_sw_volume_multiply")] + public Volume sw_multiply(Volume other); + + [CCode (cname="pa_sw_volume_divide")] + public Volume sw_divide(Volume other); + + [CCode (cname="pa_sw_volume_from_dB")] + public static Volume sw_from_dB(double f); + + [CCode (cname="pa_sw_volume_to_dB")] + public double sw_to_dB(); + + [CCode (cname="pa_sw_volume_from_linear")] + public static Volume sw_from_linear(double f); + + [CCode (cname="pa_sw_volume_to_linear")] + public double sw_to_linear(); + } + + [CCode (cname="PA_DECIBEL_MININFTY")] + public const double DECIBEL_MININFTY; + + [CCode (cname="PA_CHANNELS_MAX")] + public const int CHANNELS_MAX; + + [CCode (cname="PA_CHANNELS_MAX")] + public const int RATE_MAX; + + [CCode (cname="pa_cvolume")] + public struct CVolume { + public uint8 channels; + public Volume values[]; + + [CCode (cname="PA_SW_CVOLUME_SNPRINT_DB_MAX")] + public static const size_t SW_SNPRINT_DB_MAX; + + [CCode (cname="PA_CVOLUME_SNPRINT_MAX")] + public static const size_t SNPRINT_MAX; + + [CCode (cname="pa_cvolume_equal")] + public bool equal(CVolume other); + + [CCode (cname="pa_cvolume_init")] + public unowned CVolume? init(); + + [CCode (cname="pa_cvolume_reset")] + public unowned CVolume? reset(uint8 channels); + + [CCode (cname="pa_cvolume_mute")] + public unowned CVolume? mute(uint8 channels); + + [CCode (cname="pa_cvolume_snprint", instance_pos = 3.1)] + public unowned string snprint(char[] s); + + public string sprint() { + var buffer = new char[SNPRINT_MAX]; + this.snprint(buffer); + return (string) buffer; + } + + public string to_string() { + return sprint(); + } + + [CCode (cname="pa_sw_cvolume_snprint_dB", instance_pos = 3.1)] + public unowned string sw_snprint_dB(char [] s); + + public string sw_sprint_dB() { + var buffer = new char[SW_SNPRINT_DB_MAX]; + this.sw_snprint_dB(buffer); + return (string) buffer; + } + + [CCode (cname="pa_cvolume_init")] + public CVolume(); + + [CCode (cname="pa_cvolume_avg")] + public Volume avg(); + + [CCode (cname="pa_cvolume_max")] + public Volume max(); + + [CCode (cname="pa_cvolume_min")] + public Volume min(); + + [CCode (cname="pa_cvolume_avg_mask")] + public Volume avg_mask(ChannelMap map, ChannelPositionMask mask); + + [CCode (cname="pa_cvolume_max_mask")] + public Volume max_mask(ChannelMap map, ChannelPositionMask mask); + + [CCode (cname="pa_cvolume_min_mask")] + public Volume min_mask(ChannelMap map, ChannelPositionMask mask); + + [CCode (cname="pa_cvolume_valid")] + public bool valid(); + + [CCode (cname="pa_cvolume_channels_equal_to")] + public bool channels_equal_to(Volume other); + + [CCode (cname="pa_cvolume_is_muted")] + public bool is_muted(); + + [CCode (cname="pa_cvolume_is_norm")] + public bool is_norm(); + + [CCode (cname="pa_sw_cvolume_multiply")] + public unowned CVolume? multiply(CVolume other); + + [CCode (cname="pa_sw_cvolume_divide")] + public unowned CVolume? divide(CVolume other); + + [CCode (cname="pa_sw_cvolume_multiply_scalar")] + public unowned CVolume? multiply_scalar(Volume other); + + [CCode (cname="pa_sw_cvolume_divide_scalar")] + public unowned CVolume? divide_scalar(Volume other); + + [CCode (cname="pa_cvolume_remap")] + public unowned CVolume? remap(ChannelMap from, ChannelMap to); + + [CCode (cname="pa_cvolume_compatible")] + public bool compatible(SampleSpec ss); + + [CCode (cname="pa_cvolume_compatible_with_channel_map")] + public bool compatible_with_channel_map(ChannelMap cm); + + [CCode (cname="pa_cvolume_get_balance")] + public float get_balance(ChannelMap map); + + [CCode (cname="pa_cvolume_set_balance")] + public unowned CVolume? set_balance(ChannelMap map, float b); + + [CCode (cname="pa_cvolume_get_fade")] + public float get_fade(ChannelMap map); + + [CCode (cname="pa_cvolume_set_fade")] + public unowned CVolume? set_fade(ChannelMap map, float f); + + [CCode (cname="pa_cvolume_scale")] + public unowned CVolume? scale(Volume max); + + [CCode (cname="pa_cvolume_scale_mask")] + public unowned CVolume? scale_mask(Volume max, ChannelMap map, ChannelPositionMask mask); + + [CCode (cname="pa_cvolume_set_position")] + public unowned CVolume? set_position(ChannelMap map, ChannelPosition p, Volume v); + + [CCode (cname="pa_cvolume_get_position")] + public Volume get_position(ChannelMap map, ChannelPosition p); + + [CCode (cname="pa_cvolume_merge")] + public unowned CVolume? merge(CVolume other); + + [CCode (cname="pa_cvolume_inc")] + public unowned CVolume? inc(Volume plus = 1); + + [CCode (cname="pa_cvolume_dec")] + public unowned CVolume? dec(Volume minus = 1); + } + + [CCode (cname="pa_channel_map")] + public struct ChannelMap { + public uint8 channels; + public ChannelPosition map[]; + + [CCode (cname="PA_CHANNEL_MAP_SNPRINT_MAX")] + public static const size_t SNPRINT_MAX; + + [CCode (cname="pa_channel_map_init")] + public ChannelMap(); + + [CCode (cname="pa_channel_map_init")] + public unowned ChannelMap? init(); + + [CCode (cname="pa_channel_map_init_mono")] + public unowned ChannelMap? init_mono(); + + [CCode (cname="pa_channel_map_init_stereo")] + public unowned ChannelMap? init_stereo(); + + [CCode (cname="pa_channel_map_init_auto")] + public unowned ChannelMap? init_auto(uint8 channels, ChannelMapDef def = ChannelMapDef.DEFAULT); + + [CCode (cname="pa_channel_map_init_extend")] + public unowned ChannelMap? init_extend(uint8 channels, ChannelMapDef def = ChannelMapDef.DEFAULT); + + [CCode (cname="pa_channel_map_snprint", instance_pos = 3.1)] + public unowned string snprint(char[] s); + + public string sprint() { + var buffer = new char[SNPRINT_MAX]; + this.snprint(buffer); + return (string) buffer; + } + + public string to_string() { + return sprint(); + } + + [CCode (cname="pa_channel_map_parse")] + public unowned ChannelMap? parse(string s); + + [CCode (cname="pa_channel_map_equal")] + public bool equal(ChannelMap other); + + [CCode (cname="pa_channel_map_superset")] + public bool superset(ChannelMap other); + + [CCode (cname="pa_channel_map_valid")] + public bool valid(); + + [CCode (cname="pa_channel_map_compatible")] + public bool compatible(SampleSpec ss); + + [CCode (cname="pa_channel_map_can_balance")] + public bool can_balance(); + + [CCode (cname="pa_channel_map_can_fade")] + public bool can_fade(); + + [CCode (cname="pa_channel_map_to_name")] + public unowned string? to_name(); + + [CCode (cname="pa_channel_map_to_pretty_name")] + public unowned string? to_pretty_name(); + + [CCode (cname="pa_channel_map_has_position")] + public bool has_position(ChannelPosition p); + + [CCode (cname="pa_channel_map_mask")] + public ChannelPositionMask mask(); + } + + [CCode (cname="pa_channel_position_mask_t")] + public struct ChannelPositionMask : uint64 { + } + + [CCode (cname="pa_channel_position_t", cprefix="PA_CHANNEL_POSITION_")] + public enum ChannelPosition { + INVALID, + MONO, + FRONT_LEFT, + FRONT_RIGHT, + FRONT_CENTER, + REAR_CENTER, + REAR_LEFT, + REAR_RIGHT, + LFE, + FRONT_LEFT_OF_CENTER, + FRONT_RIGHT_OF_CENTER, + SIDE_LEFT, + SIDE_RIGHT, + TOP_CENTER, + AUX0, + AUX1, + AUX2, + AUX3, + AUX4, + AUX5, + AUX6, + AUX7, + AUX8, + AUX9, + AUX10, + AUX11, + AUX12, + AUX13, + AUX14, + AUX15, + AUX16, + AUX17, + AUX18, + AUX19, + AUX20, + AUX21, + AUX22, + AUX23, + AUX24, + AUX25, + AUX26, + AUX27, + AUX28, + AUX29, + AUX30, + AUX31, + MAX; + + [CCode (cname="PA_CHANNEL_POSITION_MASK")] + public ChannelPositionMask mask(); + + [CCode (cname="pa_channel_position_to_string")] + public unowned string? to_string(); + + [CCode (cname="pa_channel_position_to_pretty_string")] + public unowned string? to_pretty_string(); + + [CCode (cname="pa_channel_position_from_string")] + public static ChannelPosition from_string(string s); + } + + [CCode (cname="pa_channel_map_def_t", cprefix="PA_CHANNEL_MAP_")] + public enum ChannelMapDef { + AIFF, + WAVEEX, + AUX, + DEFAULT, + + [CCode (cname="PA_CHANNEL_MAP_DEF_MAX")] + MAX + } + + [Compact] + [CCode (cname="pa_proplist", cprefix="pa_proplist_", free_function="pa_proplist_free")] + public class Proplist { + + [CCode (cname="PA_PROP_MEDIA_NAME")] + public static const string PROP_MEDIA_NAME; + [CCode (cname="PA_PROP_MEDIA_TITLE")] + public static const string PROP_MEDIA_TITLE; + [CCode (cname="PA_PROP_MEDIA_ARTIST")] + public static const string PROP_MEDIA_ARTIST; + [CCode (cname="PA_PROP_MEDIA_COPYRIGHT")] + public static const string PROP_MEDIA_COPYRIGHT; + [CCode (cname="PA_PROP_MEDIA_SOFTWARE")] + public static const string PROP_MEDIA_SOFTWARE; + [CCode (cname="PA_PROP_MEDIA_LANGUAGE")] + public static const string PROP_MEDIA_LANGUAGE; + [CCode (cname="PA_PROP_MEDIA_FILENAME")] + public static const string PROP_MEDIA_FILENAME; + [CCode (cname="PA_PROP_MEDIA_ICON_NAME")] + public static const string PROP_MEDIA_ICON_NAME; + [CCode (cname="PA_PROP_MEDIA_ROLE")] + public static const string PROP_MEDIA_ROLE; + [CCode (cname="PA_PROP_EVENT_ID")] + public static const string PROP_EVENT_ID; + [CCode (cname="PA_PROP_EVENT_DESCRIPTION")] + public static const string PROP_EVENT_DESCRIPTION; + [CCode (cname="PA_PROP_EVENT_MOUSE_X")] + public static const string PROP_EVENT_MOUSE_X; + [CCode (cname="PA_PROP_EVENT_MOUSE_Y")] + public static const string PROP_EVENT_MOUSE_Y; + [CCode (cname="PA_PROP_EVENT_MOUSE_HPOS")] + public static const string PROP_EVENT_MOUSE_HPOS; + [CCode (cname="PA_PROP_EVENT_MOUSE_VPOS")] + public static const string PROP_EVENT_MOUSE_VPOS; + [CCode (cname="PA_PROP_EVENT_MOUSE_BUTTON")] + public static const string PROP_EVENT_MOUSE_BUTTON; + [CCode (cname="PA_PROP_WINDOW_NAME")] + public static const string PROP_WINDOW_NAME; + [CCode (cname="PA_PROP_WINDOW_ID")] + public static const string PROP_WINDOW_ID; + [CCode (cname="PA_PROP_WINDOW_ICON_NAME")] + public static const string PROP_WINDOW_ICON_NAME; + [CCode (cname="PA_PROP_WINDOW_X11_DISPLAY")] + public static const string PROP_WINDOW_X11_DISPLAY; + [CCode (cname="PA_PROP_WINDOW_X11_SCREEN")] + public static const string PROP_WINDOW_X11_SCREEN; + [CCode (cname="PA_PROP_WINDOW_X11_MONITOR")] + public static const string PROP_WINDOW_X11_MONITOR; + [CCode (cname="PA_PROP_WINDOW_X11_XID")] + public static const string PROP_WINDOW_X11_XID; + [CCode (cname="PA_PROP_APPLICATION_NAME")] + public static const string PROP_APPLICATION_NAME; + [CCode (cname="PA_PROP_APPLICATION_ID")] + public static const string PROP_APPLICATION_ID; + [CCode (cname="PA_PROP_APPLICATION_VERSION")] + public static const string PROP_APPLICATION_VERSION; + [CCode (cname="PA_PROP_APPLICATION_ICON_NAME")] + public static const string PROP_APPLICATION_ICON_NAME; + [CCode (cname="PA_PROP_APPLICATION_LANGUAGE")] + public static const string PROP_APPLICATION_LANGUAGE; + [CCode (cname="PA_PROP_APPLICATION_PROCESS_ID")] + public static const string PROP_APPLICATION_PROCESS_ID; + [CCode (cname="PA_PROP_APPLICATION_PROCESS_BINARY")] + public static const string PROP_APPLICATION_PROCESS_BINARY; + [CCode (cname="PA_PROP_APPLICATION_PROCESS_USER")] + public static const string PROP_APPLICATION_PROCESS_USER; + [CCode (cname="PA_PROP_APPLICATION_PROCESS_HOST")] + public static const string PROP_APPLICATION_PROCESS_HOST; + [CCode (cname="PA_PROP_APPLICATION_PROCESS_MACHINE_ID")] + public static const string PROP_APPLICATION_PROCESS_MACHINE_ID; + [CCode (cname="PA_PROP_APPLICATION_PROCESS_SESSION_ID")] + public static const string PROP_APPLICATION_PROCESS_SESSION_ID; + [CCode (cname="PA_PROP_DEVICE_STRING")] + public static const string PROP_DEVICE_STRING; + [CCode (cname="PA_PROP_DEVICE_API")] + public static const string PROP_DEVICE_API; + [CCode (cname="PA_PROP_DEVICE_DESCRIPTION")] + public static const string PROP_DEVICE_DESCRIPTION; + [CCode (cname="PA_PROP_DEVICE_BUS_PATH")] + public static const string PROP_DEVICE_BUS_PATH; + [CCode (cname="PA_PROP_DEVICE_SERIAL")] + public static const string PROP_DEVICE_SERIAL; + [CCode (cname="PA_PROP_DEVICE_VENDOR_ID")] + public static const string PROP_DEVICE_VENDOR_ID; + [CCode (cname="PA_PROP_DEVICE_VENDOR_NAME")] + public static const string PROP_DEVICE_VENDOR_NAME; + [CCode (cname="PA_PROP_DEVICE_PRODUCT_ID")] + public static const string PROP_DEVICE_PRODUCT_ID; + [CCode (cname="PA_PROP_DEVICE_PRODUCT_NAME")] + public static const string PROP_DEVICE_PRODUCT_NAME; + [CCode (cname="PA_PROP_DEVICE_CLASS")] + public static const string PROP_DEVICE_CLASS; + [CCode (cname="PA_PROP_DEVICE_FORM_FACTOR")] + public static const string PROP_DEVICE_FORM_FACTOR; + [CCode (cname="PA_PROP_DEVICE_BUS")] + public static const string PROP_DEVICE_BUS; + [CCode (cname="PA_PROP_DEVICE_ICON_NAME")] + public static const string PROP_DEVICE_ICON_NAME; + [CCode (cname="PA_PROP_DEVICE_ACCESS_MODE")] + public static const string PROP_DEVICE_ACCESS_MODE; + [CCode (cname="PA_PROP_DEVICE_MASTER_DEVICE")] + public static const string PROP_DEVICE_MASTER_DEVICE; + [CCode (cname="PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE")] + public static const string PROP_DEVICE_BUFFERING_BUFFER_SIZE; + [CCode (cname="PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE")] + public static const string PROP_DEVICE_BUFFERING_FRAGMENT_SIZE; + [CCode (cname="PA_PROP_DEVICE_PROFILE_NAME")] + public static const string PROP_DEVICE_PROFILE_NAME; + [CCode (cname="PA_PROP_DEVICE_INTENDED_ROLES")] + public static const string PROP_DEVICE_INTENDED_ROLES; + [CCode (cname="PA_PROP_DEVICE_PROFILE_DESCRIPTION")] + public static const string PROP_DEVICE_PROFILE_DESCRIPTION; + [CCode (cname="PA_PROP_MODULE_AUTHOR")] + public static const string PROP_MODULE_AUTHOR; + [CCode (cname="PA_PROP_MODULE_DESCRIPTION")] + public static const string PROP_MODULE_DESCRIPTION; + [CCode (cname="PA_PROP_MODULE_USAGE")] + public static const string PROP_MODULE_USAGE; + [CCode (cname="PA_PROP_MODULE_VERSION")] + public static const string PROP_MODULE_VERSION; + + [CCode (cname="pa_proplist_new")] + public Proplist(); + + public int sets(string key, string value); + public int setp(string pair); + + [PrintfFormat] + public int setf(string key, string format, ...); + + public int set(string key, void* data, size_t size); + + public unowned string? gets(string key); + + public int get(string key, out void* data, out size_t size); + + public void update(UpdateMode mode, Proplist other); + + public void unset(string key); + + [CCode (array_length = false)] + public void unset_many(string[] key); + + public unowned string? iterate(ref void* state); + + public string to_string(); + + public string to_string_sep(string sep); + + public static Proplist? from_string(string s); + + public int contains(string key); + + public void clear(); + + public Proplist copy(); + + public uint size(); + + public bool is_empty(); + } + + [CCode (cname="pa_update_mode_t", cprefix="PA_UPDATE_")] + public enum UpdateMode { + SET, + MERGE, + REPLACE + } + + [CCode (cname="PA_OK")] + public const int OK; + + [CCode (cname="int", cprefix="PA_ERR_")] + public enum Error { + ACCESS, + COMMAND, + INVALID, + EXIST, + NOENTITY, + CONNECTIONREFUSED, + PROTOCOL, + TIMEOUT, + AUTHKEY, + INTERNAL, + CONNECTIONTERMINATED, + KILLED, + INVALIDSERVER, + MODINITFAILED, + BADSTATE, + NODATA, + VERSION, + TOOLARGE, + NOTSUPPORTED, + UNKNOWN, + NOEXTENSION, + OBSOLETE, + NOTIMPLEMENTED, + FORKED, + IO, + MAX + } + + [CCode (cname="pa_strerror")] + public unowned string? strerror(Error e); + + public delegate void VoidFunc(); + + [CCode (cname="pa_spawn_api")] + public struct SpawnApi { + VoidFunc? prefork; + VoidFunc? postfork; + VoidFunc? atfork; + } + + [CCode (cname="pa_io_event_flags_t", cprefix="PA_IO_EVENT_")] + public enum IoEventFlags { + NULL, + INPUT, + OUTPUT, + HANGUP, + ERROR + } + + [Compact] + [CCode (cname="pa_io_event", unref_function="", ref_function="")] + public struct IoEvent { + } + + [Compact] + [CCode (cname="pa_time_event", unref_function="", ref_function="")] + public struct TimeEvent { + } + + [Compact] + [CCode (cname="pa_defer_event", unref_function="", ref_function="")] + public struct DeferEvent { + } + + [Compact] + [CCode (cname="pa_signal_event", cprefix="pa_signal_", free_function="pa_signal_free")] + public struct SignalEvent { + + [CCode (cname="pa_signal_new")] + public SignalEvent(int sig, MainLoopApi.SignalEventCb cb); + + public void set_destroy(MainLoopApi.SignalEventDestroyCb cb); + } + + [Compact] + [CCode (cname="pa_mainloop_api", unref_function="", ref_function="")] + public class MainLoopApi { + public void* userdata; + + /* Callbacks for the consumer to implement*/ + public delegate void IoEventCb(MainLoopApi a, IoEvent e, int fd, IoEventFlags flags); + public delegate void IoEventDestroyCb(MainLoopApi a, IoEvent e); + + public delegate void TimeEventCb(MainLoopApi a, TimeEvent e, ref timeval t); + public delegate void TimeEventDestroyCb(MainLoopApi a, TimeEvent e); + + public delegate void DeferEventCb(MainLoopApi a, DeferEvent e); + public delegate void DeferEventDestroyCb(MainLoopApi a, DeferEvent e); + + public delegate void SignalEventCb(MainLoopApi a, SignalEvent e); + public delegate void SignalEventDestroyCb(MainLoopApi a, SignalEvent e); + + /* Callbacks for the provider to implement */ + public delegate IoEvent IoNewCb(MainLoopApi a, int fd, IoEventFlags flags, IoEventCb cb); + public delegate void IoEnableCb(MainLoopApi a, IoEvent e, IoEventFlags flags); + public delegate void IoFreeCb(MainLoopApi a, IoEvent e); + public delegate void IoSetDestroyCb(MainLoopApi a, IoEvent e, IoEventDestroyCb? cb); + + public delegate TimeEvent TimeNewCb(MainLoopApi a, timeval? t, TimeEventCb cb); + public delegate void TimeRestartCb(MainLoopApi a, TimeEvent e, timeval? t); + public delegate void TimeFreeCb(MainLoopApi a, TimeEvent e); + public delegate void TimeSetDestroyCb(MainLoopApi a, TimeEvent e, TimeEventDestroyCb? cb); + + public delegate DeferEvent DeferNewCb(MainLoopApi a, DeferEventCb cb); + public delegate void DeferEnableCb(MainLoopApi a, DeferEvent e, bool b); + public delegate void DeferFreeCb(MainLoopApi a, DeferEvent e); + public delegate void DeferSetDestroyCb(MainLoopApi a, DeferEvent e, DeferEventDestroyCb? cb); + + public delegate void QuitCb(MainLoopApi a, int retval); + + public delegate void OnceCb(MainLoopApi a); + + public IoNewCb io_new; + public IoEnableCb io_enable; + public IoFreeCb io_free; + public IoSetDestroyCb io_set_destroy; + + public TimeNewCb time_new; + public TimeRestartCb time_restart; + public TimeFreeCb time_free; + public TimeSetDestroyCb time_set_destroy; + + public DeferNewCb defer_new; + public DeferEnableCb defer_enable; + public DeferFreeCb defer_free; + public DeferSetDestroyCb defer_set_destroy; + + public QuitCb quit; + + [CCode (cname="pa_mainloop_api_once")] + public void once(OnceCb cb); + } + + [CCode (cname="pa_signal_init")] + public void signal_init(MainLoopApi api); + + [CCode (cname="pa_signal_done")] + public void signal_done(); + + [CCode (cname="pa_poll_func")] + public delegate int PollFunc(pollfd[] ufds, int timeout); + + [Compact] + [CCode (cname="pa_mainloop", cprefix="pa_mainloop_", free_function="pa_mainloop_free")] + public class MainLoop { + + [CCode (cname="pa_mainloop_new")] + public MainLoop(); + + public int prepare(int timeout = -1); + public int poll(); + public int dispatch(); + public int get_retval(); + public int iterate(bool block = true, out int retval = null); + public int run(out int retval = null); + public unowned MainLoopApi get_api(); + public void quit(int r); + public void wakeup(); + public void set_poll_func(PollFunc poll_func); + } + + [Compact] + [CCode (cname="pa_threaded_mainloop", cprefix="pa_threaded_mainloop_", free_function="pa_threaded_mainloop_free")] + public class ThreadedMainLoop { + + [CCode (cname="pa_threaded_mainloop_new")] + public ThreadedMainLoop(); + + public int start(); + public void stop(); + public void lock(); + public void unlock(); + public void wait(); + public void signal(bool WaitForAccept = false); + public void accept(); + public int get_retval(); + public unowned MainLoopApi get_api(); + public bool in_thread(); + } + + [Compact] + [CCode (cheader_filename="pulse/glib-mainloop.h", cname="pa_glib_mainloop", cprefix="pa_glib_mainloop_", free_function="pa_glib_mainloop_free")] + public class GLibMainLoop { + + [CCode (cname="pa_glib_mainloop_new")] + public GLibMainLoop(MainContext? c = null); + + public unowned MainLoopApi get_api(); + } + + [Compact] + [CCode (cname="pa_operation", cprefix="pa_operation_", unref_function="pa_operation_unref", ref_function="pa_operation_ref")] + public class Operation { + + [CCode (cname="pa_operation_state_t", cprefix="PA_OPERATION_")] + public enum State { + RUNNING, + DONE, + CANCELED + } + + public void cancel(); + public State get_state(); + } + + [Compact] + [CCode (cname="pa_context", cprefix="pa_context_", unref_function="pa_context_unref", ref_function="pa_context_ref")] + public class Context { + + [CCode (cname="pa_context_flags_t", cprefix="PA_CONTEXT_")] + public enum Flags { + NOAUTOSPAWN, + NOFAIL + } + + [CCode (cname="pa_context_state_t", cprefix="PA_CONTEXT_")] + public enum State { + UNCONNECTED, + CONNECTING, + AUTHORIZING, + SETTING_NAME, + READY, + FAILED, + TERMINATED; + + [CCode (cname="PA_CONTEXT_IS_GOOD")] + public bool IS_GOOD(); + } + + [CCode (cname="pa_subscription_mask_t", cprefix="PA_SUBSCRIPTION_MASK_")] + public enum SubscriptionMask { + NULL, + SINK, + SOURCE, + SINK_INPUT, + SOURCE_OUTPUT, + MODULE, + CLIENT, + SAMPLE_CACHE, + SERVER, + CARD, + ALL; + + [CCode (cname="pa_subscription_match_flags")] + public bool match_flags(SubscriptionEventType t); + } + + [CCode (cname="pa_subscription_event_type_t", cprefix="PA_SUBSCRIPTION_EVENT_")] + public enum SubscriptionEventType { + SINK, + SOURCE, + SINK_INPUT, + SOURCE_OUTPUT, + MODULE, + CLIENT, + SAMPLE_CACHE, + SERVER, + CARD, + FACILITY_MASK, + NEW, + CHANGE, + REMOVE, + TYPE_MASK + } + + public delegate void NotifyCb(Context c); + public delegate void SuccessCb(Context c, int success); + public delegate void EventCb(Context c, string name, Proplist? proplist); + public delegate void SubscribeCb(Context c, SubscriptionEventType t, uint32 idx); + public delegate void SinkInfoCb(Context c, SinkInfo? i, int eol); + public delegate void SourceInfoCb(Context c, SourceInfo? i, int eol); + public delegate void CardInfoCb(Context c, CardInfo? i, int eol); + public delegate void SinkInputInfoCb(Context c, SinkInputInfo? i, int eol); + public delegate void SourceOutputInfoCb(Context c, SourceOutputInfo? i, int eol); + public delegate void ServerInfoCb(Context c, ServerInfo? i); + public delegate void StatInfoCb(Context c, ServerInfo? i); + public delegate void ModuleInfoCb(Context c, ModuleInfo? i, int eol); + public delegate void ClientInfoCb(Context c, ClientInfo? i, int eol); + public delegate void SampleInfoCb(Context c, SampleInfo? i, int eol); + public delegate void IndexCb(Context c, uint32 idx); + + [CCode (cname="pa_context_new_with_proplist")] + public Context(MainLoopApi api, string? name, Proplist? proplist = null); + + public void set_state_callback(NotifyCb? cb = null); + public void set_event_callback(EventCb? cb = null); + public void set_subscribe_callback(SubscribeCb? cb = null); + + public Error errno(); + + public int is_pending(); + public State get_state(); + public int is_local(); + public unowned string? get_server(); + public uint32 get_protocol_version(); + public uint32 get_server_protocol_version(); + public uint32 get_index(); + + public int connect(string? server = null, Flags flags = 0, SpawnApi? api = null); + public void disconnect(); + + public Operation? drain(NotifyCb? cb = null); + public Operation? exit_daemon(SuccessCb? cb = null); + public Operation? set_default_sink(string name, SuccessCb? cb = null); + public Operation? set_default_source(string name, SuccessCb? cb = null); + public Operation? set_name(string name, SuccessCb? cb = null); + + [CCode (array_length = false)] + public Operation? proplist_remove(string[] keys, SuccessCb? cb = null); + public Operation? proplist_update(UpdateMode mode, Proplist pl, SuccessCb? cb = null); + + public Operation? subscribe(SubscriptionMask mask, SuccessCb? cb = null); + + public Operation? get_sink_info_by_name(string name, SinkInfoCb cb); + public Operation? get_sink_info_by_index(uint32 idx, SinkInfoCb cb); + public Operation? get_sink_info_list(SinkInfoCb cb); + + public Operation? set_sink_volume_by_name(string name, CVolume volume, SuccessCb? cb = null); + public Operation? set_sink_volume_by_index(uint32 idx, CVolume volume, SuccessCb? cb = null); + public Operation? set_sink_mute_by_name(string name, bool mute, SuccessCb? cb = null); + public Operation? set_sink_mute_by_index(uint32 idx, bool mute, SuccessCb? cb = null); + + public Operation? suspend_sink_by_name(string name, bool suspend, SuccessCb? cb = null); + public Operation? suspend_sink_by_index(uint32 idx, bool suspend, SuccessCb? cb = null); + + public Operation? set_sink_port_by_name(string name, string port, SuccessCb? cb = null); + public Operation? set_sink_port_by_index(uint32 idx, string port, SuccessCb? cb = null); + + public Operation? get_source_info_by_name(string name, SourceInfoCb cb); + public Operation? get_source_info_by_index(uint32 idx, SourceInfoCb cb); + public Operation? get_source_info_list(SourceInfoCb cb); + + public Operation? set_source_volume_by_name(string name, CVolume volume, SuccessCb? cb = null); + public Operation? set_source_volume_by_index(uint32 idx, CVolume volume, SuccessCb? cb = null); + public Operation? set_source_mute_by_name(string name, bool mute, SuccessCb? cb = null); + public Operation? set_source_mute_by_index(uint32 idx, bool mute, SuccessCb? cb = null); + + public Operation? suspend_source_by_name(string name, bool suspend, SuccessCb? cb = null); + public Operation? suspend_source_by_index(uint32 idx, bool suspend, SuccessCb? cb = null); + + public Operation? set_source_port_by_name(string name, string port, SuccessCb? cb = null); + public Operation? set_source_port_by_index(uint32 idx, string port, SuccessCb? cb = null); + + public Operation? get_server_info(ServerInfoCb cb); + + public Operation? get_module_info(uint32 idx, ModuleInfoCb cb); + public Operation? get_module_info_list(ModuleInfoCb cb); + + public Operation? load_module(string name, string? argument, IndexCb? cb = null); + public Operation? unload_module(uint32 idx, SuccessCb? cb = null); + + public Operation? get_client_info(uint32 idx, ClientInfoCb cb); + public Operation? get_client_info_list(ClientInfoCb cb); + + public Operation? kill_client(uint32 idx, SuccessCb? cb = null); + + public Operation? get_card_info_by_name(string name, CardInfoCb cb); + public Operation? get_card_info_by_index(uint32 idx, CardInfoCb cb); + public Operation? get_card_info_list(CardInfoCb cb); + + public Operation? set_card_profile_by_index(uint32 idx, string profile, SuccessCb? cb = null); + public Operation? set_card_profile_by_name(string name, string profile, SuccessCb? cb = null); + + public Operation? get_sink_input_info(uint32 idx, SinkInputInfoCb cb); + public Operation? get_sink_input_info_list(SinkInputInfoCb cb); + + public Operation? move_sink_input_by_index(uint32 idx, uint32 sink_idx, SuccessCb? cb = null); + public Operation? move_sink_input_by_name(uint32 idx, string sink_name, SuccessCb? cb = null); + + public Operation? set_sink_input_volume(uint32 idx, CVolume volume, SuccessCb? cb = null); + public Operation? set_sink_input_mute(uint32 idx, bool mute, SuccessCb? cb = null); + + public Operation? kill_sink_input(uint32 idx, SuccessCb? cb = null); + + public Operation? get_source_output_info(uint32 idx, SourceOutputInfoCb cb); + public Operation? get_source_output_info_list(SourceOutputInfoCb cb); + + public Operation? move_source_output_by_index(uint32 idx, uint32 source_idx, SuccessCb? cb = null); + public Operation? move_source_output_by_name(uint32 idx, string source_name, SuccessCb? cb = null); + + public Operation? kill_source_output(uint32 idx, SuccessCb? cb = null); + + public Operation? stat(StatInfoCb cb); + + public Operation? get_sample_info_by_name(string name, SampleInfoCb cb); + public Operation? get_sample_info_by_index(uint32 idx, SampleInfoCb cb); + public Operation? get_sample_info_list(SampleInfoCb cb); + + public Operation? remove_sample(string name, SuccessCb? cb = null); + + public Operation? play_sample(string name, string? device = null, Volume volume = Volume.INVALID, SuccessCb? cb = null); + public Operation? play_sample_with_proplist(string name, string? device = null, Volume volume = Volume.INVALID, Proplist? p = null, IndexCb? cb = null); + } + + [Compact] + [CCode (cname="pa_stream", cprefix="pa_stream_", unref_function="pa_stream_unref", ref_function="pa_stream_ref")] + public class Stream { + + [CCode (cname="pa_stream_flags_t", cprefix="PA_STREAM_")] + public enum Flags { + 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 + } + + [CCode (cname="pa_stream_state_t", cprefix="PA_STREAM_")] + public enum State { + UNCONNECTED, + CREATING, + READY, + FAILED, + TERMINATED; + + [CCode (cname="PA_STREAM_IS_GOOD")] + public bool IS_GOOD(); + } + + [CCode (cname="pa_stream_direction_t", cprefix="PA_STREAM_")] + public enum Direction { + NODIRECTION, + PLAYBACK, + RECORD, + UPLOAD + } + + [CCode (cname="pa_seek_mode_t", cprefix="PA_SEEK_")] + public enum SeekMode { + RELATIVE, + ABSOLUTE, + RELATIVE_ON_READ, + RELATIVE_END + } + + [CCode (cname="pa_buffer_attr")] + public struct BufferAttr { + uint32 maxlength; + uint32 tlength; + uint32 prebuf; + uint32 minreq; + uint32 fragsize; + } + + [CCode (cname="pa_timing_info")] + public struct TimingInfo { + timeval timestamp; + int synchronized_clocks; + usec sink_usec; + usec source_usec; + usec transport_usec; + int playing; + int write_index_corrupt; + int64 write_index; + int read_index_corrupt; + int64 read_index; + usec configured_sink_usec; + usec configured_source_usec; + int64 since_underrun; + } + + [CCode (cname="PA_STREAM_EVENT_REQUEST_CORK")] + public const string EVENT_REQUEST_CORK; + + [CCode (cname="PA_STREAM_EVENT_REQUEST_UNCORK")] + public const string EVENT_REQUEST_UNCORK; + + public delegate void SuccessCb(Stream s, int success); + public delegate void RequestCb(Stream s, size_t nbytes); + public delegate void NotifyCb(Stream s); + public delegate void EventCb(Stream s, string name, Proplist proplist); + + [CCode (cname="pa_stream_new_with_proplist")] + public Stream(Context c, string name, SampleSpec ss, ChannelMap? map = null, Proplist? proplist = null); + + public State get_state(); + public Context get_context(); + public uint32 get_index(); + public uint32 get_device_index(); + public unowned string? get_device_name(); + public int is_suspended(); + public int is_corked(); + + public int connect_playback(string dev, BufferAttr? a = null, Flags flags = 0, CVolume? volume = null, Stream? sync_stream = null); + public int connect_record(string dev, BufferAttr? a = null, Flags flags = 0); + public int connect_upload(size_t length); + public int disconnect(); + public int finish_upload(); + + public int begin_write(out void* data, out size_t nbytes); + public int cancel_write(); + public int write(void *data, size_t bytes, FreeCb? free_cb = null, int64 offset = 0, SeekMode mode = SeekMode.RELATIVE); + public int peek(out void *data, out size_t nbytes); + public int drop(); + public size_t writable_size(); + public size_t readable_size(); + + public void set_state_callback(NotifyCb? cb = null); + public void set_write_callback(RequestCb? cb = null); + public void set_read_callback(RequestCb? cb = null); + public void set_overflow_callback(NotifyCb? cb = null); + public void set_underflow_callback(NotifyCb? cb = null); + public void set_started_callback(NotifyCb? cb = null); + public void set_latency_update_callback(NotifyCb? cb = null); + public void set_moved_callback(NotifyCb? cb = null); + public void set_suspended_callback(NotifyCb? cb = null); + public void set_event_callback(EventCb? cb = null); + public void set_buffer_attr_callback(NotifyCb? cb = null); + + public Operation? drain(SuccessCb? cb = null); + public Operation? update_timing_info(SuccessCb? cb = null); + + public Operation? cork(bool b, SuccessCb? cb = null); + public Operation? flush(SuccessCb? cb = null); + public Operation? prebuf(SuccessCb? cb = null); + public Operation? trigger(SuccessCb? cb = null); + + public Operation? set_name(string name, SuccessCb? cb = null); + public Operation? set_buffer_attr(BufferAttr attr, SuccessCb? cb = null); + public Operation? update_sample_rate(uint32 rate, SuccessCb? cb = null); + + [CCode (array_length = false)] + public Operation? proplist_remove(string[] keys, SuccessCb? cb = null); + public Operation? proplist_update(UpdateMode mode, Proplist pl, SuccessCb? cb = null); + + public unowned TimingInfo? get_timing_info(); + public int get_time(out usec u); + public int get_latency(out usec u, out bool negative = null); + + public unowned SampleSpec? get_sample_spec(); + public unowned ChannelMap? get_channel_map(); + public unowned BufferAttr? get_buffer_attr(); + + public int set_monitor_stream(uint32 sink_input); + public uint32 get_monitor_stream(); + } + + [CCode (cname="pa_sink_port_info")] + public struct SinkPortInfo { + public string name; + public string description; + public uint32 priority; + } + + [CCode (cname="pa_sink_info")] + public struct SinkInfo { + public string name; + public uint32 index; + public string description; + public SampleSpec sample_spec; + public ChannelMap channel_map; + public uint32 owner_module; + public CVolume volume; + public int mute; + public uint32 monitor_source; + public string monitor_source_name; + public usec latency; + public string driver; + public SinkFlags flags; + public Proplist proplist; + public usec configured_latency; + public Volume base_volume; + public SinkState state; + public uint32 n_volume_steps; + public uint32 card; + public uint32 n_ports; + public SinkPortInfo*[] ports; + public SinkPortInfo* active_port; + } + + [CCode (cname="pa_source_port_info")] + public struct SourcePortInfo { + public string name; + public string description; + public uint32 priority; + } + + [CCode (cname="pa_source_info")] + public struct SourceInfo { + public string name; + public uint32 index; + public string description; + public SampleSpec sample_spec; + public ChannelMap channel_map; + public uint32 owner_module; + public CVolume volume; + public int mute; + public uint32 monitor_of_sink; + public string monitor_of_sink_name; + public usec latency; + public string driver; + public SourceFlags flags; + public Proplist proplist; + public usec configured_latency; + public Volume base_volume; + public SourceState state; + public uint32 n_volume_steps; + public uint32 card; + public uint32 n_ports; + public SourcePortInfo*[] ports; + public SourcePortInfo* active_port; + } + + [CCode (cname="pa_server_info")] + public struct ServerInfo { + public string user_name; + public string host_name; + public string server_version; + public string server_name; + public SampleSpec sample_spec; + public string default_sink_name; + public string default_source_name; + public ChannelMap channel_map; + } + + [CCode (cname="pa_module_info")] + public struct ModuleInfo { + public uint32 index; + public string name; + public string argument; + public uint32 n_used; + public Proplist proplist; + } + + [CCode (cname="pa_client_info")] + public struct ClientInfo { + public uint32 index; + public string name; + public uint32 owner_module; + public string driver; + public Proplist proplist; + } + + [CCode (cname="pa_card_profile_info")] + public struct CardProfileInfo { + public string name; + public string description; + public uint32 n_sinks; + public uint32 n_sources; + public uint32 priority; + } + + [CCode (cname="pa_card_info")] + public struct CardInfo { + public uint32 index; + public string name; + public uint32 owner_module; + public string driver; + public uint32 n_profiles; + public CardProfileInfo profiles[]; + public CardProfileInfo *active_profile; + public Proplist proplist; + } + + [CCode (cname="pa_sink_input_info")] + public struct SinkInputInfo { + public uint32 index; + public string name; + public uint32 owner_module; + public uint32 client; + public uint32 sink; + public SampleSpec sample_spec; + public ChannelMap channel_map; + public CVolume volume; + public uint32 buffer_usec; + public uint32 sink_usec; + public string resample_method; + public string driver; + public int mute; + public Proplist proplist; + } + + [CCode (cname="pa_source_output_info")] + public struct SourceOutputInfo { + public uint32 index; + public string name; + public uint32 owner_module; + public uint32 client; + public uint32 source; + public SampleSpec sample_spec; + public ChannelMap channel_map; + public uint32 buffer_usec; + public uint32 sink_usec; + public string resample_method; + public string driver; + public Proplist proplist; + } + + [CCode (cname="pa_stat_info")] + public struct StatInfo { + public uint32 memblock_total; + public uint32 memblock_total_size; + public uint32 memblock_allocated; + public uint32 memblock_allocated_size; + public uint32 scache_size; + } + + [CCode (cname="pa_sample_info")] + public struct SampleInfo { + public uint32 index; + public string name; + public CVolume volume; + public SampleSpec sample_spec; + public ChannelMap channel_map; + public usec duration; + public uint32 bytes; + public bool lazy; + public string filename; + public Proplist proplist; + } + + [CCode (cname="pa_sink_flags_t", cprefix="PA_SINK_")] + public enum SinkFlags { + HW_VOLUME_CTRL, + LATENCY, + HARDWARE, + NETWORK, + HW_MUTE_CTRL, + DECIBEL_VOLUME, + FLAT_VOLUME, + DYNAMIC_LATENCY + } + + [CCode (cname="pa_source_flags_t", cprefix="PA_SOURCE_")] + public enum SourceFlags { + HW_VOLUME_CTRL, + LATENCY, + HARDWARE, + NETWORK, + HW_MUTE_CTRL, + DECIBEL_VOLUME, + DYNAMIC_LATENCY + } + + [CCode (cname="pa_sink_state_t", cprefix="PA_SINK_")] + public enum SinkState { + INVALID_STATE, + RUNNING, + IDLE, + SUSPENDED; + + [CCode (cname="PA_SINK_IS_OPENED")] + public bool IS_OPENED(); + } + + [CCode (cname="pa_source_state_t", cprefix="PA_SOURCE_")] + public enum SourceState { + INVALID_STATE, + RUNNING, + IDLE, + SUSPENDED; + + [CCode (cname="PA_SOURCE_IS_OPENED")] + public bool IS_OPENED(); + } + + [CCode (cname="pa_gettimeofday")] + public unowned timeval gettimeofday(out timeval tv); + + [CCode (cname="pa_timeval_diff")] + public usec timeval_diff(ref timeval a, ref timeval b); + + [CCode (cname="pa_timeval_cmp")] + public int timeval_cmp(ref timeval a, ref timeval b); + + [CCode (cname="pa_timeval_age")] + public usec timeval_age(ref timeval a); + + [CCode (cname="pa_timeval_add")] + public unowned timeval timeval_add(ref timeval tv, usec x); + + [CCode (cname="pa_timeval_sub")] + public unowned timeval timeval_sub(ref timeval tv, usec x); + + [CCode (cname="pa_timeval_store")] + public unowned timeval timeval_store(out timeval tv, usec c); + + [CCode (cname="pa_timeval_load")] + public usec timeval_load(timeval tv); + + [CCode (cname="PA_USEC_MAX")] + public const usec USEC_MAX; + + [CCode (cname="PA_USEC_INVALID")] + public const usec USEC_INVALID; + + [CCode (cname="PA_MSEC_PER_SEC")] + public const usec MSEC_PER_SEC; + + [CCode (cname="PA_USEC_PER_SEC")] + public const usec USEC_PER_SEC; + + [CCode (cname="PA_NSEC_PER_SEC")] + public const uint64 NSEC_PER_SEC; + + + [CCode (cname="PA_USEC_PER_MSEC")] + public const usec USEC_PER_MSEC; + + [CCode (cname="PA_NSEC_PER_MSEC")] + public const uint64 NSEC_PER_MSEC; + + + [CCode (cname="PA_NSEC_PER_USEC")] + public const uint64 NSEC_PER_USEC; +} -- cgit