/* * check if we can disconnect a src machine from a sink while playing. */ static void test_bt_setup_dynamic_rem_src (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = (BtSetup *) check_gobject_get_object_property (song, "setup"); BtSequence *sequence = (BtSequence *) check_gobject_get_object_property (song, "sequence"); BtMachine *sink = BT_MACHINE (bt_sink_machine_new (song, "master", NULL)); BtMachine *gen1 = BT_MACHINE (bt_source_machine_new (song, "gen1", "audiotestsrc", 0L, NULL)); BtMachine *gen2 = BT_MACHINE (bt_source_machine_new (song, "gen2", "audiotestsrc", 0L, NULL)); bt_wire_new (song, gen1, sink, NULL); BtWire *wire2 = bt_wire_new (song, gen2, sink, NULL); GstElement *element1 = (GstElement *) check_gobject_get_object_property (gen1, "machine"); GstElement *element2 = (GstElement *) check_gobject_get_object_property (gen2, "machine"); g_object_set (sequence, "length", 64L, "loop", TRUE, NULL); bt_sequence_add_track (sequence, gen1, -1); bt_sequence_add_track (sequence, gen2, -1); g_object_set (element1, "wave", /* silence */ 4, NULL); g_object_set (element2, "wave", /* silence */ 4, NULL); bt_machine_set_param_defaults (gen1); bt_machine_set_param_defaults (gen2); mark_point (); /* play the song */ if (bt_song_play (song)) { mark_point (); check_run_main_loop_until_playing_or_error (song); GST_DEBUG ("song plays"); /* unlink machines */ bt_setup_remove_wire (setup, wire2); GST_DEBUG ("wire removed"); g_usleep (G_USEC_PER_SEC / 10); /* stop the song */ bt_song_stop (song); } else { fail ("playing of song failed"); } GST_INFO ("-- cleanup --"); g_object_unref (setup); g_object_unref (sequence); BT_TEST_END; }
static void run_main_loop_until_eos (void) { GstElement *bin = (GstElement *) check_gobject_get_object_property (song, "bin"); GMainLoop *main_loop = g_main_loop_new (NULL, FALSE); GstBus *bus = gst_element_get_bus (bin); gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH); g_signal_connect (bus, "message::error", G_CALLBACK (message_received), (gpointer) main_loop); g_signal_connect (bus, "message::eos", G_CALLBACK (message_received), (gpointer) main_loop); gst_object_unref (bus); gst_object_unref (bin); // workaround for some muxers not accepting the seek and thus not going to eos // poll playback position 10 times a second // TODO(ensonic): fixed in 1.0? // basesrc elements do post EOS old_pos = -1; old_playing = FALSE; g_signal_connect (song, "notify::play-pos", G_CALLBACK (on_song_play_pos_notify), (gpointer) main_loop); g_signal_connect (song, "notify::is-playing", G_CALLBACK (on_song_is_playing_notify), (gpointer) main_loop); guint update_id = g_timeout_add_full (G_PRIORITY_HIGH, 1000 / 10, on_song_playback_update, NULL, NULL); bt_song_update_playback_position (song); GST_INFO ("running main_loop"); g_main_loop_run (main_loop); GST_INFO ("finished main_loop"); g_source_remove (update_id); }
static void test_bt_machine_unbind_parameter_controls (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtMachine *machine = BT_MACHINE (bt_source_machine_new (song, "id", "buzztrax-test-mono-source", 0, NULL)); GstObject *element = (GstObject *) check_gobject_get_object_property (machine, "machine"); BtParameterGroup *pg = bt_machine_get_global_param_group (machine); BtIcControl *control = btic_device_get_control_by_name (device, "abs1"); g_object_set (element, "g-uint", 10, NULL); bt_machine_bind_parameter_control (machine, element, "g-uint", control, pg); g_object_set (control, "value", 0, NULL); GST_INFO ("-- act --"); bt_machine_unbind_parameter_controls (machine); g_object_set (control, "value", 100, NULL); GST_INFO ("-- assert --"); ck_assert_gobject_guint_eq (element, "g-uint", 0); GST_INFO ("-- cleanup --"); gst_object_unref (element); g_object_unref (control); BT_TEST_END; }
static void test_setup (void) { app = bt_test_application_new (); settings = bt_settings_make (); song = bt_song_new (app); setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); minv = G_MAXFLOAT; maxv = -G_MAXFLOAT; }
static GstElement * get_sink_bin (void) { BtMachine *machine = bt_setup_get_machine_by_type (setup, BT_TYPE_SINK_MACHINE); GstElement *sink_bin = GST_ELEMENT (check_gobject_get_object_property (machine, "machine")); g_object_try_unref (machine); return sink_bin; }
static void test_bt_machine_state_not_overridden (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSequence *sequence = (BtSequence *) check_gobject_get_object_property (song, "sequence"); BtSongInfo *song_info = BT_SONG_INFO (check_gobject_get_object_property (song, "song-info")); BtMachine *src = BT_MACHINE (bt_source_machine_new (song, "gen", "simsyn", 0L, NULL)); BtMachine *sink = BT_MACHINE (bt_sink_machine_new (song, "sink", NULL)); bt_wire_new (song, src, sink, NULL); BtCmdPattern *pattern = bt_cmd_pattern_new (song, src, BT_PATTERN_CMD_SOLO); GstElement *element = (GstElement *) check_gobject_get_object_property (src, "machine"); /* duration: 0:00:00.480000000 */ g_object_set (song_info, "bpm", 250L, "tpb", 16L, NULL); g_object_set (sequence, "length", 32L, NULL); bt_sequence_add_track (sequence, src, -1); bt_sequence_set_pattern (sequence, 4, 0, pattern); g_object_set (element, "wave", /* silence */ 4, NULL); GST_INFO ("-- act --"); g_object_set (src, "state", BT_MACHINE_STATE_MUTE, NULL); bt_machine_update_default_state_value (src); bt_song_play (song); check_run_main_loop_until_eos_or_error (song); GST_INFO ("-- assert --"); ck_assert_gobject_guint_eq (src, "state", BT_MACHINE_STATE_MUTE); GST_INFO ("-- cleanup --"); gst_object_unref (element); g_object_unref (pattern); g_object_unref (sequence); g_object_unref (song_info); BT_TEST_END; }
static void make_new_song (gint wave) { BtSequence *sequence = (BtSequence *) check_gobject_get_object_property (song, "sequence"); BtMachine *sink = BT_MACHINE (bt_sink_machine_new (song, "master", NULL)); BtMachine *gen = BT_MACHINE (bt_source_machine_new (song, "gen", "audiotestsrc", 0L, NULL)); BtParameterGroup *pg = bt_machine_get_global_param_group (gen); bt_wire_new (song, gen, sink, NULL); BtPattern *pattern = bt_pattern_new (song, "pattern-name", 8L, gen); GstElement *element = (GstElement *) check_gobject_get_object_property (gen, "machine"); BtSongInfo *song_info = (BtSongInfo *) check_gobject_get_object_property (song, "song-info"); gulong bpm = check_gobject_get_ulong_property (song_info, "bpm"); gulong tpb = check_gobject_get_ulong_property (song_info, "tpb"); // figure a good block size for the current tempo gint samples_per_buffer = (44100.0 * 60.0) / (bpm * tpb); g_object_set (sequence, "length", 4L, "loop", FALSE, NULL); bt_sequence_add_track (sequence, gen, -1); bt_sequence_set_pattern (sequence, 0, 0, (BtCmdPattern *) pattern); g_object_set (element, "wave", wave, "volume", 1.0, "samplesperbuffer", samples_per_buffer, NULL); bt_parameter_group_set_param_default (pg, bt_parameter_group_get_param_index (pg, "wave")); bt_parameter_group_set_param_default (pg, bt_parameter_group_get_param_index (pg, "volume")); gst_object_unref (element); g_object_unref (song_info); g_object_unref (pattern); g_object_unref (sequence); GST_INFO (" song created"); }
static void test_bt_setup_new (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); GST_INFO ("-- act --"); GList *machines, *wires; g_object_get (G_OBJECT (setup), "machines", &machines, "wires", &wires, NULL); GST_INFO ("-- assert --"); fail_unless (machines == NULL, NULL); fail_unless (wires == NULL, NULL); GST_INFO ("-- cleanup --"); g_object_unref (setup); BT_TEST_END; }
static void test_bt_setup_machine_add_id (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); GST_INFO ("-- act --"); BtMachine *source = BT_MACHINE (bt_source_machine_new (song, "src", "buzztrax-test-mono-source", 0, NULL)); GST_INFO ("-- assert --"); ck_assert_gobject_eq_and_unref (bt_setup_get_machine_by_id (setup, "src"), source); GST_INFO ("-- cleanup --"); g_object_unref (setup); BT_TEST_END; }
static void test_bt_song_info_tick_to_time (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSongInfo *song_info = BT_SONG_INFO (check_gobject_get_object_property (song, "song-info")); g_object_set (song_info, "bpm", 250L, "tpb", 16L, NULL); GST_INFO ("-- act --"); GstClockTime ts = bt_song_info_tick_to_time (song_info, 8); GST_INFO ("-- assert --"); ck_assert_int_eq (ts, 120 * GST_MSECOND); GST_INFO ("-- cleanup --"); g_object_unref (song_info); BT_TEST_END; }
static void test_bt_song_info_date_stamps (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSongInfo *song_info = BT_SONG_INFO (check_gobject_get_object_property (song, "song-info")); GST_INFO ("-- act --"); gchar *create_dts = check_gobject_get_str_property (song_info, "create-dts"); GST_INFO ("-- assert --"); fail_unless (create_dts != NULL, NULL); ck_assert_gobject_str_eq (song_info, "change-dts", create_dts); GST_INFO ("-- cleanup --"); g_free (create_dts); g_object_unref (song_info); BT_TEST_END; }
static void test_bt_song_info_seconds_since_last_saved (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSongInfo *song_info = BT_SONG_INFO (check_gobject_get_object_property (song, "song-info")); GST_INFO ("-- act --"); // TODO: waiting one sec makes this the slowest test :/ g_usleep (G_USEC_PER_SEC); gint ts = bt_song_info_get_seconds_since_last_saved (song_info); GST_INFO ("-- assert --"); ck_assert_int_gt (ts, 0); GST_INFO ("-- cleanup --"); g_object_unref (song_info); BT_TEST_END; }
static void test_bt_machine_check_voices (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GST_INFO ("-- act --"); BtMachine *machine = BT_MACHINE (bt_source_machine_new (song, "gen", "buzztrax-test-poly-source", 2L, NULL)); GST_INFO ("-- assert --"); GstChildProxy *element = (GstChildProxy *) check_gobject_get_object_property (machine, "machine"); ck_assert_int_eq (gst_child_proxy_get_children_count (element), 2); //ck_assert_gobject_gulong_eq(machine,"voices",2); GST_INFO ("-- cleanup --"); gst_object_unref (element); BT_TEST_END; }
gboolean check_run_main_loop_until_msg_or_error (BtSong * song, const gchar * msg) { GstStateChangeReturn sret; GstState state, pending; GMainLoop *main_loop = g_main_loop_new (NULL, FALSE); GstElement *bin = (GstElement *) check_gobject_get_object_property (song, "bin"); GstBus *bus = gst_element_get_bus (bin); gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH); g_signal_connect (bus, "message::error", G_CALLBACK (_check_message_received), (gpointer) main_loop); g_signal_connect (bus, msg, G_CALLBACK (_check_message_received), (gpointer) main_loop); _check_run_main_loop_error = FALSE; sret = gst_element_get_state (bin, &state, &pending, G_GUINT64_CONSTANT (0)); // be careful to not run this when the song already finished if (sret != GST_STATE_CHANGE_FAILURE) { GST_INFO_OBJECT (song, "running main_loop: sret=%s, state=%s/%s", gst_element_state_change_return_get_name (sret), gst_element_state_get_name (state), gst_element_state_get_name (pending)); g_main_loop_run (main_loop); } else { GST_INFO_OBJECT (song, "skipping main_loop: sret=%s, state=%s/%s", gst_element_state_change_return_get_name (sret), gst_element_state_get_name (state), gst_element_state_get_name (pending)); } gst_bus_remove_signal_watch (bus); g_signal_handlers_disconnect_matched (bus, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) main_loop); gst_object_unref (bus); gst_object_unref (bin); g_main_loop_unref (main_loop); GST_INFO_OBJECT (song, "finished main_loop"); return sret == GST_STATE_CHANGE_FAILURE ? FALSE : !_check_run_main_loop_error; }
/* * In this test case we check the _unique_id function. */ static void test_bt_setup_unique_machine_id1 (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); bt_source_machine_new (song, "src", "buzztrax-test-mono-source", 0, NULL); GST_INFO ("-- act --"); gchar *id = bt_setup_get_unique_machine_id (setup, "src"); GST_INFO ("-- assert --"); fail_unless (id != NULL, NULL); ck_assert_gobject_eq_and_unref (bt_setup_get_machine_by_id (setup, id), NULL); ck_assert_str_ne (id, "src"); GST_INFO ("-- cleanup --"); g_free (id); g_object_unref (setup); BT_TEST_END; }
/* * In this example you can see, how we get a source machine back by its type. */ static void test_bt_setup_machine_type (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); BtMachine *source = BT_MACHINE (bt_source_machine_new (song, "src", "buzztrax-test-mono-source", 0, NULL)); GST_INFO ("-- act --"); BtMachine *machine = bt_setup_get_machine_by_type (setup, BT_TYPE_SOURCE_MACHINE); GST_INFO ("-- assert --"); fail_unless (machine == source, NULL); GST_INFO ("-- cleanup --"); g_object_unref (machine); g_object_unref (setup); BT_TEST_END; }
static void test_bt_song_info_update_tpb (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstClockTime t1, t2; BtSongInfo *song_info = BT_SONG_INFO (check_gobject_get_object_property (song, "song-info")); g_object_set (song_info, "tpb", 8, NULL); g_object_get (song_info, "tick-duration", &t1, NULL); GST_INFO ("-- act --"); g_object_set (song_info, "tpb", 4, NULL); g_object_get (song_info, "tick-duration", &t2, NULL); GST_INFO ("-- assert --"); ck_assert_uint64_eq (t2, t1 + t1); GST_INFO ("-- cleanup --"); g_object_unref (song_info); BT_TEST_END; }
static void test_bt_setup_machine_add_updates_list (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); BtMachine *source = BT_MACHINE (bt_source_machine_new (song, "src", "buzztrax-test-mono-source", 0, NULL)); GST_INFO ("-- act --"); GList *list = (GList *) check_gobject_get_ptr_property (setup, "machines"); GST_INFO ("-- assert --"); fail_unless (list != NULL, NULL); ck_assert_int_eq (g_list_length (list), 1); fail_unless ((BtMachine *) list->data == source, NULL); GST_INFO ("-- cleanup --"); g_list_free (list); g_object_unref (setup); BT_TEST_END; }
static void test_bt_setup_wire_rem_machine_id (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); BtMachine *source = BT_MACHINE (bt_source_machine_new (song, "src", "buzztrax-test-mono-source", 0, NULL)); BtMachine *sink = BT_MACHINE (bt_sink_machine_new (song, "sink", NULL)); BtWire *wire = bt_wire_new (song, source, sink, NULL); GST_INFO ("-- act --"); bt_setup_remove_wire (setup, wire); GST_INFO ("-- assert --"); ck_assert_gobject_eq_and_unref (bt_setup_get_wire_by_src_machine (setup, source), NULL); GST_INFO ("-- cleanup --"); g_object_unref (setup); BT_TEST_END; }
/* test master volume, using appsink? */ static void test_bt_sink_bin_master_volume (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); gdouble volume = 1.0 / (gdouble) _i; g_object_set (settings, "audiosink", "fakesink", NULL); make_new_song ( /*square */ 1); BtMachine *machine = bt_setup_get_machine_by_type (setup, BT_TYPE_SINK_MACHINE); GstElement *sink_bin = GST_ELEMENT (check_gobject_get_object_property (machine, "machine")); BtParameterGroup *pg = bt_machine_get_global_param_group (machine); gst_element_set_state (sink_bin, GST_STATE_READY); GstElement *fakesink = get_sink_element ((GstBin *) sink_bin); g_object_set (fakesink, "signal-handoffs", TRUE, NULL); g_signal_connect (fakesink, "preroll-handoff", (GCallback) handoff_buffer_cb, NULL); g_signal_connect (fakesink, "handoff", (GCallback) handoff_buffer_cb, NULL); GST_INFO ("-- act --"); g_object_set (sink_bin, "master-volume", volume, NULL); bt_parameter_group_set_param_default (pg, bt_parameter_group_get_param_index (pg, "master-volume")); bt_song_play (song); run_main_loop_until_eos (); GST_INFO ("-- assert --"); GST_INFO ("minv=%7.4lf, maxv=%7.4lf", minv, maxv); ck_assert_float_eq (maxv, +volume); ck_assert_float_eq (minv, -volume); GST_INFO ("-- cleanup --"); bt_song_stop (song); gst_object_unref (sink_bin); g_object_try_unref (machine); BT_TEST_END; }
static void test_bt_machine_set_defaults (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtMachine *machine = BT_MACHINE (bt_source_machine_new (song, "id", "buzztrax-test-mono-source", 0, NULL)); GstObject *element = (GstObject *) check_gobject_get_object_property (machine, "machine"); GstControlBinding *cb = gst_object_get_control_binding (element, "g-uint"); g_object_set (element, "g-uint", 10, NULL); GST_INFO ("-- act --"); bt_machine_set_param_defaults (machine); GST_INFO ("-- assert --"); GValue *val = gst_control_binding_get_value (cb, G_GUINT64_CONSTANT (0)); guint uval = g_value_get_uint (val); ck_assert_int_eq (uval, 10); GST_INFO ("-- cleanup --"); gst_object_unref (element); BT_TEST_END; }
static void test_bt_setup_wire_add_dst_list (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); BtSetup *setup = BT_SETUP (check_gobject_get_object_property (song, "setup")); BtMachine *source = BT_MACHINE (bt_source_machine_new (song, "src", "buzztrax-test-mono-source", 0, NULL)); BtMachine *sink = BT_MACHINE (bt_sink_machine_new (song, "sink", NULL)); BtWire *wire = bt_wire_new (song, source, sink, NULL); GST_INFO ("-- act --"); GList *list = bt_setup_get_wires_by_dst_machine (setup, sink); GST_INFO ("-- assert --"); fail_unless (list != NULL, NULL); ck_assert_int_eq (g_list_length (list), 1); ck_assert_gobject_eq_and_unref (BT_WIRE (g_list_first (list)->data), wire); GST_INFO ("-- cleanup --"); g_list_free (list); g_object_unref (setup); BT_TEST_END; }