Ejemplo n.º 1
0
END_TEST


START_TEST(Empty_pattern_contains_silence)
{
    set_audio_rate(mixing_rates[_i]);
    setup_debug_instrument();

    set_data("album/p_manifest.json", "{}");
    set_data("album/p_tracks.json", "[0]");
    set_data("song_00/p_manifest.json", "{}");
    set_data("song_00/p_order_list.json", "[ [0, 0] ]");
    set_data("pat_000/p_manifest.json", "{}");
    set_data("pat_000/p_length.json", "[16, 0]");
    set_data("pat_000/instance_000/p_manifest.json", "{}");

    validate();

    const long expected_length = 8 * mixing_rates[_i];
    long actual_length = 0;

    kqt_Handle_play(handle, 4096);
    check_unexpected_error();
    while (!kqt_Handle_has_stopped(handle))
    {
        const long nframes = kqt_Handle_get_frames_available(handle);
        check_unexpected_error();
        actual_length += nframes;

        // Don't want to spend too much time on this...
        if (_i == MIXING_RATE_LOW)
        {
            const float* bufs[] =
            {
                kqt_Handle_get_audio(handle, 0),
                kqt_Handle_get_audio(handle, 1),
            };
            check_unexpected_error();

            float expected_buf[128] = { 0.0f };
            assert(nframes <= 128);
            check_buffers_equal(expected_buf, bufs[0], nframes, 0.0f);
            check_buffers_equal(expected_buf, bufs[1], nframes, 0.0f);
        }

        kqt_Handle_play(handle, 4096);
        check_unexpected_error();
    }

    const long nframes = kqt_Handle_get_frames_available(handle);
    check_unexpected_error();
    actual_length += nframes;

    fail_unless(actual_length == expected_length,
            "Wrong number of frames rendered"
            KT_VALUES("%ld", expected_length, actual_length));
}
Ejemplo n.º 2
0
END_TEST


START_TEST(Connect_instrument_effect_with_unconnected_dsp_and_mix)
{
    assert(handle != 0);

    pause();

    set_data("p_control_map.json", "[ [0, 0] ]");
    set_data("control_00/p_manifest.json", "{}");

    set_data("au_00/p_manifest.json", "{ \"type\": \"instrument\" }");
    set_data("au_00/out_00/p_manifest.json", "{}");
    set_data("au_00/au_01/p_manifest.json", "{ \"type\": \"effect\" }");
    set_data("au_00/au_01/in_00/p_manifest.json", "{}");
    set_data("au_00/au_01/out_00/p_manifest.json", "{}");
    set_data("au_00/au_01/proc_00/p_manifest.json", "{ \"type\": \"volume\" }");
    set_data("au_00/au_01/proc_00/in_00/p_manifest.json", "{}");
    set_data("au_00/au_01/proc_00/out_00/p_manifest.json", "{}");
    set_data("au_00/p_connections.json",
            "[ [\"au_01/out_00\", \"out_00\"] ]");

    set_data("out_00/p_manifest.json", "{}");
    set_data("p_connections.json",
            "[ [\"au_00/out_00\", \"out_00\"] ]");

    validate();

    kqt_Handle_play(handle, 128);

    return;
}
Ejemplo n.º 3
0
END_TEST


START_TEST(Paused_empty_composition_contains_silence)
{
    pause();

    kqt_Handle_play(handle, buf_len);
    check_unexpected_error();

    const long frames_available = kqt_Handle_get_frames_available(handle);
    fail_if(frames_available != buf_len,
            "kqt_Handle_play rendered %ld instead of %d frames",
            frames_available, buf_len);

    const float* ret_bufs[] =
    {
        kqt_Handle_get_audio(handle, 0),
        kqt_Handle_get_audio(handle, 1),
    };

    float expected_buf[buf_len] = { 0.0f };

    check_buffers_equal(expected_buf, ret_bufs[0], buf_len, 0.0f);
    check_buffers_equal(expected_buf, ret_bufs[1], buf_len, 0.0f);
}
Ejemplo n.º 4
0
END_TEST


START_TEST(Pattern_playback_pauses_zero_length_pattern)
{
    set_audio_rate(mixing_rates[MIXING_RATE_LOW]);
    set_mix_volume(0);
    setup_debug_instrument();
    setup_debug_single_pulse();

    set_data("album/p_manifest.json", "{}");
    set_data("album/p_tracks.json", "[0]");
    set_data("song_00/p_manifest.json", "{}");
    set_data("song_00/p_order_list.json", "[ [1, 0], [0, 0], [1, 1] ]");

    set_data("pat_000/p_manifest.json", "{}");
    set_data("pat_000/p_length.json", "[0, 0]");
    set_data("pat_000/instance_000/p_manifest.json", "{}");
    set_data("pat_000/col_00/p_triggers.json", "[ [[0, 0], [\"n+\", \"0\"]] ]");

    set_data("pat_001/p_manifest.json", "{}");
    set_data("pat_001/p_length.json", "[16, 0]");
    set_data("pat_001/instance_000/p_manifest.json", "{}");
    set_data("pat_001/instance_001/p_manifest.json", "{}");
    set_data("pat_001/col_01/p_triggers.json",
            "[ [[0, 0], [\"n+\", \"0\"]], [[1, 0], [\"n+\", \"0\"]] ]");

    validate();

    kqt_Handle_fire_event(handle, 0, "[\"cpattern\", [0, 0]]");

    float actual_buf[buf_len] = { 0.0f };
    long frames_left = buf_len;
    long buf_offset = 0;
    for (int i = 0; i < 100 && frames_left > 0; ++i)
    {
        kqt_Handle_play(handle, frames_left);
        check_unexpected_error();
        const long frames_available = kqt_Handle_get_frames_available(handle);
        const float* ret_buf = kqt_Handle_get_audio(handle, 0);
        check_unexpected_error();
        memcpy(actual_buf + buf_offset,
                ret_buf,
                (size_t)frames_available * sizeof(float));

        buf_offset += frames_available;
        frames_left -= frames_available;
    }

    fail_if(frames_left == buf_len,
            "Pattern playback of zero-length pattern produces no audio");

    float expected_buf[buf_len] = { 0.0f };
    expected_buf[0] = 1.0f;

    check_buffers_equal(expected_buf, actual_buf, buf_len, 0.0f);
}
Ejemplo n.º 5
0
END_TEST


START_TEST(Query_voice_count_with_note)
{
    set_audio_rate(220);
    setup_debug_instrument();
    pause();

    kqt_Handle_fire_event(handle, 0, Note_On_55_Hz);
    kqt_Handle_play(handle, 1);
    kqt_Handle_fire_event(handle, 0, "[\"qvoices\", null]");

    const char* events2 = kqt_Handle_receive_events(handle);
    const char* expected2 = "[[0, [\"qvoices\", null]], [0, [\"Avoices\", 2]]]";

    fail_if(strcmp(events2, expected2) != 0,
            "Received event list %s instead of %s", events2, expected2);

    kqt_Handle_play(handle, 2048);
    kqt_Handle_fire_event(handle, 0, "[\"qvoices\", null]");

    const char* events1 = kqt_Handle_receive_events(handle);
    const char* expected1 = "[[0, [\"qvoices\", null]], [0, [\"Avoices\", 1]]]";

    fail_if(strcmp(events1, expected1) != 0,
            "Received event list %s instead of %s", events1, expected1);

    kqt_Handle_play(handle, 1);
    kqt_Handle_fire_event(handle, 0, "[\"qvoices\", null]");

    const char* events0 = kqt_Handle_receive_events(handle);
    const char* expected0 = "[[0, [\"qvoices\", null]], [0, [\"Avoices\", 0]]]";

    fail_if(strcmp(events0, expected0) != 0,
            "Received event list %s instead of %s", events0, expected0);
}
Ejemplo n.º 6
0
END_TEST


START_TEST(Fire_with_complex_bind_can_be_processed_with_multiple_receives)
{
    set_mix_volume(0);
    setup_debug_instrument();
    setup_debug_single_pulse();

    const int event_count = 2048;
    setup_complex_bind(event_count);

    pause();
    kqt_Handle_fire_event(handle, 0, "[\"#\", \"\"]");
    check_unexpected_error();

    // Receive and make sure all events are found
    const char* events = kqt_Handle_receive_events(handle);
    int32_t expected = 0;
    int loop_count = 0;
    while (strcmp("[]", events) != 0)
    {
        Streader* sr = Streader_init(STREADER_AUTO, events, (int64_t)strlen(events));
        fail_if(!Streader_read_list(sr, read_received_events_bind, &expected),
                "Event list reading failed: %s",
                Streader_get_error_desc(sr));

        events = kqt_Handle_receive_events(handle);
        ++loop_count;
    }

    fail_if(loop_count <= 1,
            "Test did not fill the event buffer, increase event count!");

    fail_if(expected != event_count,
            "Read %" PRId32 " instead of %d events",
            expected, event_count);

    // Continue playing
    kqt_Handle_play(handle, 10);
    fail_if(kqt_Handle_get_frames_available(handle) != 10,
            "Kunquat handle rendered %ld instead of 10 frames",
            kqt_Handle_get_frames_available(handle));

    // FIXME: We can only check for 512 notes as we run out of voices :-P
    const float expected_buf[10] = { min((float)event_count, 512) };
    const float* actual_buf = kqt_Handle_get_audio(handle, 0);
    check_buffers_equal(expected_buf, actual_buf, 10, 0.0f);
}
Ejemplo n.º 7
0
END_TEST


START_TEST(Empty_composition_renders_zero_frames)
{
    kqt_Handle_play(handle, 256);
    check_unexpected_error();

    const long nframes = kqt_Handle_get_frames_available(handle);

    fail_unless(
            nframes == 0,
            "Wrong number of frames rendered"
            KT_VALUES("%ld", 0L, nframes));
}
Ejemplo n.º 8
0
END_TEST


START_TEST(Query_voice_count_with_silence)
{
    set_audio_rate(220);
    pause();

    kqt_Handle_play(handle, 128);
    kqt_Handle_fire_event(handle, 0, "[\"qvoices\", null]");

    const char* events = kqt_Handle_receive_events(handle);
    const char* expected = "[[0, [\"qvoices\", null]], [0, [\"Avoices\", 0]]]";

    fail_if(strcmp(events, expected) != 0,
            "Received event list %s instead of %s", events, expected);
}
Ejemplo n.º 9
0
END_TEST


START_TEST(Events_from_many_triggers_are_skipped_by_fire)
{
    const int event_count = 2048;

    setup_many_triggers(event_count);

    kqt_Handle_play(handle, 10);

    kqt_Handle_fire_event(handle, 0, "[\".a\", 0]");
    check_unexpected_error();

    const char* events = kqt_Handle_receive_events(handle);
    const char* expected = "[[0, [\".a\", 0]]]";
    fail_if(strcmp(events, expected) != 0,
            "Received event list %s instead of %s",
            events, expected);
}
Ejemplo n.º 10
0
END_TEST


START_TEST(Query_final_location)
{
    set_audio_rate(220);
    setup_query_patterns();

    kqt_Handle_play(handle, 2048);
    kqt_Handle_fire_event(handle, 0, "[\"qlocation\", null]");

    const char* events = kqt_Handle_receive_events(handle);
    const char* expected =
        "[[0, [\"qlocation\", null]]"
        ", [0, [\"Atrack\", 0]], [0, [\"Asystem\", 1]]"
        ", [0, [\"Apattern\", [0, 1]]], [0, [\"Arow\", [4, 0]]]"
        "]";

    fail_if(strcmp(events, expected) != 0,
            "Received event list %s instead of %s", events, expected);
}