From alsa-user-owner@alsa.jcu.cz  Tue Oct  6 20:49:50 1998
Received: from entry.jcu.cz (IDENT:perex@entry.jcu.cz [160.217.1.111])
	by marvin.jcu.cz (8.9.1a/8.9.1) with SMTP id UAA29217;
	Tue, 6 Oct 1998 20:45:05 +0200
Date: Tue, 6 Oct 1998 20:44:57 +0200 (CEST)
From: Jaroslav Kysela <perex@jcu.cz>
To: Rutger Nijlunsing <rutger@wingding.demon.nl>
cc: alsa-user@alsa.jcu.cz, alsa-devel@alsa.jcu.cz
Subject: Re: [perex@jcu.cz: Re: Buffer size]
In-Reply-To: <19981005190802.A912@wingding.demon.nl>
Message-ID: <Pine.LNX.3.96.981006202407.13848D-100000@entry.jcu.cz>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
Reply-To: alsa-user@alsa.jcu.cz
Sender: alsa-user-owner@alsa.jcu.cz
Precedence: list

On Mon, 5 Oct 1998, Rutger Nijlunsing wrote:

> > > I'm trying to create a driver for MikMod for native ALSA support, for
> > > which I've got a working version now, but I can't use the full 128Kb
> > > buffer on my SB16 in native mode:
> 
> > Can you send me 'cat /proc/asound/0/sb16', too??
> 
> [root@wingding internet]# cat /proc/asound/0/sb16 
> SB16 DMA usage
> 
> Playback DMA  : auto (16-bit)
> Record DMA    : auto (inactive)
> 
> [root@wingding internet]# cat /proc/dma 
>  1: Sound Blaster 16
>  4: cascade
>  5: Sound Blaster 16
> 
> [root@wingding internet]# cat /proc/asound/version 
> Advanced Linux Sound Architecture Driver Version 0.2.0-pre7.
> Compiled in Sep 19 1998 for kernel 2.1.122.
> 
> 
> Code which sets the fragments:
> 
> 	playback_params.fragment_size = fragsize;
> 	playback_params.fragments_max = numfrags;
> 	playback_params.fragments_room = 1;
> 	err = snd_pcm_playback_params(pcm_handle, &playback_params);
> 
> ...with fragsize=4096 and numfrags=255 gives:
> 
> [root@wingding internet]# cat /proc/asound/0/pcm0
> DSP v4.5
> 
> Playback
>   Mode           : native
>   Format         : Signed 16-bit Little Endian
>   Rate           : 44100Hz [requested 44100Hz]
>   Channels       : 2
>   Buffer size    : 131072
>   Buffer used    : 65536
>   Fragments      : 16
>   Fragment size  : 4096
>   Fragments room : 1
>   Fragments max  : 15
>   Underruns      : 0
>   Total underruns: 2
> Record isn't active.

Ignore this **** buy better soundcard **** end of ignore section.

OK. Explain follows:

Routine which sets playback parameters depends in some cases on playback
format (sample format, rate, channels). You reached one from this
situation. SB16+ soundcards with known DMA problems (8-bit DMA can't
transfer 16-bit samples and versa-vice) needs from driver doing some
sample conversions.

In case if 8-bit samples are played and 16-bit DMA is used - DMA size is
multiplied by two (8-bit to 16-bit conversion). Thus if you have 128kB DMA
buffer, only 64kB virtual size is used for playback. ALSA driver does
setup at open to 8-bit mono unsigned samples. If you don't set sample
format before playback parameters setup -> only 64kB is used (driver is
thinking that you will play 8-bit samples).

Solution:

1) Use snd_pcm_playback_format before snd_pcm_playback_params...
2) Driver should save snd_pcm_playback_params values until
   snd_pcm_playback_status or snd_pcm_playback_format will be called
   from application.

I don't know what solution is better. My recommendation for this time is
use 1) - right order of commands in playback setup.

							Jaroslav

-----
Jaroslav Kysela <perex@jcu.cz>
Academic Computer Centre, University of South Bohemia
Branisovska 31, C. Budejovice, CZ-370 05 Czech Republic


