Massive sound changes / fix (24/32bit pcm support, new sampling
rate converter, various fixes)
sebastian ssmoller
sebastian.ssmoller at gmx.net
Sat Jul 9 08:26:02 GMT 2005
hi,
i just wonna say: THX! really GREAT work! ... this improves sound
quality on my boxes much !! ;-)
THX,
regards,
seb
> After sometimes, I've decided to release this (massive 4k lines) diff
> to our sound driver. This need proper review and confirmation, before
> it can be committed.
>
> Patches for both HEAD / RELENG_5 available at:
>
> http://staff.mybsd.org.my/skywizard/FreeBSD/sound/
>
> (Note the snd_RELTAG*.diff)
>
>
> Whats New
> =========
>
> 1. Support wide range sampling rate as low as 1hz up to int32 max
> (which is, insane) through new feeder_rate, multiple precisions
> choice (32/64 bit converter). This is indeed, quite insane, but it
> does give us more room and flexibility.
> 2. Support 24/32 bit pcm format conversion through new, much improved
> feeder_fmt.
>
>
> System wide changes
> ===================
>
> 1. sys/soundcard.h
> * Add definition for AFMT_(U|S)24_(B|L)E. This is somehow
> contradict with OSS/Voxware definition of 24bit, but anyway...
>
>
> General sound infrastructure changes
> ====================================
>
> 1. ac97.c
> * Slightly new method to detect mixer capabilities and resolution.
> This mostly to help CT4730, but apparently it does help other
> cards too (especially via8233x). This probably need futher test
> and confirmation from other people with ac97 cards other than via
> / es137x.
> * Aggresive dac power wake up call, again, to help CT4730 (and
> probably others).
> 2. mixer.c / sound.c (high priority / grave severity)
> * Fix super grave serious (call it whatever) panic/death during
> driver unload on second attempt after failure on first (device
> busy).
> 3. buffer.c / dsp.c / sound.h
> * Support for 24/32 AFMT
> 4. feeder_rate.c
> * New implementation of sampling rate conversion with 32/64 bit
> precision, 1 - int32max hz (which is, ridiculous, yet very
> addictive). Much improved / smarter buffer management to not
> cause any missing samples at the end of conversion process
> * Tunable sysctls for various aspect:
> hw.snd.feeder_rate_ratemin - minimum allowable sampling rate
> (default to 4000)
> hw.snd.feeder_rate_ratemax - maximum allowable sampling rate
> (default to 1102500)
> hw.snd.feeder_rate_buffersize - conversion buffer size
> (default to 8192)
> hw.snd.feeder_rate_scaling - scaling / conversion method
> (please refer to the source for explaination). Default to
> previous implementation type.
> 5. feeder_fmt.c / sound.h
> * New implementation, support for 24/32bit conversion, optimized,
> and simplified. Few routines has been removed (8 to xlaw, 16 to
> 8). It just doesn't make sense.
> 6. channel.c
> * Support for 24/32 AFMT
> * Fix wrong xruns increment, causing incorrect underruns statistic
> while using vchans.
> 7. vchan.c (high priority)
> * Support for 24/32 AFMT
> * Proper speed / rate detection especially for fixed rate ac97.
> User can override it using kernel hint:
> hint.pcm.<unit>.vchanrate="xxxx".
>
>
> Hardware spessific changes
> ==========================
>
> 1. als4000.c
> * als4000 can't do 48k properly (perhaps it really can't at all!).
> Set maxspeed to 44.1k instead.
> * Add locking / MPSAFE
> * Fix recording
> 2. cmi.c
> * remove busdma_lock_mutex and Giant from bus_dma_tag_create.
> Nothing changes.
> 3. es137x.c / es137x.h
> * Register programming error during device initialization
> especially for CT4730 / EV1938 chip, causing misconfigured mixer
> (David Xu), crippled after power cycle (Kevin Oberman). Fixed.
> * Incorporate locking/spdif patches from Jon Noack. Not all es137x
> can really do spdif, clean it up a bit to only let few capable
> chip.
> * Convert all bus_space_(read|write) to use es_rd/es_wr, simmilar
> with other drivers.
> * Add tunable hw.snd.pcm<unit>.latency_timer sysctl to toggle pci
> latency timer value on the fly. Much noise / pop / crackling
> issues can be solved by increasing its value. Other people can
> point out to use pciconf instead, but this is just and added
> value specifically for braindead CT4730/EV1938.
> 4. via8233.c
> * Add locking / MPSAFE
> * Add kernel hint option to disable DXS channels entirely. Report
> from several skype users / Pav Lucistnik indicate that disabling
> DXS fix lots of pop / crackling noise. To disable DXS, add
> hint.pcm.<unit>.via_dxs_disabled="1" into /boot/device.hints.
> NOTE: It is advisable to disable DXS entirely. Although DXS can
> provide multiple concurrent access, doing so will cause more
> harm than good (pop / crackling noise, sudden slowness,
> overruns). There are few cases where this is considered
> invalid, but I had to investigate more as this is not a
> global issue. Use / enable vchans for multiple sound sources
> (Please refer to vchans notes below).
> 5. via82c686.c
> * Add locking / MPSAFE. I don't have this card, so other people had
> to confirm it. Anyway, the logic is correct.
>
>
> Notes / Issues
> ==============
>
> * Virtual Channels (vchans)
> Enabling vchans can really, really help to solve overruns
> issue. This is quite understandable, because it operate
> entirely within its own buffering system without relying on
> hardware interrupt / state. Even if you don't need vchan,
> just enable single channel can help much.
> * Feeder alignment is really a monster on its own, this should
> be fixed or revamp in near future.
> * Mixer infrastructure is really outdated, without support for
> proper multichannel. Best candidate for hacking fest.
> * The arrival of 24/32 also come with a price. Applications
> that can do 24/32bit playback need to be recompiled (notably
> mplayer). Use (recompiled) mplayer to experiment / test /
> debug this various format using -af format=fmt. Note that
> 24bit seeking in mplayer is a little bit broken, sometimes
> can cause silence or loud static noise. Pausing / seeking
> few times can solve this problem.
> You don't have to rebuild world entirely for this. Simply
> copy /usr/src/sys/sys/soundcard.h to
> /usr/include/sys/soundcard.h would suffice. Few drivers also
> need recompilation, and this can be done via
> /usr/src/sys/modules/sound/.
> Support for 24bit hardware playback is beyond the scope of
> this changes. That would require spessific hardware driver
> changes and currently I don't have any of it.
> * Don't expect playing 9999999999hz is a wise decision. Be
> reasonable. The new feeder_rate implemention provide
> flexibility, not insanity. You can easily chewed up your CPU
> with this kind of mind instability. Please use proper
> mosquite repellent device for this obvious cracked brain
> attempt. As for testing purposes, you can use (again)
> mplayer to generate / play with different sampling rate. Use
> something like mplayer -af resample=192000:0:0 files..
>
>
> --
>
> Ariff Abdullah
> MyBSD
>
> http://www.MyBSD.org.my (IPv6/IPv4)
> http://staff.MyBSD.org.my (IPv6/IPv4)
> http://tomoyo.MyBSD.org.my (IPv6/IPv4)
More information about the freebsd-multimedia
mailing list