bs2b: implement the preset interface
Instead of a preset property implement the preset interface in a read-only fashion.
This commit is contained in:
parent
4a4fd5e968
commit
b533ad8502
@ -18,7 +18,6 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:element-bs2b
|
* SECTION:element-bs2b
|
||||||
*
|
*
|
||||||
@ -71,23 +70,37 @@ enum
|
|||||||
{
|
{
|
||||||
PROP_FCUT = 1,
|
PROP_FCUT = 1,
|
||||||
PROP_FEED,
|
PROP_FEED,
|
||||||
PROP_PRESET,
|
|
||||||
PROP_LAST,
|
PROP_LAST,
|
||||||
};
|
};
|
||||||
|
|
||||||
static GParamSpec *properties[PROP_LAST];
|
static GParamSpec *properties[PROP_LAST];
|
||||||
|
|
||||||
enum
|
typedef struct
|
||||||
{
|
{
|
||||||
PRESET_DEFAULT,
|
const gchar *name;
|
||||||
PRESET_CMOY,
|
const gchar *desc;
|
||||||
PRESET_JMEIER,
|
gint preset;
|
||||||
PRESET_NONE
|
} GstBs2bPreset;
|
||||||
|
|
||||||
|
static GstBs2bPreset presets[3] = {
|
||||||
|
{
|
||||||
|
"default",
|
||||||
|
"Closest to virtual speaker placement (30°, 3 meter) [700Hz, 4.5dB]",
|
||||||
|
BS2B_DEFAULT_CLEVEL},
|
||||||
|
{
|
||||||
|
"cmoy",
|
||||||
|
"Close to Chu Moy's crossfeeder (popular) [700Hz, 6.0dB]",
|
||||||
|
BS2B_CMOY_CLEVEL},
|
||||||
|
{
|
||||||
|
"jmeier",
|
||||||
|
"Close to Jan Meier's CORDA amplifiers (little change) [650Hz, 9.0dB]",
|
||||||
|
BS2B_JMEIER_CLEVEL}
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (GstBs2b, gst_bs2b, GST_TYPE_AUDIO_FILTER);
|
static void gst_preset_interface_init (gpointer g_iface, gpointer iface_data);
|
||||||
|
|
||||||
static GType gst_bs2b_preset_get_type (void);
|
G_DEFINE_TYPE_WITH_CODE (GstBs2b, gst_bs2b, GST_TYPE_AUDIO_FILTER,
|
||||||
|
G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, gst_preset_interface_init));
|
||||||
|
|
||||||
static void gst_bs2b_set_property (GObject * object, guint prop_id,
|
static void gst_bs2b_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec);
|
const GValue * value, GParamSpec * pspec);
|
||||||
@ -100,6 +113,83 @@ static GstFlowReturn gst_bs2b_transform_inplace (GstBaseTransform *
|
|||||||
static gboolean gst_bs2b_setup (GstAudioFilter * self,
|
static gboolean gst_bs2b_setup (GstAudioFilter * self,
|
||||||
const GstAudioInfo * audio_info);
|
const GstAudioInfo * audio_info);
|
||||||
|
|
||||||
|
static gchar **
|
||||||
|
gst_bs2b_get_preset_names (GstPreset * preset)
|
||||||
|
{
|
||||||
|
gchar **names;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
names = g_new (gchar *, 1 + G_N_ELEMENTS (presets));
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (presets); i++) {
|
||||||
|
names[i] = g_strdup (presets[i].name);
|
||||||
|
}
|
||||||
|
names[i] = NULL;
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar **
|
||||||
|
gst_bs2b_get_property_names (GstPreset * preset)
|
||||||
|
{
|
||||||
|
gchar **names = g_new (gchar *, 3);
|
||||||
|
|
||||||
|
names[0] = g_strdup ("fcut");
|
||||||
|
names[1] = g_strdup ("feed");
|
||||||
|
names[2] = NULL;
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_bs2b_load_preset (GstPreset * preset, const gchar * name)
|
||||||
|
{
|
||||||
|
GstBs2b *element = GST_BS2B (preset);
|
||||||
|
GObject *object = (GObject *) preset;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (presets); i++) {
|
||||||
|
if (!g_strcmp0 (presets[i].name, name)) {
|
||||||
|
bs2b_set_level (element->bs2bdp, presets[i].preset);
|
||||||
|
g_object_notify_by_pspec (object, properties[PROP_FCUT]);
|
||||||
|
g_object_notify_by_pspec (object, properties[PROP_FEED]);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_bs2b_get_meta (GstPreset * preset, const gchar * name,
|
||||||
|
const gchar * tag, gchar ** value)
|
||||||
|
{
|
||||||
|
if (!g_strcmp0 (tag, "comment")) {
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (presets); i++) {
|
||||||
|
if (!g_strcmp0 (presets[i].name, name)) {
|
||||||
|
*value = g_strdup (presets[i].desc);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*value = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_preset_interface_init (gpointer g_iface, gpointer iface_data)
|
||||||
|
{
|
||||||
|
GstPresetInterface *iface = g_iface;
|
||||||
|
|
||||||
|
iface->get_preset_names = gst_bs2b_get_preset_names;
|
||||||
|
iface->get_property_names = gst_bs2b_get_property_names;
|
||||||
|
|
||||||
|
iface->load_preset = gst_bs2b_load_preset;
|
||||||
|
iface->save_preset = NULL;
|
||||||
|
iface->rename_preset = NULL;
|
||||||
|
iface->delete_preset = NULL;
|
||||||
|
|
||||||
|
iface->get_meta = gst_bs2b_get_meta;
|
||||||
|
iface->set_meta = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_bs2b_class_init (GstBs2bClass * klass)
|
gst_bs2b_class_init (GstBs2bClass * klass)
|
||||||
@ -129,11 +219,6 @@ gst_bs2b_class_init (GstBs2bClass * klass)
|
|||||||
BS2B_MINFEED, BS2B_MAXFEED, BS2B_DEFAULT_CLEVEL >> 16,
|
BS2B_MINFEED, BS2B_MAXFEED, BS2B_DEFAULT_CLEVEL >> 16,
|
||||||
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS);
|
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
properties[PROP_PRESET] =
|
|
||||||
g_param_spec_enum ("preset", "Preset", "Bs2b filter preset",
|
|
||||||
gst_bs2b_preset_get_type (), PRESET_DEFAULT,
|
|
||||||
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, PROP_LAST, properties);
|
g_object_class_install_properties (gobject_class, PROP_LAST, properties);
|
||||||
|
|
||||||
gst_element_class_set_metadata (element_class,
|
gst_element_class_set_metadata (element_class,
|
||||||
@ -274,38 +359,6 @@ gst_bs2b_transform_inplace (GstBaseTransform * base_transform,
|
|||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GType
|
|
||||||
gst_bs2b_preset_get_type (void)
|
|
||||||
{
|
|
||||||
static GType bs2b_preset_type = 0;
|
|
||||||
|
|
||||||
if (!bs2b_preset_type) {
|
|
||||||
static GEnumValue types[] = {
|
|
||||||
{
|
|
||||||
PRESET_DEFAULT,
|
|
||||||
"Closest to virtual speaker placement (30°, 3 meter) [700Hz, 4.5dB]",
|
|
||||||
"default"},
|
|
||||||
{
|
|
||||||
PRESET_CMOY,
|
|
||||||
"Close to Chu Moy's crossfeeder (popular) [700Hz, 6.0dB]",
|
|
||||||
"cmoy"},
|
|
||||||
{
|
|
||||||
PRESET_JMEIER,
|
|
||||||
"Close to Jan Meier's CORDA amplifiers (little change) [650Hz, 9.0dB]",
|
|
||||||
"jmeier"},
|
|
||||||
{
|
|
||||||
PRESET_NONE,
|
|
||||||
"No preset",
|
|
||||||
"none"},
|
|
||||||
{0, NULL, NULL},
|
|
||||||
};
|
|
||||||
|
|
||||||
bs2b_preset_type = g_enum_register_static ("GstBs2bPreset", types);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bs2b_preset_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_bs2b_set_property (GObject * object, guint prop_id,
|
gst_bs2b_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
@ -318,41 +371,12 @@ gst_bs2b_set_property (GObject * object, guint prop_id,
|
|||||||
bs2b_set_level_fcut (element->bs2bdp, g_value_get_int (value));
|
bs2b_set_level_fcut (element->bs2bdp, g_value_get_int (value));
|
||||||
bs2b_clear (element->bs2bdp);
|
bs2b_clear (element->bs2bdp);
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
GST_BS2B_DP_UNLOCK (element);
|
||||||
g_object_notify_by_pspec (object, properties[PROP_PRESET]);
|
|
||||||
break;
|
break;
|
||||||
case PROP_FEED:
|
case PROP_FEED:
|
||||||
GST_BS2B_DP_LOCK (element);
|
GST_BS2B_DP_LOCK (element);
|
||||||
bs2b_set_level_feed (element->bs2bdp, g_value_get_int (value));
|
bs2b_set_level_feed (element->bs2bdp, g_value_get_int (value));
|
||||||
bs2b_clear (element->bs2bdp);
|
bs2b_clear (element->bs2bdp);
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
GST_BS2B_DP_UNLOCK (element);
|
||||||
g_object_notify_by_pspec (object, properties[PROP_PRESET]);
|
|
||||||
break;
|
|
||||||
case PROP_PRESET:
|
|
||||||
switch (g_value_get_enum (value)) {
|
|
||||||
case PRESET_DEFAULT:
|
|
||||||
GST_BS2B_DP_LOCK (element);
|
|
||||||
bs2b_set_level (element->bs2bdp, BS2B_DEFAULT_CLEVEL);
|
|
||||||
bs2b_clear (element->bs2bdp);
|
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
|
||||||
break;
|
|
||||||
case PRESET_CMOY:
|
|
||||||
GST_BS2B_DP_LOCK (element);
|
|
||||||
bs2b_set_level (element->bs2bdp, BS2B_CMOY_CLEVEL);
|
|
||||||
bs2b_clear (element->bs2bdp);
|
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
|
||||||
break;
|
|
||||||
case PRESET_JMEIER:
|
|
||||||
GST_BS2B_DP_LOCK (element);
|
|
||||||
bs2b_set_level (element->bs2bdp, BS2B_JMEIER_CLEVEL);
|
|
||||||
bs2b_clear (element->bs2bdp);
|
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_object_notify_by_pspec (object, properties[PROP_FCUT]);
|
|
||||||
g_object_notify_by_pspec (object, properties[PROP_FEED]);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
@ -377,24 +401,6 @@ gst_bs2b_get_property (GObject * object, guint prop_id, GValue * value,
|
|||||||
g_value_set_int (value, bs2b_get_level_feed (element->bs2bdp));
|
g_value_set_int (value, bs2b_get_level_feed (element->bs2bdp));
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
GST_BS2B_DP_UNLOCK (element);
|
||||||
break;
|
break;
|
||||||
case PROP_PRESET:
|
|
||||||
GST_BS2B_DP_LOCK (element);
|
|
||||||
switch (bs2b_get_level (element->bs2bdp)) {
|
|
||||||
case BS2B_DEFAULT_CLEVEL:
|
|
||||||
g_value_set_enum (value, PRESET_DEFAULT);
|
|
||||||
break;
|
|
||||||
case BS2B_CMOY_CLEVEL:
|
|
||||||
g_value_set_enum (value, PRESET_CMOY);
|
|
||||||
break;
|
|
||||||
case BS2B_JMEIER_CLEVEL:
|
|
||||||
g_value_set_enum (value, PRESET_JMEIER);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_value_set_enum (value, PRESET_NONE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
GST_BS2B_DP_UNLOCK (element);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user