static int audio_device_attempt_config(session_t *sp, audio_config *config) { audio_format *inf, *ouf; const codec_format_t *incf; int success; incf = codec_get_format(config->primary); assert(incf); inf = audio_format_dup(&incf->format); ouf = audio_format_dup(&incf->format); if (inf->channels != 2 && config->render_3d) { /* If 3d rendering is enabled we need stereo output * format. */ ouf->channels = 2; } success = audio_open(config->device, inf, ouf); if (success) { mixer_info_t mi; uint16_t unit_len; assert(sp->ms == NULL); assert(sp->tb == NULL); assert(sp->cushion == NULL); audio_non_block(config->device); /* Initialize read and write components */ sp->meter_period = inf->sample_rate / 15; unit_len = inf->bytes_per_block * 8 / (inf->bits_per_sample*inf->channels); tx_create(&sp->tb, sp, (uint16_t)inf->sample_rate, (uint16_t)inf->channels, (uint16_t)unit_len); cushion_create(&sp->cushion, (uint16_t)inf->sample_rate); sp->cur_ts = ts_convert(inf->sample_rate, sp->cur_ts); mi.sample_rate = ouf->sample_rate; mi.channels = ouf->channels; mi.buffer_length = 32640; mix_create(&sp->ms, &mi, sp->cur_ts); if (zero_buf == NULL) { zero_buf = (sample*)xmalloc(unit_len * sizeof(sample)); audio_zero(zero_buf, unit_len, DEV_S16); } } audio_format_free(&inf); audio_format_free(&ouf); return success; }
void audio_formats_free(AUDIO_FORMAT* formats, size_t count) { size_t index; if (formats) { for (index = 0; index < count; index++) { AUDIO_FORMAT* format = &formats[index]; audio_format_free(format); } free(formats); } }