Massive sound changes / fix (24/32bit pcm support, new sampling
rate converter, various fixes)
Ariff Abdullah
skywizard at MyBSD.org.my
Wed Jul 6 22:46:01 GMT 2005
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