Ejemplo n.º 1
0
 public void Flush()
 {
     if (mixbuff != null)
     {
         if (mixbuff.source[iSource].Length < mixbuff.source[iSource].Size)
         {
             AudioSamples.MemSet(mixbuff.source[iSource].Bytes, 0, mixbuff.source[iSource].Length * Settings.PCM.BlockAlign, (mixbuff.source[iSource].Size - mixbuff.source[iSource].Length) * Settings.PCM.BlockAlign);
         }
         mixer.UnlockEmptyBuffer(mixbuff, iSource, volume);
         mixbuff = null;
     }
 }
Ejemplo n.º 2
0
        unsafe void restore_samples(FlacFrame frame)
        {
            for (int ch = 0; ch < PCM.ChannelCount; ch++)
            {
                switch (frame.subframes[ch].best.type)
                {
                case SubframeType.Constant:
                    AudioSamples.MemSet(frame.subframes[ch].samples, frame.subframes[ch].best.residual[0], frame.blocksize);
                    break;

                case SubframeType.Verbatim:
                    AudioSamples.MemCpy(frame.subframes[ch].samples, frame.subframes[ch].best.residual, frame.blocksize);
                    break;

                case SubframeType.Fixed:
                    restore_samples_fixed(frame, ch);
                    break;

                case SubframeType.LPC:
                    restore_samples_lpc(frame, ch);
                    break;
                }
                if (frame.subframes[ch].wbits != 0)
                {
                    int *s = frame.subframes[ch].samples;
                    int  x = (int)frame.subframes[ch].wbits;
                    for (int i = frame.blocksize; i > 0; i--)
                    {
                        *(s++) <<= x;
                    }
                }
            }
            if (frame.ch_mode != ChannelMode.NotStereo)
            {
                int *l = frame.subframes[0].samples;
                int *r = frame.subframes[1].samples;
                switch (frame.ch_mode)
                {
                case ChannelMode.LeftRight:
                    break;

                case ChannelMode.MidSide:
                    for (int i = frame.blocksize; i > 0; i--)
                    {
                        int mid  = *l;
                        int side = *r;
                        mid  <<= 1;
                        mid   |= (side & 1);                               /* i.e. if 'side' is odd... */
                        *(l++) = (mid + side) >> 1;
                        *(r++) = (mid - side) >> 1;
                    }
                    break;

                case ChannelMode.LeftSide:
                    for (int i = frame.blocksize; i > 0; i--)
                    {
                        int _l = *(l++), _r = *r;
                        *(r++) = _l - _r;
                    }
                    break;

                case ChannelMode.RightSide:
                    for (int i = frame.blocksize; i > 0; i--)
                    {
                        *(l++) += *(r++);
                    }
                    break;
                }
            }
        }