/* virt_on (number of tracks) */ int virt_on(struct context_data *ctx, int num) { struct player_data *p = &ctx->p; struct module_data *m = &ctx->m; int i; p->virt.num_tracks = num; num = mixer_numvoices(ctx, -1); p->virt.virt_channels = p->virt.num_tracks; if (HAS_QUIRK(QUIRK_VIRTUAL)) { p->virt.virt_channels += num; } else if (num > p->virt.virt_channels) { num = p->virt.virt_channels; } p->virt.maxvoc = mixer_numvoices(ctx, num); p->virt.voice_array = calloc(p->virt.maxvoc, sizeof(struct mixer_voice)); if (p->virt.voice_array == NULL) goto err; for (i = 0; i < p->virt.maxvoc; i++) { p->virt.voice_array[i].chn = FREE; p->virt.voice_array[i].root = FREE; } p->virt.virt_channel = malloc(p->virt.virt_channels * sizeof(struct virt_channel)); if (p->virt.virt_channel == NULL) goto err1; for (i = 0; i < p->virt.virt_channels; i++) { p->virt.virt_channel[i].map = FREE; p->virt.virt_channel[i].count = 0; } p->virt.virt_used = 0; return 0; err1: free(p->virt.voice_array); err: return -1; }
void virt_reset(struct context_data *ctx) { struct player_data *p = &ctx->p; int i; if (p->virt.virt_channels < 1) return; mixer_numvoices(ctx, p->virt.maxvoc); memset(p->virt.voice_array, 0, p->virt.maxvoc * sizeof(struct mixer_voice)); for (i = 0; i < p->virt.maxvoc; i++) { p->virt.voice_array[i].chn = FREE; p->virt.voice_array[i].root = FREE; } for (i = 0; i < p->virt.virt_channels; i++) { p->virt.virt_channel[i].map = FREE; p->virt.virt_channel[i].count = 0; } p->virt.virt_used = 0; }