mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-06 13:30:01 -05:00
More session manager work
pulseaudio card is mapped to device pulseaudio sink/source is mapped to an endpoint prepare to map streams to card profiles Add Route param to implement the endpoint routing later (ports) Create an alsa endpoint for each device Create one stream for each endpoint (Playback/Capture) Implement create_link on the endpoint. The idea is to call create link on the peer endpoint to complete the link. Remove create_link on the session. Add stream-monitor to turn pw_stream nodes into endpoints Add a policy manager that tries to link endpoints Use enum pw_direction for the endpoint direction. We can use the media_class to determine if this is a pw_stream or not but it should not really matter, you can link any output to any input. Add autoconnect property for endpoints to make the policy connect.
This commit is contained in:
parent
edd011605d
commit
3f3dfbc67e
27 changed files with 2338 additions and 439 deletions
|
|
@ -43,7 +43,8 @@ struct pw_client_endpoint_proxy { struct spa_interface iface; };
|
|||
#define PW_CLIENT_ENDPOINT_PROXY_EVENT_SET_SESSION_ID 1
|
||||
#define PW_CLIENT_ENDPOINT_PROXY_EVENT_SET_PARAM 2
|
||||
#define PW_CLIENT_ENDPOINT_PROXY_EVENT_STREAM_SET_PARAM 3
|
||||
#define PW_CLIENT_ENDPOINT_PROXY_EVENT_NUM 4
|
||||
#define PW_CLIENT_ENDPOINT_PROXY_EVENT_CREATE_LINK 4
|
||||
#define PW_CLIENT_ENDPOINT_PROXY_EVENT_NUM 5
|
||||
|
||||
struct pw_client_endpoint_proxy_events {
|
||||
#define PW_VERSION_CLIENT_ENDPOINT_PROXY_EVENTS 0
|
||||
|
|
@ -132,6 +133,8 @@ struct pw_client_endpoint_proxy_events {
|
|||
int (*stream_set_param) (void *object, uint32_t stream_id,
|
||||
uint32_t id, uint32_t flags,
|
||||
const struct spa_pod *param);
|
||||
|
||||
int (*create_link) (void *object, const struct spa_dict *props);
|
||||
};
|
||||
|
||||
#define PW_CLIENT_ENDPOINT_PROXY_METHOD_ADD_LISTENER 0
|
||||
|
|
@ -140,7 +143,7 @@ struct pw_client_endpoint_proxy_events {
|
|||
#define PW_CLIENT_ENDPOINT_PROXY_METHOD_NUM 3
|
||||
|
||||
struct pw_client_endpoint_proxy_methods {
|
||||
#define PW_VERSION_CLIENT_ENDPOINT_PROXY_METHODS 0
|
||||
#define PW_VERSION_CLIENT_ENDPOINT_PROXY_METHODS 0
|
||||
uint32_t version; /**< version of this structure */
|
||||
|
||||
int (*add_listener) (void *object,
|
||||
|
|
@ -190,10 +193,8 @@ struct pw_client_session_proxy { struct spa_interface iface; };
|
|||
#define PW_CLIENT_SESSION_PROXY_EVENT_SET_ID 0
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_SET_PARAM 1
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_LINK_SET_PARAM 2
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_CREATE_LINK 3
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_DESTROY_LINK 4
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_LINK_REQUEST_STATE 5
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_NUM 6
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_LINK_REQUEST_STATE 3
|
||||
#define PW_CLIENT_SESSION_PROXY_EVENT_NUM 4
|
||||
|
||||
struct pw_client_session_proxy_events {
|
||||
#define PW_VERSION_CLIENT_SESSION_PROXY_EVENTS 0
|
||||
|
|
@ -266,10 +267,6 @@ struct pw_client_session_proxy_events {
|
|||
uint32_t id, uint32_t flags,
|
||||
const struct spa_pod *param);
|
||||
|
||||
int (*create_link) (void *object, const struct spa_dict *props);
|
||||
|
||||
int (*destroy_link) (void *object, uint32_t link_id);
|
||||
|
||||
int (*link_request_state) (void *object, uint32_t link_id, uint32_t state);
|
||||
};
|
||||
|
||||
|
|
@ -279,7 +276,7 @@ struct pw_client_session_proxy_events {
|
|||
#define PW_CLIENT_SESSION_PROXY_METHOD_NUM 3
|
||||
|
||||
struct pw_client_session_proxy_methods {
|
||||
#define PW_VERSION_CLIENT_SESSION_PROXY_METHODS 0
|
||||
#define PW_VERSION_CLIENT_SESSION_PROXY_METHODS 0
|
||||
uint32_t version; /**< version of this structure */
|
||||
|
||||
int (*add_listener) (void *object,
|
||||
|
|
|
|||
|
|
@ -129,8 +129,6 @@ struct pw_session_proxy_methods {
|
|||
*/
|
||||
int (*set_param) (void *object, uint32_t id, uint32_t flags,
|
||||
const struct spa_pod *param);
|
||||
|
||||
int (*create_link) (void *object, const struct spa_dict *props);
|
||||
};
|
||||
|
||||
#define pw_session_proxy_method(o,method,version,...) \
|
||||
|
|
@ -146,7 +144,8 @@ struct pw_session_proxy_methods {
|
|||
#define pw_session_proxy_add_listener(c,...) pw_session_proxy_method(c,add_listener,0,__VA_ARGS__)
|
||||
#define pw_session_proxy_subscribe_params(c,...) pw_session_proxy_method(c,subscribe_params,0,__VA_ARGS__)
|
||||
#define pw_session_proxy_enum_params(c,...) pw_session_proxy_method(c,enum_params,0,__VA_ARGS__)
|
||||
#define pw_session_proxy_create_link(c,...) pw_session_proxy_method(c,create_link,0,__VA_ARGS__)
|
||||
#define pw_session_proxy_set_param(c,...) pw_session_proxy_method(c,set_param,0,__VA_ARGS__)
|
||||
|
||||
|
||||
/* Endpoint */
|
||||
|
||||
|
|
@ -185,7 +184,8 @@ struct pw_endpoint_proxy_events {
|
|||
#define PW_ENDPOINT_PROXY_METHOD_SUBSCRIBE_PARAMS 1
|
||||
#define PW_ENDPOINT_PROXY_METHOD_ENUM_PARAMS 2
|
||||
#define PW_ENDPOINT_PROXY_METHOD_SET_PARAM 3
|
||||
#define PW_ENDPOINT_PROXY_METHOD_NUM 4
|
||||
#define PW_ENDPOINT_PROXY_METHOD_CREATE_LINK 4
|
||||
#define PW_ENDPOINT_PROXY_METHOD_NUM 5
|
||||
|
||||
struct pw_endpoint_proxy_methods {
|
||||
#define PW_VERSION_ENDPOINT_PROXY_METHODS 0
|
||||
|
|
@ -232,6 +232,8 @@ struct pw_endpoint_proxy_methods {
|
|||
*/
|
||||
int (*set_param) (void *object, uint32_t id, uint32_t flags,
|
||||
const struct spa_pod *param);
|
||||
|
||||
int (*create_link) (void *object, const struct spa_dict *props);
|
||||
};
|
||||
|
||||
#define pw_endpoint_proxy_method(o,method,version,...) \
|
||||
|
|
@ -247,6 +249,8 @@ struct pw_endpoint_proxy_methods {
|
|||
#define pw_endpoint_proxy_add_listener(c,...) pw_endpoint_proxy_method(c,add_listener,0,__VA_ARGS__)
|
||||
#define pw_endpoint_proxy_subscribe_params(c,...) pw_endpoint_proxy_method(c,subscribe_params,0,__VA_ARGS__)
|
||||
#define pw_endpoint_proxy_enum_params(c,...) pw_endpoint_proxy_method(c,enum_params,0,__VA_ARGS__)
|
||||
#define pw_endpoint_proxy_set_param(c,...) pw_endpoint_proxy_method(c,set_param,0,__VA_ARGS__)
|
||||
#define pw_endpoint_proxy_create_link(c,...) pw_endpoint_proxy_method(c,create_link,0,__VA_ARGS__)
|
||||
|
||||
/* Endpoint Stream */
|
||||
|
||||
|
|
@ -347,6 +351,7 @@ struct pw_endpoint_stream_proxy_methods {
|
|||
#define pw_endpoint_stream_proxy_add_listener(c,...) pw_endpoint_stream_proxy_method(c,add_listener,0,__VA_ARGS__)
|
||||
#define pw_endpoint_stream_proxy_subscribe_params(c,...) pw_endpoint_stream_proxy_method(c,subscribe_params,0,__VA_ARGS__)
|
||||
#define pw_endpoint_stream_proxy_enum_params(c,...) pw_endpoint_stream_proxy_method(c,enum_params,0,__VA_ARGS__)
|
||||
#define pw_endpoint_stream_proxy_set_param(c,...) pw_endpoint_stream_proxy_method(c,set_param,0,__VA_ARGS__)
|
||||
|
||||
/* Endpoint Link */
|
||||
|
||||
|
|
@ -436,9 +441,6 @@ struct pw_endpoint_link_proxy_methods {
|
|||
const struct spa_pod *param);
|
||||
|
||||
int (*request_state) (void *object, enum pw_endpoint_link_state state);
|
||||
|
||||
int (*destroy) (void *object);
|
||||
|
||||
};
|
||||
|
||||
#define pw_endpoint_link_proxy_method(o,method,version,...) \
|
||||
|
|
@ -454,8 +456,8 @@ struct pw_endpoint_link_proxy_methods {
|
|||
#define pw_endpoint_link_proxy_add_listener(c,...) pw_endpoint_link_proxy_method(c,add_listener,0,__VA_ARGS__)
|
||||
#define pw_endpoint_link_proxy_subscribe_params(c,...) pw_endpoint_link_proxy_method(c,subscribe_params,0,__VA_ARGS__)
|
||||
#define pw_endpoint_link_proxy_enum_params(c,...) pw_endpoint_link_proxy_method(c,enum_params,0,__VA_ARGS__)
|
||||
#define pw_endpoint_link_proxy_set_param(c,...) pw_endpoint_link_proxy_method(c,set_param,0,__VA_ARGS__)
|
||||
#define pw_endpoint_link_proxy_request_state(c,...) pw_endpoint_link_proxy_method(c,request_state,0,__VA_ARGS__)
|
||||
#define pw_endpoint_link_proxy_destroy(c,...) pw_endpoint_link_proxy_method(c,destroy,0,__VA_ARGS__)
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -34,13 +34,6 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum pw_endpoint_direction {
|
||||
PW_ENDPOINT_DIRECTION_SINK_INPUT = SPA_DIRECTION_INPUT,
|
||||
PW_ENDPOINT_DIRECTION_SOURCE_OUTPUT = SPA_DIRECTION_OUTPUT,
|
||||
PW_ENDPOINT_DIRECTION_SOURCE,
|
||||
PW_ENDPOINT_DIRECTION_SINK,
|
||||
};
|
||||
|
||||
enum pw_endpoint_link_state {
|
||||
PW_ENDPOINT_LINK_STATE_ERROR = -1,
|
||||
PW_ENDPOINT_LINK_STATE_PREPARING,
|
||||
|
|
@ -67,7 +60,7 @@ struct pw_endpoint_info {
|
|||
uint32_t id; /**< the endpoint id (global) */
|
||||
char *name; /**< name of the endpoint */
|
||||
char *media_class; /**< media class of the endpoint */
|
||||
enum pw_endpoint_direction direction; /**< direction of the endpoint */
|
||||
enum pw_direction direction; /**< direction of the endpoint */
|
||||
#define PW_ENDPOINT_FLAG_PROVIDES_SESSION (1 << 0)
|
||||
uint32_t flags; /**< additional flags */
|
||||
#define PW_ENDPOINT_CHANGE_MASK_STREAMS (1 << 0)
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ extern "C" {
|
|||
#define PW_KEY_ENDPOINT_NAME "endpoint.name" /**< the name of an endpoint */
|
||||
#define PW_KEY_ENDPOINT_ICON_NAME "endpoint.icon-name" /**< an XDG icon name for the device.
|
||||
* Ex. "sound-card-speakers-usb" */
|
||||
#define PW_KEY_ENDPOINT_AUTOCONNECT "endpoint.autoconnect" /**< try to automatically connect this
|
||||
* endpoint. */
|
||||
|
||||
#define PW_KEY_STREAM_ID "stream.id" /**< id of a stream */
|
||||
#define PW_KEY_STREAM_NAME "stream.name" /**< unique name of a stream */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue