Fixed rate codec with vchans [ was Re: Problem with snd_ich and vchans ]

Orion Hodson orion at
Wed Dec 10 16:35:46 PST 2003

/-- Michael Nottebrock wrote:
| pcm0: <Intel ICH2 (82801BA)> port 0xe800-0xe83f,0xec00-0xecff irq 10 at dev=
| ice=20
| 31.5 on pci0
| pcm0: <C-Media Electronics CMI9739 AC97 Codec>
| running by default with hw.snd.pcm0.ac97rate: 48000.
| Now when I enable vchans, sound plays back to slowly (pitched down), fiddli=
| ng=20
| with above sysctl doesn't have any effect. I found the following in vchan.c:
|         /* XXX gross ugly hack, kill murder death */
|         if (first && !err) {
|                 err =3D chn_reset(parent, AFMT_STEREO | AFMT_S16_LE);
|                 if (err)
|                         printf("chn_reset: %d\n", err);
|                 err =3D chn_setspeed(parent, 44100);
|                 if (err)
|                         printf("chn_setspeed: %d\n", err);
|         }
| When I change the 44100 to 48000 there, sound plays back normally with vcha=
| ns enabled.


The ac97 codec is fixed rate (48kHz).  The virtual channel code resamples all 
playback streams to 44.1kHz before mixing them and needs to arrange to plumb 
in a rate converter after the mixing step.  Unfortunately, there's a bug in 
the planning code that doesn't allow this to happen correctly.

The patch above is nicely avoids this problem for the case in hand.

The bugs in the feeder planning code also affect recording and certain format 
selections (quite a lot of cases with fixed rate codecs).  There's an 
attempted general case patch relative to -CURRENT in August:

The patch was written at about the point I decided I wanted to take a break 
from the project and has not been committed.  It touches quite a lot of code, 
but hopefully makes the feeder planning easier to reason about.

Kind Regards
- Orion

More information about the freebsd-multimedia mailing list