예제 #1
0
static void producer(void *_q) {
    pa_asyncq *q = _q;
    int i;

    for (i = 0; i < 1000; i++) {
        printf("pushing %i\n", i);
        pa_asyncq_push(q, PA_UINT_TO_PTR(i+1), 1);
    }

    pa_asyncq_push(q, PA_UINT_TO_PTR(-1), TRUE);
    printf("pushed end\n");
}
예제 #2
0
int main(int argc, char*argv[]) {
    unsigned n;

    pa_log_set_level(PA_LOG_INFO);

    srand((unsigned) time(NULL));

    if (argc >= 3) {
        msec_lower = atoi(argv[1]);
        msec_upper = atoi(argv[2]);
    } else if (argc >= 2) {
        msec_lower = 0;
        msec_upper = atoi(argv[1]);
    } else {
        msec_lower = 0;
        msec_upper = 1000;
    }

    pa_assert(msec_upper > 0);
    pa_assert(msec_upper >= msec_lower);

    pa_log_notice("Creating random latencies in the range of %ims to %ims.", msec_lower, msec_upper);

    for (n = 1; n < pa_ncpus(); n++) {
        pa_assert_se(pa_thread_new("rtstutter", work, PA_UINT_TO_PTR(n)));
    }

    work(PA_INT_TO_PTR(0));

    return 0;
}
예제 #3
0
static void consumer(void *_q) {
    pa_asyncq *q = _q;
    void *p;
    int i;

    pa_msleep(1000);

    for (i = 0;; i++) {
        p = pa_asyncq_pop(q, TRUE);

        if (p == PA_UINT_TO_PTR(-1))
            break;

        pa_assert(p == PA_UINT_TO_PTR(i+1));

        printf("popped %i\n", i);
    }

    printf("popped end\n");
}
static void cmtspeech_dl_sideinfo_bogus(struct userdata *u) {
    unsigned int spc_flags = VOICE_SIDEINFO_FLAG_BAD|VOICE_SIDEINFO_FLAG_BOGUS;

    pa_assert(u);

    if (NULL == u->voice_sideinfoq)
        return;

    pa_queue_push(u->voice_sideinfoq, PA_UINT_TO_PTR(spc_flags));

    u->continuous_dl_stream = FALSE;
}
static void cmtspeech_dl_sideinfo_push(unsigned int cmt_spc_flags, int length, struct userdata *u) {
    unsigned int spc_flags;
    pa_assert(length % u->dl_frame_size == 0);
    pa_assert(u);

    if (NULL == u->voice_sideinfoq)
        return;

    spc_flags = cmtspeech_to_voice_spc_flags(cmt_spc_flags);
    spc_flags |= VOICE_SIDEINFO_FLAG_BOGUS;

    while (length) {
        pa_queue_push(u->local_sideinfoq, PA_UINT_TO_PTR(spc_flags));
        length -= u->dl_frame_size;
    }
}
static void cmtspeech_dl_sideinfo_forward(struct userdata *u) {
    unsigned int spc_flags = 0;

    pa_assert(u);

    if (NULL == u->voice_sideinfoq)
        return;

    spc_flags = PA_PTR_TO_UINT(pa_queue_pop(u->local_sideinfoq));

    if (spc_flags == 0) {
        pa_log_warn("Local sideinfo queue empty.");
        spc_flags = VOICE_SIDEINFO_FLAG_BAD|VOICE_SIDEINFO_FLAG_BOGUS;
    }
    else if (!u->continuous_dl_stream)
        spc_flags |= VOICE_SIDEINFO_FLAG_BAD;

    u->continuous_dl_stream = TRUE;

    pa_queue_push(u->voice_sideinfoq, PA_UINT_TO_PTR(spc_flags));
}
예제 #7
0
/* Called from main context */
int pa_source_output_set_rate(pa_source_output *o, uint32_t rate) {
    pa_source_output_assert_ref(o);
    pa_assert_ctl_context();
    pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state));
    pa_return_val_if_fail(o->thread_info.resampler, -PA_ERR_BADSTATE);

    if (o->sample_spec.rate == rate)
        return 0;

    o->sample_spec.rate = rate;

    pa_asyncmsgq_post(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), 0, NULL, NULL);

    pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
    return 0;
}
예제 #8
0
/* Called from main context */
static void source_output_set_state(pa_source_output *o, pa_source_output_state_t state) {
    pa_assert(o);
    pa_assert_ctl_context();

    if (o->state == state)
        return;

    pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET_STATE, PA_UINT_TO_PTR(state), 0, NULL) == 0);

    update_n_corked(o, state);
    o->state = state;

    if (state != PA_SOURCE_OUTPUT_UNLINKED) {
        pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_STATE_CHANGED], o);

        if (PA_SOURCE_OUTPUT_IS_LINKED(state))
            pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
    }

    pa_source_update_status(o->source);
}