media-session: express quantum relative to rate

This commit is contained in:
Wim Taymans 2018-07-03 21:55:08 +02:00
parent 9417cdd9e6
commit 70b04da723
3 changed files with 19 additions and 18 deletions

View file

@ -774,7 +774,7 @@ static int impl_node_process(struct spa_node *node)
int status, trigger; int status, trigger;
impl->ctrl.min_size = impl->ctrl.max_size = impl->ctrl.min_size = impl->ctrl.max_size =
impl->this.node->driver_node->rt.quantum->size; impl->this.node->driver_node->rt.quantum->size * sizeof(float);
spa_log_trace(this->log, "%p: process %d", this, impl->ctrl.max_size); spa_log_trace(this->log, "%p: process %d", this, impl->ctrl.max_size);

View file

@ -50,8 +50,9 @@ static const struct spa_dict_item module_props[] = {
#define DEFAULT_CHANNELS 2 #define DEFAULT_CHANNELS 2
#define DEFAULT_SAMPLE_RATE 48000 #define DEFAULT_SAMPLE_RATE 48000
#define DEFAULT_BUFFER_SIZE (64 * sizeof(float))
#define MAX_BUFFER_SIZE (1024 * sizeof(float)) #define MIN_QUANTUM_SIZE 64
#define MAX_QUANTUM_SIZE 1024
struct type { struct type {
struct spa_type_media_type media_type; struct spa_type_media_type media_type;
@ -109,7 +110,7 @@ struct session {
bool busy; bool busy;
bool exclusive; bool exclusive;
int sample_rate; int sample_rate;
int buffer_size; int quantum_size;
struct spa_list node_list; struct spa_list node_list;
}; };
@ -123,7 +124,7 @@ struct node_info {
struct spa_hook node_listener; struct spa_hook node_listener;
uint32_t sample_rate; uint32_t sample_rate;
uint32_t buffer_size; uint32_t quantum_size;
struct spa_list links; struct spa_list links;
}; };
@ -314,25 +315,25 @@ static void reconfigure_session(struct session *sess)
{ {
struct node_info *ni; struct node_info *ni;
struct impl *impl = sess->impl; struct impl *impl = sess->impl;
uint32_t buffer_size = MAX_BUFFER_SIZE; uint32_t quantum_size = MAX_QUANTUM_SIZE;
spa_list_for_each(ni, &sess->node_list, l) { spa_list_for_each(ni, &sess->node_list, l) {
if (ni->buffer_size > 0) if (ni->quantum_size > 0)
buffer_size = SPA_MIN(buffer_size, ni->buffer_size); quantum_size = SPA_MIN(quantum_size, ni->quantum_size);
} }
if (spa_list_is_empty(&sess->node_list)) { if (spa_list_is_empty(&sess->node_list)) {
sess->exclusive = false; sess->exclusive = false;
sess->busy = false; sess->busy = false;
} }
sess->buffer_size = buffer_size; sess->quantum_size = quantum_size;
sess->node->rt.quantum->rate.num = 1; sess->node->rt.quantum->rate.num = 1;
sess->node->rt.quantum->rate.denom = sess->sample_rate; sess->node->rt.quantum->rate.denom = sess->sample_rate;
sess->node->rt.quantum->size = sess->buffer_size; sess->node->rt.quantum->size = sess->quantum_size;
pw_log_info("module %p: driver node:%p quantum:%d/%d", pw_log_info("module %p: driver node:%p quantum:%d/%d",
impl, sess->node, sess->sample_rate, buffer_size); impl, sess->node, sess->sample_rate, quantum_size);
} }
static void node_info_destroy(void *data) static void node_info_destroy(void *data)
@ -461,7 +462,7 @@ static int handle_autoconnect(struct impl *impl, struct pw_node *node,
enum pw_direction direction; enum pw_direction direction;
struct session *session; struct session *session;
struct node_info *info; struct node_info *info;
uint32_t sample_rate, buffer_size; uint32_t sample_rate, quantum_size;
int res; int res;
str = pw_properties_get(props, PW_NODE_PROP_AUTOCONNECT); str = pw_properties_get(props, PW_NODE_PROP_AUTOCONNECT);
@ -526,13 +527,13 @@ static int handle_autoconnect(struct impl *impl, struct pw_node *node,
session = find.sess; session = find.sess;
sample_rate = session->sample_rate; sample_rate = session->sample_rate;
buffer_size = session->buffer_size; quantum_size = session->quantum_size;
if ((str = pw_properties_get(props, "node.latency")) != NULL) { if ((str = pw_properties_get(props, "node.latency")) != NULL) {
uint32_t num, denom; uint32_t num, denom;
pw_log_info("module %p: '%s'", impl, str); pw_log_info("module %p: '%s'", impl, str);
if (sscanf(str, "%u/%u", &num, &denom) == 2 && denom != 0) { if (sscanf(str, "%u/%u", &num, &denom) == 2 && denom != 0) {
buffer_size = flp2((num * sample_rate / denom) * sizeof(float)); quantum_size = flp2((num * sample_rate / denom));
} }
} }
@ -570,7 +571,7 @@ static int handle_autoconnect(struct impl *impl, struct pw_node *node,
info->session = session; info->session = session;
info->node = node; info->node = node;
info->sample_rate = sample_rate; info->sample_rate = sample_rate;
info->buffer_size = buffer_size; info->quantum_size = quantum_size;
spa_list_init(&info->links); spa_list_init(&info->links);
spa_list_append(&session->node_list, &info->l); spa_list_append(&session->node_list, &info->l);
@ -759,7 +760,7 @@ static int on_global(void *data, struct pw_global *global)
direction, direction,
channels, channels,
rate, rate,
MAX_BUFFER_SIZE, MAX_QUANTUM_SIZE * sizeof(float),
0); 0);
if (dsp == NULL) if (dsp == NULL)
return 0; return 0;
@ -772,7 +773,7 @@ static int on_global(void *data, struct pw_global *global)
sess->dsp = dsp; sess->dsp = dsp;
sess->dsp_port = dsp_port; sess->dsp_port = dsp_port;
sess->sample_rate = rate; sess->sample_rate = rate;
sess->buffer_size = MAX_BUFFER_SIZE; sess->quantum_size = MAX_QUANTUM_SIZE;
sess->enabled = true; sess->enabled = true;
pw_node_register(dsp, NULL, pw_module_get_global(impl->module), NULL); pw_node_register(dsp, NULL, pw_module_get_global(impl->module), NULL);

View file

@ -1034,7 +1034,7 @@ int pw_stream_get_time(struct pw_stream *stream, struct pw_time *time)
q = impl->node->rt.quantum; q = impl->node->rt.quantum;
time->now = q->nsec; time->now = q->nsec;
time->ticks = q->position / sizeof(float); time->ticks = q->position;
time->rate = q->rate; time->rate = q->rate;
return 0; return 0;