[alsa-devel] [PATCH] ALSA: sb: remove needless evaluation in implementation for copy callback
Takashi Iwai
tiwai at suse.de
Tue May 23 15:49:59 CEST 2017
On Tue, 23 May 2017 15:40:42 +0200,
Takashi Sakamoto wrote:
>
> In design of ALSA pcm core, 'struct snd_pcm_ops.copy' is expected to
> copy PCM frames, according to frame alignment on intermediate buffer for
> userspace and dedicated buffer for data transmission. In this callback,
> value of 'channel' argument depends on the frame alignment, which drivers
> registers to runtime of PCM substream. When target devices can handle
> non-interleaved buffer, this value has positive value, otherwise negative.
>
> ALSA driver for PCM component of EMU8000 chip is programmed with local
> macro to switch the frame alignment. The 'copy' operation in
> non-interleaved side has evaluation of the 'channel' argument (actually
> it's 'voice' argument). This is useless.
>
> This commit remove the evaluation.
>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
Passing -1 to the channel was valid even for non-interleaved access.
It was meant to apply to all channels.
The call with channel = -1 itself might have been dropped meanwhile,
so removing it may be OK now. But the description is confusing as if
it were incorrectly implemented.
Takashi
> ---
> sound/isa/sb/emu8000_pcm.c | 28 ++++------------------------
> 1 file changed, 4 insertions(+), 24 deletions(-)
>
> diff --git a/sound/isa/sb/emu8000_pcm.c b/sound/isa/sb/emu8000_pcm.c
> index 32f234f494e5..bab796d75dbd 100644
> --- a/sound/isa/sb/emu8000_pcm.c
> +++ b/sound/isa/sb/emu8000_pcm.c
> @@ -450,20 +450,8 @@ static int emu8k_pcm_copy(struct snd_pcm_substream *subs,
> struct snd_emu8000 *emu = rec->emu;
>
> snd_emu8000_write_wait(emu, 1);
> - if (voice == -1) {
> - unsigned short *buf = src;
> - int i, err;
> - count /= rec->voices;
> - for (i = 0; i < rec->voices; i++) {
> - err = emu8k_transfer_block(emu, pos + rec->loop_start[i], buf, count);
> - if (err < 0)
> - return err;
> - buf += count;
> - }
> - return 0;
> - } else {
> - return emu8k_transfer_block(emu, pos + rec->loop_start[voice], src, count);
> - }
> + return emu8k_transfer_block(emu, pos + rec->loop_start[voice], src,
> + count);
> }
>
> /* make a channel block silence */
> @@ -487,17 +475,9 @@ static int emu8k_pcm_silence(struct snd_pcm_substream *subs,
> struct snd_emu8000 *emu = rec->emu;
>
> snd_emu8000_write_wait(emu, 1);
> - if (voice == -1 && rec->voices == 1)
> + if (rec->voices == 1)
> voice = 0;
> - if (voice == -1) {
> - int err;
> - err = emu8k_silence_block(emu, pos + rec->loop_start[0], count / 2);
> - if (err < 0)
> - return err;
> - return emu8k_silence_block(emu, pos + rec->loop_start[1], count / 2);
> - } else {
> - return emu8k_silence_block(emu, pos + rec->loop_start[voice], count);
> - }
> + return emu8k_silence_block(emu, pos + rec->loop_start[voice], count);
> }
>
> #else /* interleave */
> --
> 2.11.0
>
More information about the Alsa-devel
mailing list