On Fri, 13 May 2011 12:39:43 +0200
Alexandre Ratchov <a...@caoua.org> wrote:

> On Thu, May 12, 2011 at 12:36:43AM +0300, Sviatoslav Chagaev wrote:
> > > > 
> > > > So, why is what I'm proposing better than what currently exists:
> > > > 
> > > > * Resembles how sound behaves in real world more closely;
> > > > * Doesn't violate the principle of least surprise;
> > > > * No more annoying volume jumps up and down;
> > > > * No need to use the -v option anymore / less stuff to remember / "it
> > > > just works";
> > > > * No more choosing between being annoyed by volume jumps or loosing
> > > > dynamic range.
> > > > 
> > > 
> > > I guess this works well with your recordings by accident, as it would
> > > with mines. I bet they are pre-divided, so you almost never hit the
> > > ADATA_MIN and ADATA_MAX bundary, and there's almost no clipping, is
> > > it?
> > > 
> > 
> > Before posting, I tested by playing, I don't remember exactly,
> > either 2 either 3 files simultaneously. And honestly, I didn't notice
> > any distortions. This is probably because of the fact that like you
> > said, it's rare that all the waves have +/-ADATA_UNIT value at a given
> > moment. After reading your replies, I tried playing ~8 files
> > simultaneously and I indeed heard clearly sound distortion.
> > 
> > > If so, for such streams you could do:
> > > 
> > >   int
> > >   adata_sadd(int x, int y)
> > >   {
> > >           return x + y;
> > >   }
> > > 
> > 
> > The ADATA_MIN ADATA_MAX checks are needed because without them, you
> > will start hearing distorions as soon as you play 2 files and this
> > distortion is much worse sounding than the saturation distortion.
> > 
> 
> While discussing about what defaults are good for what, here's a diff
> I plan to put in soon.
> 
> It's to add a switch to make automatic volume changes optional.
> Sometimes I need this when I'm playing pre-scaled streams, or to mix
> streams that fade in / fade out.
> 
> -- Alexandre
> 

Then the only thing that remains -- is to add clipping in mix_badd().
This will give aucat all the bits and pieces to meet the requirements
of all kinds of users.

(Tested on i386 and amd64 with 16 and 24 bits ADATA)


Index: aproc.c
===================================================================
RCS file: /cvs/src/usr.bin/aucat/aproc.c,v
retrieving revision 1.64
diff -u -p -r1.64 aproc.c
--- aproc.c     28 Apr 2011 07:20:03 -0000      1.64
+++ aproc.c     14 May 2011 14:42:58 -0000
@@ -617,6 +617,11 @@ mix_badd(struct abuf *ibuf, struct abuf 
        unsigned i, j, cc, istart, inext, onext, ostart;
        unsigned scount, icount, ocount;
        int vol;
+#if ADATA_BITS <= 16
+       register int data;
+#else
+       register long long data;
+#endif
 
 #ifdef DEBUG
        if (debug_level >= 4) {
@@ -673,7 +678,13 @@ mix_badd(struct abuf *ibuf, struct abuf 
        idata += istart;
        for (i = scount; i > 0; i--) {
                for (j = cc; j > 0; j--) {
-                       *odata += ADATA_MUL(*idata, vol);
+                       data = *odata;
+                       data += ADATA_MUL(*idata, vol);
+                       if (data < -ADATA_UNIT)
+                               data = -ADATA_UNIT;
+                       else if (data > (ADATA_UNIT-2))
+                               data = (ADATA_UNIT-2);
+                       *odata = (adata_t) data;
                        idata++;
                        odata++;
                }

Reply via email to