Esempio n. 1
0
static void callback_send_a_buffer_create(void *user, VNodeID node_id, VBufferID buffer_id, const char *name,
        VNABlockType type, real64 frequency)
{
    VSNodeAudio *node;
    unsigned int i, j, count;

    if(frequency < 0.0)
        return;
    node = (VSNodeAudio *)vs_get_node(node_id, V_NT_AUDIO);
    if(node == NULL)
        return;

    for(i = 0; i < node->buffer_count; i++)
    {
        if(buffer_id != i)
        {
            for(j = 0; name[j] == node->buffers[i].name[j] && name[j] != 0; j++);
            if(name[j] == node->buffers[i].name[j])
                return;
        }
    }

    if(buffer_id < node->buffer_count && node->buffers[buffer_id].name[0] != 0 && type != node->buffers[buffer_id].type)
    {
        free(node->buffers[buffer_id].data);
        vs_destroy_subscription_list(node->buffers[buffer_id].subscribers);
        node->buffers[buffer_id].name[0] = 0;
    }

    if(buffer_id >= node->buffer_count || node->buffers[buffer_id].name[0] == 0)
    {
        for(buffer_id = 0; buffer_id < node->buffer_count && node->buffers[buffer_id].name[0] != 0; buffer_id++);
        if(buffer_id == node->buffer_count)
        {
            buffer_id = node->buffer_count;
            node->buffer_count += 16;
            node->buffers = realloc(node->buffers, (sizeof *node->buffers) * node->buffer_count);
            for(i = buffer_id; i < node->buffer_count; i++)
                node->buffers[i].name[0] = 0;
        }
        node->buffers[buffer_id].subscribers = vs_create_subscription_list();
        node->buffers[buffer_id].type = type;
        node->buffers[buffer_id].frequency = frequency;
        node->buffers[buffer_id].length = 64;
        node->buffers[buffer_id].data = malloc(sizeof(*node->buffers[buffer_id].data) * node->buffers[buffer_id].length);
        for(i = 0; i < node->buffers[buffer_id].length; i++)
            node->buffers[buffer_id].data[i] = NULL;
    }
    for(i = 0; name[i] != 0 && i < 15; i++)
        node->buffers[buffer_id].name[i] = name[i];
    node->buffers[buffer_id].name[i] = 0;

    count =	vs_get_subscript_count(node->head.subscribers);
    for(i = 0; i < count; i++)
    {
        vs_set_subscript_session(node->head.subscribers, i);
        verse_send_a_buffer_create(node_id, buffer_id, name, type, frequency);
    }
    vs_reset_subscript_session();
}
Esempio n. 2
0
static int sync_audio(const NodeAudio *n, const NodeAudio *target)
{
	unsigned int	i, sync = 1;
	const NdbABuffer	*buffer, *tbuffer;

	for(i = 0; (buffer = dynarr_index(n->buffers, i)) != NULL; i++)
	{
		if(buffer->name[0] == '\0')
			continue;
		if((tbuffer = nodedb_a_buffer_find(target, buffer->name)) != NULL)
		{
			printf("buffer: type=%d freq=%g  target: type=%d freq=%g\n",
			       buffer->type, buffer->frequency,
			       tbuffer->type, tbuffer->frequency);
			if(buffer->type == tbuffer->type && buffer->frequency == tbuffer->frequency)
				sync &= sync_audio_buffer(n, buffer, target, tbuffer);
			else
				printf("can't sync mismatched (type/freq) audio buffers!\n");	/* FIXME: Do it. */
		}
		else
		{
			printf("sync sending create of buffer '%s' in %u\n", buffer->name, target->node.id);
			verse_send_a_buffer_create(target->node.id, ~0, buffer->name, buffer->type, buffer->frequency);
			sync = 0;
		}
	}
	return sync;
}
Esempio n. 3
0
void vs_a_subscribe(VSNodeAudio *node)
{
    unsigned int i;
    if(node == NULL)
        return;
    for(i = 0; i < node->buffer_count; i++)
        if(node->buffers[i].name[0] != 0)
            verse_send_a_buffer_create(node->head.id, i, node->buffers[i].name, node->buffers[i].type,
                                       node->buffers[i].frequency);
    for(i = 0; i < node->stream_count; i++)
        if(node->streams[i].name[0] != 0)
            verse_send_a_stream_create(node->head.id, i, node->streams[i].name);
}