aboutsummaryrefslogtreecommitdiff
path: root/tests/pa-mock.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pa-mock.c')
-rw-r--r--tests/pa-mock.c299
1 files changed, 299 insertions, 0 deletions
diff --git a/tests/pa-mock.c b/tests/pa-mock.c
new file mode 100644
index 0000000..6f4e6ad
--- /dev/null
+++ b/tests/pa-mock.c
@@ -0,0 +1,299 @@
+
+#include <pulseaudio.h>
+
+#ifdef G_LOG_DOMAIN
+#undef G_LOG_DOMAIN
+#endif
+#define G_LOG_DOMAIN "PA-Mock"
+
+G_DEFINE_QUARK("pa-mock-state-cb-list", state_cb);
+typedef struct {
+ pa_context_notify_cb_t cb;
+ gpointer user_data;
+} state_cb_t;
+
+/* *******************************
+ * context.h
+ * *******************************/
+
+static void
+context_weak_cb (gpointer user_data, GObject * oldobj)
+{
+ g_debug("Finalizing context: %p", oldobj);
+}
+
+pa_context *
+pa_context_new_with_proplist (pa_mainloop_api *mainloop, const char *name, pa_proplist *proplist)
+{
+ GObject * gctx = g_object_new(G_TYPE_OBJECT);
+ pa_context * ctx = (pa_context *)gctx;
+
+ g_debug("Creating new context: %p", ctx);
+ g_object_weak_ref(gctx, context_weak_cb, NULL);
+
+ return ctx;
+}
+
+void
+pa_context_unref (pa_context *c) {
+ g_return_if_fail(G_IS_OBJECT(c));
+ g_object_unref(G_OBJECT(c));
+}
+
+void
+pa_context_ref (pa_context *c) {
+ g_return_if_fail(G_IS_OBJECT(c));
+ g_object_ref(G_OBJECT(c));
+}
+
+int
+pa_context_connect (pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api)
+{
+ g_return_if_fail(G_IS_OBJECT(c));
+ g_debug("Context Connect");
+ return 0;
+}
+
+void
+pa_context_disconnect (pa_context *c)
+{
+ g_return_if_fail(G_IS_OBJECT(c));
+ g_debug("Context Disconnect");
+}
+
+int
+pa_context_errno (pa_context *c)
+{
+ g_return_val_if_fail(G_IS_OBJECT(c), -1);
+
+ return 0;
+}
+
+static void
+state_cb_list_destroy (gpointer data)
+{
+ GList * statelist = (GList *)data;
+ g_list_free_full(statelist, g_free);
+}
+
+void
+pa_context_set_state_callback (pa_context *c, pa_context_notify_cb_t cb, void *userdata)
+{
+ g_return_if_fail(G_IS_OBJECT(c));
+ g_return_if_fail(cb != NULL);
+
+ state_cb_t * state_cb = g_new0(state_cb_t, 1);
+ state_cb->cb = cb;
+ state_cb->userdata = userdata;
+
+ GList * statelist = g_object_get_qdata(G_OBJECT(c), state_cb_quark);
+ statelist = g_list_append(statelist, state_cb);
+ g_object_set_qdata_full(G_OBJECT(c), state_cb_quark, state_cb, state_cb_list_destroy);
+}
+
+pa_context_state_t
+pa_context_get_state (pa_context *c)
+{
+ g_return_if_fail(G_IS_OBJECT(c));
+
+ return PA_CONTEXT_READY;
+}
+
+/* *******************************
+ * introspect.h
+ * *******************************/
+
+typedef struct {
+ pa_server_info_cb_t cb;
+ gpointer userdata;
+ pa_context * context;
+} get_server_info_t;
+
+static void
+get_server_info_free (gpointer data)
+{
+ get_server_info_t * info = (get_server_info_t *)data;
+ g_object_unref(info->context);
+ g_free(info);
+}
+
+static gboolean
+get_server_info_cb (gpointer data)
+{
+ pa_server_info server = {
+ .user_name = "user",
+ .host_name = "host",
+ .server_version = "1.2.3",
+ .server_name = "server",
+ .sample_spec = ,
+ .default_sink_name = "default-sink",
+ .default_source_name = "default-source",
+ .cookie = 1234,
+ .channel_map = {
+ .channels = 0
+ }
+ };
+ get_server_info_t * info = (get_server_info_t *)data;
+
+ info->cb(info->context, &server, info->userdata);
+
+ return G_SOURCE_REMOVE;
+}
+
+pa_operation*
+pa_context_get_server_info (pa_context *c, pa_server_info_cb_t cb, void *userdata)
+{
+ g_return_val_if_fail(G_IS_OBJECT(c), NULL);
+ g_return_val_if_fail(cb != NULL, NULL);
+
+ get_server_info_t * info = g_new(get_server_info_t, 1);
+ info->cb = cb;
+ info->userdata = userdata;
+ info->context = g_objet_ref(c);
+
+ g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
+ get_server_info_cb,
+ info,
+ get_server_info_free);
+
+ GObject * goper = g_object_new(G_TYPE_OBJECT);
+ pa_operation * oper = (pa_operation *)goper;
+ return oper;
+}
+
+typedef struct {
+ pa_sink_info_cb_t cb;
+ gpointer userdata;
+ pa_context * context;
+ uint32_t index;
+} get_sink_info_t;
+
+static void
+get_sink_info_free (gpointer data)
+{
+ get_sink_info_t * info = (get_sink_info_t *)data;
+ g_object_unref(info->context);
+ g_free(info);
+}
+
+static gboolean
+get_info_info_cb (gpointer data)
+{
+ pa_sink_info sink = {
+ .name = "default-sink",
+ .index = 0,
+ .description = "Default Sink",
+ .channel_map = {
+ .channels = 0
+ }
+ };
+ get_sink_info_t * info = (get_sink_info_t *)data;
+
+ info->cb(info->context, &sink, 1, info->userdata);
+
+ return G_SOURCE_REMOVE;
+}
+
+pa_operation*
+pa_context_get_sink_info_by_name (pa_context *c, const gchar * name, pa_sink_info_cb_t cb, void *userdata)
+{
+ g_return_val_if_fail(G_IS_OBJECT(c), NULL);
+ g_return_val_if_fail(g_strcmp0(name, "default-sink") == 0, NULL);
+ g_return_val_if_fail(cb != NULL, NULL);
+
+ get_sink_info_t * info = g_new(get_sink_info_t, 1);
+ info->cb = cb;
+ info->userdata = userdata;
+ info->context = g_objet_ref(c);
+
+ g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
+ get_sink_info_cb,
+ info,
+ get_sink_info_free);
+
+ GObject * goper = g_object_new(G_TYPE_OBJECT);
+ pa_operation * oper = (pa_operation *)goper;
+ return oper;
+}
+
+pa_operation*
+pa_context_get_sink_info_list (pa_context *c, pa_sink_info_cb_t cb, void *userdata)
+{
+ /* Only have one today, so this is the same */
+ return pa_context_get_sink_info_by_name(c, "default-sink", cb, userdata);
+}
+
+
+pa_context_get_sink_input_info
+pa_context_get_source_info_by_name
+pa_context_get_source_output_info
+pa_context_get_state
+
+pa_context_set_sink_mute_by_index
+pa_context_set_sink_volume_by_index
+pa_context_set_source_volume_by_name
+pa_context_set_subscribe_callback
+pa_context_subscribe
+
+pa_cvolume_init
+pa_cvolume_max
+pa_cvolume_scale
+pa_cvolume_set
+
+/* *******************************
+ * glib-mainloop.h
+ * *******************************/
+
+struct pa_glib_mainloop {
+ GMainContext * context;
+};
+
+struct pa_mainloop_api mock_mainloop = { 0 };
+
+pa_mainloop_api *
+pa_glib_mainloop_get_api (pa_glib_mainloop * g)
+{
+ return &mock_mainloop;
+}
+
+pa_glib_mainloop *
+pa_glib_mainloop_new (GMainContext * c)
+{
+ pa_glib_mainloop * loop = g_new0(pa_glib_mainloop, 1);
+
+ if (c == NULL)
+ loop->context = g_main_context_default();
+ else
+ loop->context = c;
+
+ g_main_context_ref(loop->context);
+ return loop;
+}
+
+void
+pa_glib_mainloop_free (pa_glib_mainloop * g)
+{
+ g_main_context_unref(g->context);
+ g_free(g);
+}
+
+/* *******************************
+ * operation.h
+ * *******************************/
+
+void
+pa_operation_unref (pa_operation * operation)
+{
+ g_return_if_fail(G_IS_OBJECT(operation));
+ g_object_unref(G_OBJECT(operation));
+}
+
+pa_proplist_free
+pa_proplist_gets
+pa_proplist_new
+pa_proplist_sets
+
+pa_strerror
+
+pa_sw_volume_from_dB
+