Files
wireplumber/lib/wp/si-interfaces.c
2020-03-31 19:26:56 +03:00

319 lines
9.6 KiB
C

/* WirePlumber
*
* Copyright © 2020 Collabora Ltd.
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
*
* SPDX-License-Identifier: MIT
*/
/**
* SECTION: WpSiInterfaces
* @title: WpSessionItem Interfaces
*/
#include "si-interfaces.h"
#include "wpenums.h"
/**
* WpSiEndpoint:
*
* An interface for session items that implement a PipeWire endpoint.
*/
G_DEFINE_INTERFACE (WpSiEndpoint, wp_si_endpoint, WP_TYPE_SESSION_ITEM)
static void
wp_si_endpoint_default_init (WpSiEndpointInterface * iface)
{
g_signal_new ("endpoint-properties-changed", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
g_signal_new ("endpoint-streams-changed", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
}
/**
* wp_si_endpoint_get_registration_info: (virtual get_registration_info)
* @self: the session item
*
* This should return information that is used for registering the endpoint,
* as a GVariant tuple of type (ssya{ss}) that contains, in order:
* - s: the endpoint's name
* - s: the media class
* - y: the direction
* - a{ss}: additional properties to be added to the list of global properties
*
* Returns: (transfer full): registration info for the endpoint
*/
GVariant *
wp_si_endpoint_get_registration_info (WpSiEndpoint * self)
{
g_return_val_if_fail (WP_IS_SI_ENDPOINT (self), NULL);
g_return_val_if_fail (WP_SI_ENDPOINT_GET_IFACE (self)->get_registration_info, NULL);
return WP_SI_ENDPOINT_GET_IFACE (self)->get_registration_info (self);
}
/**
* wp_si_endpoint_get_properties: (virtual get_properties)
* @self: the session item
*
* Returns: (transfer full) (nullable): the properties of the endpoint
*/
WpProperties *
wp_si_endpoint_get_properties (WpSiEndpoint * self)
{
g_return_val_if_fail (WP_IS_SI_ENDPOINT (self), NULL);
g_return_val_if_fail (WP_SI_ENDPOINT_GET_IFACE (self)->get_properties, NULL);
return WP_SI_ENDPOINT_GET_IFACE (self)->get_properties (self);
}
/**
* wp_si_endpoint_get_n_streams: (virtual get_n_streams)
* @self: the session item
*
* Returns: the number of streams in the endpoint
*/
guint
wp_si_endpoint_get_n_streams (WpSiEndpoint * self)
{
g_return_val_if_fail (WP_IS_SI_ENDPOINT (self), 0);
g_return_val_if_fail (WP_SI_ENDPOINT_GET_IFACE (self)->get_n_streams, 0);
return WP_SI_ENDPOINT_GET_IFACE (self)->get_n_streams (self);
}
/**
* wp_si_endpoint_get_stream: (virtual get_stream)
* @self: the session item
* @index: the stream index, from 0 up to and excluding
* wp_si_endpoint_get_n_streams()
*
* Returns: (transfer none): the stream at @index
*/
WpSiStream *
wp_si_endpoint_get_stream (WpSiEndpoint * self, guint index)
{
g_return_val_if_fail (WP_IS_SI_ENDPOINT (self), NULL);
g_return_val_if_fail (WP_SI_ENDPOINT_GET_IFACE (self)->get_stream, NULL);
return WP_SI_ENDPOINT_GET_IFACE (self)->get_stream (self, index);
}
/**
* WpSiMultiEndpoint:
*
* An interface for session items that provide multiple PipeWire endpoints.
*
* This is useful for items that need to expose more than one endpoints while
* managing the same nodes underneath. For example, an audio playback device
* may have one input endpoint for sending audio to the device and one output
* endpoint for monitoring (exposing the adapter's monitor ports).
*
* If an item implements both #WpSiMultiEndpoint and #WpSiEndpoint, then the
* managing session will only inspect the #WpSiMultiEndpoint interface in
* order to determine which endpoints to export. Effectively this means that
* such an item should also include itself in the list of endpoints that
* it exposes through #WpSiMultiEndpoint in order to be exported to PipeWire.
*/
G_DEFINE_INTERFACE (WpSiMultiEndpoint, wp_si_multi_endpoint, WP_TYPE_SESSION_ITEM)
static void
wp_si_multi_endpoint_default_init (WpSiMultiEndpointInterface * iface)
{
}
/**
* wp_si_multi_endpoint_get_n_endpoints: (virtual get_n_endpoints)
* @self: the session item
*
* Returns: the number of endpoints exposed by this item
*/
guint
wp_si_multi_endpoint_get_n_endpoints (WpSiMultiEndpoint * self)
{
g_return_val_if_fail (WP_IS_SI_MULTI_ENDPOINT (self), 0);
g_return_val_if_fail (WP_SI_MULTI_ENDPOINT_GET_IFACE (self)->get_n_endpoints, 0);
return WP_SI_MULTI_ENDPOINT_GET_IFACE (self)->get_n_endpoints (self);
}
/**
* wp_si_multi_endpoint_get_endpoint: (virtual get_endpoint)
* @self: the session item
* @index: the endpoint index, from 0 up to and excluding
* wp_si_multi_endpoint_get_n_endpoints()
*
* Returns: (transfer none): the endpoint at @index
*/
WpSiEndpoint *
wp_si_multi_endpoint_get_endpoint (WpSiMultiEndpoint * self, guint index)
{
g_return_val_if_fail (WP_IS_SI_MULTI_ENDPOINT (self), NULL);
g_return_val_if_fail (WP_SI_MULTI_ENDPOINT_GET_IFACE (self)->get_endpoint, NULL);
return WP_SI_MULTI_ENDPOINT_GET_IFACE (self)->get_endpoint (self, index);
}
/**
* WpSiStream:
*
* An interface for session items that provide a PipeWire endpoint stream.
*/
G_DEFINE_INTERFACE (WpSiStream, wp_si_stream, WP_TYPE_SESSION_ITEM)
static void
wp_si_stream_default_init (WpSiStreamInterface * iface)
{
g_signal_new ("stream-properties-changed", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
}
/**
* wp_si_stream_get_registration_info: (virtual get_registration_info)
* @self: the session item
*
* This should return information that is used for registering the stream,
* as a GVariant tuple of type (sa{ss}) that contains, in order:
* - s: the stream's name
* - a{ss}: additional properties to be added to the list of global properties
*
* Returns: (transfer full): registration info for the stream
*/
GVariant *
wp_si_stream_get_registration_info (WpSiStream * self)
{
g_return_val_if_fail (WP_IS_SI_STREAM (self), NULL);
g_return_val_if_fail (WP_SI_STREAM_GET_IFACE (self)->get_registration_info, NULL);
return WP_SI_STREAM_GET_IFACE (self)->get_registration_info (self);
}
/**
* wp_si_stream_get_properties: (virtual get_properties)
* @self: the session item
*
* Returns: (transfer full) (nullable): the properties of the stream
*/
WpProperties *
wp_si_stream_get_properties (WpSiStream * self)
{
g_return_val_if_fail (WP_IS_SI_STREAM (self), NULL);
g_return_val_if_fail (WP_SI_STREAM_GET_IFACE (self)->get_properties, NULL);
return WP_SI_STREAM_GET_IFACE (self)->get_properties (self);
}
/**
* wp_si_stream_get_parent_endpoint: (virtual get_parent_endpoint)
* @self: the session item
*
* Returns: (transfer none): the endpoint that this stream belongs to
*/
WpSiEndpoint *
wp_si_stream_get_parent_endpoint (WpSiStream * self)
{
g_return_val_if_fail (WP_IS_SI_STREAM (self), NULL);
g_return_val_if_fail (WP_SI_STREAM_GET_IFACE (self)->get_parent_endpoint, NULL);
return WP_SI_STREAM_GET_IFACE (self)->get_parent_endpoint (self);
}
/**
* WpSiLink:
*
* An interface for session items that provide a PipeWire endpoint link.
*/
G_DEFINE_INTERFACE (WpSiLink, wp_si_link, WP_TYPE_SESSION_ITEM)
static void
wp_si_link_default_init (WpSiLinkInterface * iface)
{
g_signal_new ("link-properties-changed", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
g_signal_new ("link-state-changed", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2,
WP_TYPE_ENDPOINT_LINK_STATE, G_TYPE_STRING);
}
/**
* wp_si_link_get_registration_info: (virtual get_registration_info)
* @self: the session item
*
* This should return information that is used for registering the link,
* as a GVariant tuple of type (ya{ss}) that contains, in order:
* - y: the link's initial state (#WpEndpointLinkState)
* - a{ss}: additional properties to be added to the list of global properties
*
* Returns: (transfer full): registration info for the link
*/
GVariant *
wp_si_link_get_registration_info (WpSiLink * self)
{
g_return_val_if_fail (WP_IS_SI_LINK (self), NULL);
g_return_val_if_fail (WP_SI_LINK_GET_IFACE (self)->get_registration_info, NULL);
return WP_SI_LINK_GET_IFACE (self)->get_registration_info (self);
}
/**
* wp_si_link_get_properties: (virtual get_properties)
* @self: the session item
*
* Returns: (transfer full) (nullable): the properties of the link
*/
WpProperties *
wp_si_link_get_properties (WpSiLink * self)
{
g_return_val_if_fail (WP_IS_SI_LINK (self), NULL);
g_return_val_if_fail (WP_SI_LINK_GET_IFACE (self)->get_properties, NULL);
return WP_SI_LINK_GET_IFACE (self)->get_properties (self);
}
/**
* wp_si_link_get_out_stream: (virtual get_out_stream)
* @self: the session item
*
* Returns: (transfer none): the output stream that is linked by this link
*/
WpSiStream *
wp_si_link_get_out_stream (WpSiLink * self)
{
g_return_val_if_fail (WP_IS_SI_LINK (self), NULL);
g_return_val_if_fail (WP_SI_LINK_GET_IFACE (self)->get_out_stream, NULL);
return WP_SI_LINK_GET_IFACE (self)->get_out_stream (self);
}
/**
* wp_si_link_get_in_stream: (virtual get_in_stream)
* @self: the session item
*
* Returns: (transfer none): the input stream that is linked by this link
*/
WpSiStream *
wp_si_link_get_in_stream (WpSiLink * self)
{
g_return_val_if_fail (WP_IS_SI_LINK (self), NULL);
g_return_val_if_fail (WP_SI_LINK_GET_IFACE (self)->get_in_stream, NULL);
return WP_SI_LINK_GET_IFACE (self)->get_in_stream (self);
}
/**
* wp_si_link_request_state: (virtual request_state)
* @self: the session item
* @target: the desired target state of the link
*
* Requests a state change on the link
*/
void
wp_si_link_request_state (WpSiLink * self, WpEndpointLinkState target)
{
g_return_if_fail (WP_IS_SI_LINK (self));
g_return_if_fail (WP_SI_LINK_GET_IFACE (self)->request_state);
WP_SI_LINK_GET_IFACE (self)->request_state (self, target);
}