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(); }
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; }
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); }