Пример #1
0
        /// <summary>
        /// フォーマット設定から、
        /// Setup()に設定されうるビットフォーマットの候補の数を数えて戻す。
        /// </summary>
        /// <returns>Setup()に設定されうるビットフォーマットの候補の数</returns>
        static public int GetSetupSampleFormatCandidateNum(
            WasapiSharedOrExclusiveType sharedOrExclusive,
            BitsPerSampleFixType bitsPerSampleFixType,
            int validBitsPerSample,
            PcmDataLib.PcmData.ValueRepresentationType vrt)
        {
            if (bitsPerSampleFixType != BitsPerSampleFixType.AutoSelect ||
                sharedOrExclusive == WasapiSharedOrExclusiveType.Shared)
            {
                // 共有モードの場合 1通り
                // 排他モードで自動選択以外の選択肢の場合 1通り
                return(1);
            }

            // 排他モードのAutoSelect
            switch (validBitsPerSample)
            {
            case 16:
                return(mTryFormat16.Length);

            case 24:
            default:
                return(mTryFormat24.Length);

            case 32:
                return(mTryFormat32.Length);
            }
        }
        /// <summary>
        /// PcmDataの形式と、(共有・排他)、フォーマット固定設定から、
        /// デバイスに設定されるビットフォーマットを取得。
        /// 
        /// これは、内容的にテーブルなので、テーブルにまとめたほうが良い。
        /// </summary>
        /// <returns>デバイスに設定されるビットフォーマット</returns>
        public static SampleFormatInfo CreateSetupSampleFormat(
            WasapiSharedOrExclusiveType sharedOrExclusive,
            BitsPerSampleFixType bitsPerSampleFixType,
            int bitsPerSample,
            int validBitsPerSample,
            PcmDataLib.PcmData.ValueRepresentationType vrt,
            int candidateId)
        {
            SampleFormatInfo sf = new SampleFormatInfo();

            if (sharedOrExclusive == WasapiSharedOrExclusiveType.Shared) {
                // 共有モード
                sf.bitsPerSample = bitsPerSample;
                sf.validBitsPerSample = validBitsPerSample;
                sf.bitFormatType = SampleFormatInfo.VrtToBft(vrt);
                return sf;
            }

            // 排他モード
            switch (bitsPerSampleFixType) {
            case BitsPerSampleFixType.Sint16:
                sf.bitFormatType = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample = 16;
                sf.validBitsPerSample = 16;
                break;
            case BitsPerSampleFixType.Sint24:
                sf.bitFormatType = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample = 24;
                sf.validBitsPerSample = 24;
                break;
            case BitsPerSampleFixType.Sint32:
                sf.bitFormatType = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample = 32;
                sf.validBitsPerSample = 32;
                break;
            case BitsPerSampleFixType.Sint32V24:
                sf.bitFormatType = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample = 32;
                sf.validBitsPerSample = 24;
                break;
            case BitsPerSampleFixType.Sfloat32:
                sf.bitFormatType = WasapiCS.BitFormatType.SFloat;
                sf.bitsPerSample = 32;
                sf.validBitsPerSample = 32;
                break;
            case BitsPerSampleFixType.AutoSelect:
                WasapiCS.SampleFormatType sampleFormat = WasapiCS.SampleFormatType.Sint16;
                switch (validBitsPerSample) {
                case 16:
                    sampleFormat = mTryFormat16[candidateId];
                    break;
                case 24:
                default: /* ? */
                    sampleFormat = mTryFormat24[candidateId];
                    break;
                case 32:
                    sampleFormat = mTryFormat32[candidateId];
                    break;
                }

                sf.bitFormatType      = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample      = WasapiCS.SampleFormatTypeToUseBitsPerSample(sampleFormat);
                sf.validBitsPerSample = WasapiCS.SampleFormatTypeToValidBitsPerSample(sampleFormat);
                break;
            default:
                System.Diagnostics.Debug.Assert(false);
                break;
            }

            return sf;
        }
Пример #3
0
        /// <summary>
        /// PcmDataの形式と、(共有・排他)、フォーマット固定設定から、
        /// デバイスに設定されるビットフォーマットを取得。
        ///
        /// これは、内容的にテーブルなので、テーブルにまとめたほうが良い。
        /// </summary>
        /// <returns>デバイスに設定されるビットフォーマット</returns>
        static public SampleFormatInfo CreateSetupSampleFormat(
            WasapiSharedOrExclusiveType sharedOrExclusive,
            BitsPerSampleFixType bitsPerSampleFixType,
            int bitsPerSample,
            int validBitsPerSample,
            PcmDataLib.PcmData.ValueRepresentationType vrt,
            int candidateId)
        {
            SampleFormatInfo sf = new SampleFormatInfo();

            if (sharedOrExclusive == WasapiSharedOrExclusiveType.Shared)
            {
                // 共有モード
                sf.bitsPerSample      = bitsPerSample;
                sf.validBitsPerSample = validBitsPerSample;
                sf.bitFormatType      = SampleFormatInfo.VrtToBft(vrt);
                return(sf);
            }

            // 排他モード
            switch (bitsPerSampleFixType)
            {
            case BitsPerSampleFixType.Sint16:
                sf.bitFormatType      = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample      = 16;
                sf.validBitsPerSample = 16;
                break;

            case BitsPerSampleFixType.Sint24:
                sf.bitFormatType      = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample      = 24;
                sf.validBitsPerSample = 24;
                break;

            case BitsPerSampleFixType.Sint32:
                sf.bitFormatType      = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample      = 32;
                sf.validBitsPerSample = 32;
                break;

            case BitsPerSampleFixType.Sint32V24:
                sf.bitFormatType      = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample      = 32;
                sf.validBitsPerSample = 24;
                break;

            case BitsPerSampleFixType.Sfloat32:
                sf.bitFormatType      = WasapiCS.BitFormatType.SFloat;
                sf.bitsPerSample      = 32;
                sf.validBitsPerSample = 32;
                break;

            case BitsPerSampleFixType.AutoSelect:
                WasapiCS.SampleFormatType sampleFormat = WasapiCS.SampleFormatType.Sint16;
                switch (validBitsPerSample)
                {
                case 16:
                    sampleFormat = mTryFormat16[candidateId];
                    break;

                case 24:
                default: /* ? */
                    sampleFormat = mTryFormat24[candidateId];
                    break;

                case 32:
                    sampleFormat = mTryFormat32[candidateId];
                    break;
                }

                sf.bitFormatType      = WasapiCS.BitFormatType.SInt;
                sf.bitsPerSample      = WasapiCS.SampleFormatTypeToUseBitsPerSample(sampleFormat);
                sf.validBitsPerSample = WasapiCS.SampleFormatTypeToValidBitsPerSample(sampleFormat);
                break;

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

            return(sf);
        }
        /// <summary>
        /// フォーマット設定から、
        /// Setup()に設定されうるビットフォーマットの候補の数を数えて戻す。
        /// </summary>
        /// <returns>Setup()に設定されうるビットフォーマットの候補の数</returns>
        public static int GetSetupSampleFormatCandidateNum(
            WasapiSharedOrExclusiveType sharedOrExclusive,
            BitsPerSampleFixType bitsPerSampleFixType,
            int validBitsPerSample,
            PcmDataLib.PcmData.ValueRepresentationType vrt)
        {
            if (bitsPerSampleFixType != BitsPerSampleFixType.AutoSelect ||
                    sharedOrExclusive == WasapiSharedOrExclusiveType.Shared) {
                // 共有モードの場合 1通り
                // 排他モードで自動選択以外の選択肢の場合 1通り
                return 1;
            }

            // 排他モードのAutoSelect
            switch (validBitsPerSample) {
            case 16:
                return mTryFormat16.Length;
            case 24:
            default:
                return mTryFormat24.Length;
            case 32:
                return mTryFormat32.Length;
            }
        }