mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	restore-stream: expose stream restore info in metadata
This commit is contained in:
		
							parent
							
								
									5af2efdaa6
								
							
						
					
					
						commit
						b922f99293
					
				
					 1 changed files with 25 additions and 6 deletions
				
			
		| 
						 | 
					@ -57,6 +57,7 @@ struct impl {
 | 
				
			||||||
	struct pw_context *context;
 | 
						struct pw_context *context;
 | 
				
			||||||
	struct spa_source *idle_timeout;
 | 
						struct spa_source *idle_timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct pw_metadata *metadata;
 | 
				
			||||||
	struct spa_hook meta_listener;
 | 
						struct spa_hook meta_listener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct pw_properties *props;
 | 
						struct pw_properties *props;
 | 
				
			||||||
| 
						 | 
					@ -163,10 +164,19 @@ static char *serialize_props(struct stream *str, const struct spa_pod *param)
 | 
				
			||||||
	return ptr;
 | 
						return ptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void sync_metadata(struct impl *impl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const struct spa_dict_item *it;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_dict_for_each(it, &impl->props->dict)
 | 
				
			||||||
 | 
							pw_metadata_set_property(impl->metadata, 0, it->key, "Spa:String", it->value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int handle_props(struct stream *str, struct sm_param *p)
 | 
					static int handle_props(struct stream *str, struct sm_param *p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = str->impl;
 | 
						struct impl *impl = str->impl;
 | 
				
			||||||
	const char *key;
 | 
						const char *key;
 | 
				
			||||||
 | 
						int changed = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	key = str->key;
 | 
						key = str->key;
 | 
				
			||||||
	if (key == NULL)
 | 
						if (key == NULL)
 | 
				
			||||||
| 
						 | 
					@ -175,10 +185,12 @@ static int handle_props(struct stream *str, struct sm_param *p)
 | 
				
			||||||
	if (p->param) {
 | 
						if (p->param) {
 | 
				
			||||||
		char *val = serialize_props(str, p->param);
 | 
							char *val = serialize_props(str, p->param);
 | 
				
			||||||
		pw_log_debug("stream %d: current props %s %s", str->id, key, val);
 | 
							pw_log_debug("stream %d: current props %s %s", str->id, key, val);
 | 
				
			||||||
		pw_properties_set(impl->props, key, val);
 | 
							changed += pw_properties_set(impl->props, key, val);
 | 
				
			||||||
		free(val);
 | 
							free(val);
 | 
				
			||||||
		add_idle_timeout(impl);
 | 
							add_idle_timeout(impl);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (changed)
 | 
				
			||||||
 | 
							sync_metadata(impl);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -402,19 +414,26 @@ int sm_restore_stream_start(struct sm_media_session *session)
 | 
				
			||||||
	impl->context = session->context;
 | 
						impl->context = session->context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	impl->props = pw_properties_new(NULL, NULL);
 | 
						impl->props = pw_properties_new(NULL, NULL);
 | 
				
			||||||
	if (impl->props == NULL) {
 | 
						if (impl->props == NULL)
 | 
				
			||||||
		res = -errno;
 | 
							goto exit_errno;
 | 
				
			||||||
		goto exit_free;
 | 
					
 | 
				
			||||||
	}
 | 
						impl->metadata = sm_media_session_export_metadata(session, "route-settings");
 | 
				
			||||||
 | 
						if (impl->metadata == NULL)
 | 
				
			||||||
 | 
							goto exit_errno;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = sm_media_session_load_state(impl->session, SESSION_KEY, impl->props)) < 0)
 | 
						if ((res = sm_media_session_load_state(impl->session, SESSION_KEY, impl->props)) < 0)
 | 
				
			||||||
		pw_log_info("can't load "SESSION_KEY" state: %s", spa_strerror(res));
 | 
							pw_log_info("can't load "SESSION_KEY" state: %s", spa_strerror(res));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sync_metadata(impl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sm_media_session_add_listener(impl->session, &impl->listener, &session_events, impl);
 | 
						sm_media_session_add_listener(impl->session, &impl->listener, &session_events, impl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit_free:
 | 
					exit_errno:
 | 
				
			||||||
 | 
						res = -errno;
 | 
				
			||||||
 | 
						if (impl->props)
 | 
				
			||||||
 | 
							pw_properties_free(impl->props);
 | 
				
			||||||
	free(impl);
 | 
						free(impl);
 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue