From: Abramo Bagnara Date: Mon, 5 Jun 2000 15:28:39 +0000 (+0000) Subject: Fix for frame size not byte aligned X-Git-Tag: v1.0.3~1235 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=7fe55fff6a1ff6a8178d889041d6ef3b617a3c5d;p=alsa-lib.git Fix for frame size not byte aligned --- diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index 587414df..f902a06f 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -348,9 +348,12 @@ ssize_t snd_pcm_stream_seek(snd_pcm_t *pcm, int stream, off_t offset) ssize_t snd_pcm_write(snd_pcm_t *pcm, const void *buffer, size_t size) { + snd_pcm_stream_t *str; assert(pcm); - assert(pcm->stream[SND_PCM_STREAM_PLAYBACK].valid_setup); + str = &pcm->stream[SND_PCM_STREAM_PLAYBACK]; + assert(str->valid_setup); assert(size == 0 || buffer); + assert(size % str->setup.bytes_align == 0); return pcm->ops->write(pcm, buffer, size); } @@ -364,9 +367,12 @@ ssize_t snd_pcm_writev(snd_pcm_t *pcm, const struct iovec *vector, unsigned long ssize_t snd_pcm_read(snd_pcm_t *pcm, void *buffer, size_t size) { + snd_pcm_stream_t *str; assert(pcm); - assert(pcm->stream[SND_PCM_STREAM_CAPTURE].valid_setup); + str = &pcm->stream[SND_PCM_STREAM_CAPTURE]; + assert(str->valid_setup); assert(size == 0 || buffer); + assert(size % str->setup.bytes_align == 0); return pcm->ops->read(pcm, buffer, size); } diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c index 0507bb1d..ff60f9c2 100644 --- a/src/pcm/pcm_plug.c +++ b/src/pcm/pcm_plug.c @@ -334,7 +334,8 @@ static int snd_pcm_plug_stream_params(snd_pcm_t *pcm, snd_pcm_stream_params_t *p snd_pcm_stream_info_t slave_info; snd_pcm_plugin_t *plugin; snd_pcm_plug_t *plug; - size_t bytes_per_frame; + size_t bits; + size_t bytes_align; int err; int stream = params->stream; @@ -366,20 +367,21 @@ static int snd_pcm_plug_stream_params(snd_pcm_t *pcm, snd_pcm_stream_params_t *p return snd_pcm_stream_params(plug->slave, params); /* compute right sizes */ - bytes_per_frame = snd_pcm_format_size(params->format.format, params->format.channels); - if (bytes_per_frame == 0) - bytes_per_frame = 1; - params1.frag_size -= params1.frag_size % bytes_per_frame; + bits = snd_pcm_format_physical_width(params->format.format) * params->format.channels; + while (bits % 8 != 0) + bits *= 2; + bytes_align = bits / 8; + params1.frag_size -= params1.frag_size % bytes_align; slave_params.frag_size = snd_pcm_plug_slave_size(pcm, stream, params1.frag_size); - params1.buffer_size -= params1.buffer_size % bytes_per_frame; + params1.buffer_size -= params1.buffer_size % bytes_align; slave_params.buffer_size = snd_pcm_plug_slave_size(pcm, stream, params1.buffer_size); - params1.bytes_fill_max -= params1.bytes_fill_max % bytes_per_frame; + params1.bytes_fill_max -= params1.bytes_fill_max % bytes_align; slave_params.bytes_fill_max = snd_pcm_plug_slave_size(pcm, stream, params1.bytes_fill_max); - params1.bytes_min -= params1.bytes_min % bytes_per_frame; + params1.bytes_min -= params1.bytes_min % bytes_align; slave_params.bytes_min = snd_pcm_plug_slave_size(pcm, stream, params1.bytes_min); - params1.bytes_xrun_max -= params1.bytes_xrun_max % bytes_per_frame; + params1.bytes_xrun_max -= params1.bytes_xrun_max % bytes_align; slave_params.bytes_xrun_max = snd_pcm_plug_slave_size(pcm, stream, params1.bytes_xrun_max); - params1.bytes_align -= params1.bytes_align % bytes_per_frame; + params1.bytes_align -= params1.bytes_align % bytes_align; slave_params.bytes_align = snd_pcm_plug_slave_size(pcm, stream, params1.bytes_align); if (slave_params.byte_boundary == 0 || slave_params.byte_boundary > INT_MAX) slave_params.byte_boundary = INT_MAX; diff --git a/src/pcm/plugin/mmap.c b/src/pcm/plugin/mmap.c index 98519faa..4db2b665 100644 --- a/src/pcm/plugin/mmap.c +++ b/src/pcm/plugin/mmap.c @@ -85,7 +85,7 @@ static ssize_t mmap_src_channels(snd_pcm_plugin_t *plugin, assert(snd_pcm_mmap_ready(data->slave, plugin->stream)); } pos = ctrl->byte_data % setup->buffer_size; - assert((pos * 8) % stream->bits_per_frame == 0); + assert(pos % setup->bytes_align == 0); pos = (pos * 8) / stream->bits_per_frame; sv = plugin->src_channels; @@ -156,7 +156,7 @@ static ssize_t mmap_dst_channels(snd_pcm_plugin_t *plugin, assert(snd_pcm_mmap_ready(data->slave, plugin->stream)); } pos = ctrl->byte_data % setup->buffer_size; - assert((pos * 8) % stream->bits_per_frame == 0); + assert(pos % setup->bytes_align == 0); pos = (pos * 8) / stream->bits_per_frame; sv = stream->channels;