Exemple #1
0
 VrtToBft(PcmData.ValueRepresentationType vrt)
 {
     return((WasapiCS.BitFormatType)vrt);
 }
        public static LargeArray <byte> ConvertTo32bitInt(
            int bitsPerSample, long numSamples,
            PcmData.ValueRepresentationType valueType, LargeArray <byte> data)
        {
            if (bitsPerSample == 32 && valueType == PcmData.ValueRepresentationType.SInt)
            {
                // すでに所望の形式。
                return(data);
            }

            var data32 = new LargeArray <byte>(numSamples * 4);

            switch (valueType)
            {
            case PcmData.ValueRepresentationType.SInt:
                switch (bitsPerSample)
                {
                case 16:
                    for (long i = 0; i < numSamples; ++i)
                    {
                        short v16 = (short)(
                            (uint)data.At(i * 2)
                            + ((uint)data.At(i * 2 + 1) << 8));
                        int v32 = v16;
                        v32 *= 65536;
                        data32.Set(i * 4 + 0, 0);
                        data32.Set(i * 4 + 1, 0);
                        data32.Set(i * 4 + 2, (byte)((v32 & 0x00ff0000) >> 16));
                        data32.Set(i * 4 + 3, (byte)((v32 & 0xff000000) >> 24));
                    }
                    return(data32);

                case 24:
                    for (long i = 0; i < numSamples; ++i)
                    {
                        int v32 = (int)(
                            ((uint)data.At(i * 3 + 0) << 8)
                            + ((uint)data.At(i * 3 + 1) << 16)
                            + ((uint)data.At(i * 3 + 2) << 24));
                        data32.Set(i * 4 + 0, 0);
                        data32.Set(i * 4 + 1, (byte)((v32 & 0x0000ff00) >> 8));
                        data32.Set(i * 4 + 2, (byte)((v32 & 0x00ff0000) >> 16));
                        data32.Set(i * 4 + 3, (byte)((v32 & 0xff000000) >> 24));
                    }
                    return(data32);

                case 32:
                    // 所望の形式。
                    System.Diagnostics.Debug.Assert(false);
                    return(null);

                case 64:
                    for (long i = 0; i < numSamples; ++i)
                    {
                        // 16.48 fixed point
                        int v32 = (int)(
                            ((uint)data.At(i * 8 + 2) << 0)
                            + ((uint)data.At(i * 8 + 3) << 8)
                            + ((uint)data.At(i * 8 + 4) << 16)
                            + ((uint)data.At(i * 8 + 5) << 24));
                        data32.Set(i * 4 + 0, (byte)((v32 & 0x000000ff) >> 0));
                        data32.Set(i * 4 + 1, (byte)((v32 & 0x0000ff00) >> 8));
                        data32.Set(i * 4 + 2, (byte)((v32 & 0x00ff0000) >> 16));
                        data32.Set(i * 4 + 3, (byte)((v32 & 0xff000000) >> 24));
                    }
                    return(data32);

                default:
                    System.Diagnostics.Debug.Assert(false);
                    return(null);
                }

            case PcmData.ValueRepresentationType.SFloat:
                for (long i = 0; i < numSamples; ++i)
                {
                    double v;
                    switch (bitsPerSample)
                    {
                    case 32: {
                        var b4 = new byte[4];
                        data.CopyTo(i * 4, ref b4, 0, 4);
                        v = BitConverter.ToSingle(b4, 0);
                    }
                    break;

                    case 64: {
                        var b8 = new byte[8];
                        data.CopyTo(i * 8, ref b8, 0, 8);
                        v = BitConverter.ToDouble(b8, 0);
                    }
                    break;

                    default:
                        System.Diagnostics.Debug.Assert(false);
                        return(null);
                    }

                    int v32 = 0;
                    if (1.0f <= v)
                    {
                        v32 = Int32.MaxValue;
                    }
                    else if (v < -1.0f)
                    {
                        v32 = Int32.MinValue;
                    }
                    else
                    {
                        long vMax = -((long)Int32.MinValue);

                        long v64 = (long)(v * vMax);
                        if (Int32.MaxValue < v64)
                        {
                            v64 = Int32.MaxValue;
                        }
                        v32 = (int)v64;
                    }

                    data32.Set(i * 4 + 0, (byte)((v32 & 0x000000ff) >> 0));
                    data32.Set(i * 4 + 1, (byte)((v32 & 0x0000ff00) >> 8));
                    data32.Set(i * 4 + 2, (byte)((v32 & 0x00ff0000) >> 16));
                    data32.Set(i * 4 + 3, (byte)((v32 & 0xff000000) >> 24));
                }
                return(data32);

            default:
                System.Diagnostics.Debug.Assert(false);
                return(null);
            }
        }
Exemple #3
0
        public static byte[] ConvertTo24bit(int bitsPerSample, long numSamples, PcmData.ValueRepresentationType valueType, byte [] data)
        {
            if (bitsPerSample == 24 && valueType == PcmData.ValueRepresentationType.SInt)
            {
                return(data);
            }

            byte[] data24 = new byte[numSamples * 3];

            switch (valueType)
            {
            case PcmData.ValueRepresentationType.SInt:
                switch (bitsPerSample)
                {
                case 16:
                    for (long i = 0; i < numSamples; ++i)
                    {
                        short v16 = (short)((uint)data[i * 2] + ((uint)data[i * 2 + 1] << 8));
                        int   v32 = v16;
                        v32 *= 65536;
                        data24[i * 3 + 0] = (byte)((v32 & 0x0000ff00) >> 8);
                        data24[i * 3 + 1] = (byte)((v32 & 0x00ff0000) >> 16);
                        data24[i * 3 + 2] = (byte)((v32 & 0xff000000) >> 24);
                    }
                    return(data24);

                case 32:
                    for (long i = 0; i < numSamples; ++i)
                    {
                        int v32 = (int)(/* data[i * 4] + */ ((uint)data[i * 4 + 1] << 8) + ((uint)data[i * 4 + 2] << 16) + ((uint)data[i * 4 + 3] << 24));
                        data24[i * 3 + 0] = (byte)((v32 & 0x0000ff00) >> 8);
                        data24[i * 3 + 1] = (byte)((v32 & 0x00ff0000) >> 16);
                        data24[i * 3 + 2] = (byte)((v32 & 0xff000000) >> 24);
                    }
                    return(data24);

                default:
                    System.Diagnostics.Debug.Assert(false);
                    return(null);
                }

            case PcmData.ValueRepresentationType.SFloat:
                for (long i = 0; i < numSamples; ++i)
                {
                    double v;
                    switch (bitsPerSample)
                    {
                    case 32:
                        v = BitConverter.ToSingle(data, (int)(i * 4));
                        break;

                    case 64:
                        v = BitConverter.ToDouble(data, (int)(i * 8));
                        break;

                    default:
                        System.Diagnostics.Debug.Assert(false);
                        return(null);
                    }

                    int v32 = 0;
                    if (1.0f <= v)
                    {
                        v32 = Int32.MaxValue;
                    }
                    else if (v < -1.0f)
                    {
                        v32 = Int32.MinValue;
                    }
                    else
                    {
                        long vMax = -((long)Int32.MinValue);

                        long v64 = (long)(v * vMax);
                        if (Int32.MaxValue < v64)
                        {
                            v64 = Int32.MaxValue;
                        }
                        v32 = (int)v64;
                    }

                    data24[i * 3 + 0] = (byte)((v32 & 0x0000ff00) >> 8);
                    data24[i * 3 + 1] = (byte)((v32 & 0x00ff0000) >> 16);
                    data24[i * 3 + 2] = (byte)((v32 & 0xff000000) >> 24);
                }
                return(data24);

            default:
                System.Diagnostics.Debug.Assert(false);
                return(null);
            }
        }