static int snd_pcm_file_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params) { snd_pcm_file_t *file = pcm->private_data; unsigned int channel; snd_pcm_t *slave = file->gen.slave; int err = _snd_pcm_hw_params_internal(slave, params); if (err < 0) return err; file->buffer_bytes = snd_pcm_frames_to_bytes(slave, slave->buffer_size); file->wbuf_size = slave->buffer_size * 2; file->wbuf_size_bytes = snd_pcm_frames_to_bytes(slave, file->wbuf_size); file->wbuf_used_bytes = 0; assert(!file->wbuf); file->wbuf = malloc(file->wbuf_size_bytes); if (file->wbuf == NULL) { snd_pcm_file_hw_free(pcm); return -ENOMEM; } file->wbuf_areas = malloc(sizeof(*file->wbuf_areas) * slave->channels); if (file->wbuf_areas == NULL) { snd_pcm_file_hw_free(pcm); return -ENOMEM; } file->appl_ptr = file->file_ptr_bytes = 0; for (channel = 0; channel < slave->channels; ++channel) { snd_pcm_channel_area_t *a = &file->wbuf_areas[channel]; a->addr = file->wbuf; a->first = slave->sample_bits * channel; a->step = slave->frame_bits; } if ((file->fd < 0) && (pcm->stream == SND_PCM_STREAM_PLAYBACK)) { err = snd_pcm_file_open_output_file(file); if (err < 0) { SYSERR("failed opening output file %s", file->fname); return err; } } return 0; }
int snd_pcm_generic_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) { snd_pcm_generic_t *generic = pcm->private_data; return _snd_pcm_hw_params_internal(generic->slave, params); }