GstController: ============== Implementation: --------------- Ideas and plans: - Deprecate control-rate property and add a control-period property that does the same and is named appropriately. Damn confusing names. - gst_object_suggest_next_sync() will not be used at all anymore. Note this in the docs and explain correct usage in elements. - Optimize get_value_array() functions to not just call get() but be a bit more intelligent. - Optimize trigger interpolator's get_value_array() to set trigger if a requested value's timestamp is before the trigger timestamp and this timestamp + sample period is after the trigger timestamp. - Get tempo interface in base (or core?) and have it modify the control rate to get expected results. - ? Let get_value_array() sample the values with control-period if the given sample_interval is zero ? Usage in elements: ------------------ - In the beginning of the processing loop call gst_object_sync_values() with the current timestamp. - Convert the controller's control-period property into frames/samples and request values sampled with control-period to apply one value to each control-period frames/samples. - Update controlled GObject properties with the last values, i.e. call gst_object_sync_values() with the end timestamp. - ! The user has to choose a good control-period to prevent two trigger timestamps separated by less than control-period nanoseconds. code: FIXME: can this be simplified? bugs in corner cases? [...] GstController ctrl = gst_object_get_controller (self); GstValueArray prop1; prop1.property_name = "prop1"; if (ctrl) { gst_controller_sync_values (ctrl, GST_BUFFER_TIMESTAMP); samples_per_period = control-period / sample-rate; nvalues = num_samples / samples_per_period; prop1.nbsamples = nvalues; prop1.sample_interval = control-period; prop1.values = g_new (type, nvalues); gst_controller_get_value_array (ctrl, GST_BUFFER_TIMESTAMP, &prop1); } else { prop1.values = &self->prop1; samples_per_period = num_samples; } [...] for (i = 0; i < num_samples; i++) { prop1_val = prop1.values[i / samples_per_period]; process(); } [...] if (ctrl) { gst_controller_sync_values (ctrl, GST_BUFFER_TIMESTAMP + GST_BUFFER_DURATION); g_free (prop1.values); }