OSDN Git Service

#34712 ASIOのマスターボリューム制御の方法を、WASAPIでの制御方法に合わせた。(音量制御専用のミキサーを一段追加する)
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Thu, 25 Dec 2014 16:40:19 +0000 (16:40 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Thu, 25 Dec 2014 16:40:19 +0000 (16:40 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@785 16f42ceb-6dc6-49c8-ba94-f2d53467949d

FDK17プロジェクト/コード/03.サウンド/CSoundDeviceASIO.cs
FDK17プロジェクト/コード/03.サウンド/CSoundDeviceWASAPI.cs

index 1679acc..da1029e 100644 (file)
@@ -81,26 +81,38 @@ namespace FDK
                        protected set;\r
                }\r
 \r
+\r
+               // マスターボリュームの制御コードは、WASAPI/ASIOで全く同じ。\r
                public int nMasterVolume\r
                {\r
                        get\r
                        {\r
-                               float f音量 = BassAsio.BASS_ASIO_ChannelGetVolume( false, -1 );\r
-                               if ( f音量 == -1.0f )\r
+                               float f音量 = 0.0f;\r
+                               bool b = Bass.BASS_ChannelGetAttribute( this.hMixer, BASSAttribute.BASS_ATTRIB_VOL, ref f音量 );\r
+                               if ( !b )\r
+                               {\r
+                                       BASSError be = Bass.BASS_ErrorGetCode();\r
+                                       Trace.TraceInformation( "WASAPI Master Volume Get Error: " + be.ToString() );\r
+                               }\r
+                               else\r
                                {\r
-                                       BASSError be = BassAsio.BASS_ASIO_ErrorGetCode();\r
-                                       Trace.TraceInformation( "ASIO Master Volume Get Error: " + be.ToString() );\r
-                                       f音量 = 0.0f;\r
+                                       //Trace.TraceInformation( "WASAPI Master Volume Get Success: " + (f音量 * 100) );\r
+\r
                                }\r
                                return (int) ( f音量 * 100 );\r
                        }\r
                        set\r
                        {\r
-                               bool b = BassAsio.BASS_ASIO_ChannelSetVolume( false, -1, value / 100.0f );\r
+                               bool b = Bass.BASS_ChannelSetAttribute( this.hMixer, BASSAttribute.BASS_ATTRIB_VOL, (float) ( value / 100.0 ) );\r
                                if ( !b )\r
                                {\r
-                                       BASSError be = BassAsio.BASS_ASIO_ErrorGetCode();\r
-                                       Trace.TraceInformation( "ASIO Master Volume Set Error: " + be.ToString() );\r
+                                       BASSError be = Bass.BASS_ErrorGetCode();\r
+                                       Trace.TraceInformation( "WASAPI Master Volume Set Error: " + be.ToString() );\r
+                               }\r
+                               else\r
+                               {\r
+                                       // int n = this.nMasterVolume;  \r
+                                       // Trace.TraceInformation( "WASAPI Master Volume Set Success: " + value );\r
                                }\r
                        }\r
                }\r
@@ -273,7 +285,7 @@ namespace FDK
                                BassAsio.BASS_ASIO_Free();\r
                                Bass.BASS_Free();\r
                                this.bIsBASSFree = true;\r
-                               throw new Exception( string.Format( "BASSミキサの作成に失敗しました。[{0}]", err ) );\r
+                               throw new Exception( string.Format( "BASSミキサ(mixing)の作成に失敗しました。[{0}]", err ) );\r
                        }\r
 \r
                        // BASS ミキサーの1秒あたりのバイト数を算出。\r
@@ -290,7 +302,35 @@ namespace FDK
                        //long nミキサーの1サンプルあたりのバイト数 = /*mixerInfo.chans*/ 2 * nサンプルサイズbyte;\r
                        long nミキサーの1サンプルあたりのバイト数 = mixerInfo.chans * nサンプルサイズbyte;\r
                        this.nミキサーの1秒あたりのバイト数 = nミキサーの1サンプルあたりのバイト数 * mixerInfo.freq;\r
-               \r
+\r
+\r
+                       // 単純に、hMixerの音量をMasterVolumeとして制御しても、\r
+                       // ChannelGetData()の内容には反映されない。\r
+                       // そのため、もう一段mixerを噛ませて、一段先のmixerからChannelGetData()することで、\r
+                       // hMixerの音量制御を反映させる。\r
+                       this.hMixer_DeviceOut = BassMix.BASS_Mixer_StreamCreate(\r
+                               (int) this.db周波数, this.n出力チャンネル数, flag );\r
+                       if ( this.hMixer_DeviceOut == 0 )\r
+                       {\r
+                               BASSError errcode = Bass.BASS_ErrorGetCode();\r
+                               BassAsio.BASS_ASIO_Free();\r
+                               Bass.BASS_Free();\r
+                               this.bIsBASSFree = true;\r
+                               throw new Exception( string.Format( "BASSミキサ(最終段)の作成に失敗しました。[{0}]", errcode ) );\r
+                       }\r
+                       {\r
+                               bool b1 = BassMix.BASS_Mixer_StreamAddChannel( this.hMixer_DeviceOut, this.hMixer, BASSFlag.BASS_DEFAULT );\r
+                               if ( !b1 )\r
+                               {\r
+                                       BASSError errcode = Bass.BASS_ErrorGetCode();\r
+                                       BassAsio.BASS_ASIO_Free();\r
+                                       Bass.BASS_Free();\r
+                                       this.bIsBASSFree = true;\r
+                                       throw new Exception( string.Format( "BASSミキサ(最終段とmixing)の接続に失敗しました。[{0}]", errcode ) );\r
+                               };\r
+                       }\r
+\r
+\r
                        // 出力を開始。\r
 \r
                        this.nバッファサイズsample = (int) ( n希望バッファサイズms * this.db周波数 / 1000.0 );\r
@@ -371,6 +411,7 @@ namespace FDK
 \r
 \r
                protected int hMixer = -1;\r
+               protected int hMixer_DeviceOut = -1; \r
                protected int n出力チャンネル数 = 0;\r
                protected double db周波数 = 0.0;\r
                protected int nバッファサイズsample = 0;\r
@@ -386,7 +427,7 @@ namespace FDK
 \r
                        // BASSミキサからの出力データをそのまま ASIO buffer へ丸投げ。\r
 \r
-                       int num = Bass.BASS_ChannelGetData( this.hMixer, buffer, length );              // num = 実際に転送した長さ\r
+                       int num = Bass.BASS_ChannelGetData( this.hMixer_DeviceOut, buffer, length );            // num = 実際に転送した長さ\r
 \r
                        if ( num == -1 ) num = 0;\r
 \r
index 21d4a38..e2edfc1 100644 (file)
@@ -95,8 +95,8 @@ namespace FDK
                                }\r
                                else\r
                                {\r
-                                       int n = this.nMasterVolume;     \r
-                                       Trace.TraceInformation( "WASAPI Master Volume Set Success: " + value );\r
+                                       // int n = this.nMasterVolume;  \r
+                                       // Trace.TraceInformation( "WASAPI Master Volume Set Success: " + value );\r
 \r
                                }\r
                        }\r
@@ -296,7 +296,6 @@ namespace FDK
                                info.freq,\r
                                info.chans,\r
                                BASSFlag.BASS_MIXER_NONSTOP | BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_DECODE );       // デコードのみ=発声しない。WASAPIに出力されるだけ。\r
-                               //BASSFlag.BASS_MIXER_NONSTOP | BASSFlag.BASS_SAMPLE_FLOAT );\r
                        if ( this.hMixer == 0 )\r
                        {\r
                                BASSError errcode = Bass.BASS_ErrorGetCode();\r