OSDN Git Service

#34712 マスターボリュームの対応を、099系列にバックポートした。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Fri, 26 Dec 2014 22:36:30 +0000 (22:36 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Fri, 26 Dec 2014 22:36:30 +0000 (22:36 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/branches/140113(DTXMania098%20with%2028821%20DTXVmode)@787 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/ステージ/04.コンフィグ/CActConfigList.cs
DTXManiaプロジェクト/コード/全体/CConfigIni.cs
FDK17プロジェクト/コード/03.サウンド/CSound.cs
FDK17プロジェクト/コード/03.サウンド/CSoundDeviceASIO.cs
FDK17プロジェクト/コード/03.サウンド/CSoundDeviceWASAPI.cs
実行時フォルダ(DTXCreator)/dll/FDK.dll
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/dll/FDK.dll

index e876cf5..2d15dc1 100644 (file)
@@ -387,17 +387,17 @@ namespace DTXMania
                        this.list項目リスト.Add( this.iSystemSoundTimerType );\r
 \r
                        // #33700 2013.1.3 yyagi\r
-                       //this.iSystemMasterVolume = new CItemInteger( "MasterVolume", 0, 100, CDTXMania.ConfigIni.nMasterVolume,\r
-                       //    "マスターボリュームの設定:\n" +\r
-                       //    "全体の音量を設定します。\n" +\r
-                       //    "0が無音で、100が最大値です。\n" +\r
-                       //    "(WASAPI/ASIO時のみ有効です)",\r
-                       //    "Master Volume:\n" +\r
-                       //    "You can set 0 - 100.\n" +\r
-                       //    "\n" +\r
-                       //    "Note:\n" +\r
-                       //    "Only for WASAPI/ASIO mode." );\r
-                       //this.list項目リスト.Add( this.iSystemMasterVolume );\r
+                       this.iSystemMasterVolume = new CItemInteger( "MasterVolume", 0, 100, CDTXMania.ConfigIni.nMasterVolume,\r
+                           "マスターボリュームの設定:\n" +\r
+                           "全体の音量を設定します。\n" +\r
+                           "0が無音で、100が最大値です。\n" +\r
+                           "(WASAPI/ASIO時のみ有効です)",\r
+                           "Master Volume:\n" +\r
+                           "You can set 0 - 100.\n" +\r
+                           "\n" +\r
+                           "Note:\n" +\r
+                           "Only for WASAPI/ASIO mode." );\r
+                       this.list項目リスト.Add( this.iSystemMasterVolume );\r
 \r
                        this.iSystemSkinSubfolder = new CItemList( "Skin (General)", CItemBase.Eパネル種別.通常, nSkinIndex,\r
                                "スキン切替:\n" +\r
@@ -1811,10 +1811,10 @@ namespace DTXMania
                }\r
                private void t要素値を上下に変更中の処理()\r
                {\r
-                       //if ( this.list項目リスト[ this.n現在の選択項目 ] == this.iSystemMasterVolume )                            // #33700 2014.4.26 yyagi\r
-                       //{\r
-                       //    CDTXMania.Sound管理.nMasterVolume = this.iSystemMasterVolume.n現在の値;\r
-                       //}\r
+                       if ( this.list項目リスト[ this.n現在の選択項目 ] == this.iSystemMasterVolume )                              // #33700 2014.4.26 yyagi\r
+                       {\r
+                           CDTXMania.Sound管理.nMasterVolume = this.iSystemMasterVolume.n現在の値;\r
+                       }\r
                }\r
 \r
 \r
@@ -2441,7 +2441,7 @@ namespace DTXMania
                private CItemList iGuitarSudHid;                                        // #32072 2013.9.20 yyagi\r
                private CItemList iBassSudHid;                                          // #32072 2013.9.20 yyagi\r
                private CItemBase iSystemReloadDTX;                                     // #32081 2013.10.21 yyagi\r
-               //private CItemInteger iSystemMasterVolume;                     // #33700 2014.4.26 yyagi\r
+               private CItemInteger iSystemMasterVolume;                       // #33700 2014.4.26 yyagi\r
 \r
                private int t前の項目( int nItem )\r
                {\r
@@ -2562,7 +2562,7 @@ namespace DTXMania
 //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(true) );\r
 //Trace.TraceInformation( "Skin現在System  : " + CSkin.strSystemSkinSubfolderFullName );\r
 //Trace.TraceInformation( "Skin現在BoxDef  : " + CSkin.strBoxDefSkinSubfolderFullName );\r
-                       //CDTXMania.ConfigIni.nMasterVolume = this.iSystemMasterVolume.n現在の値;                                                   // #33700 2014.4.26 yyagi\r
+                       CDTXMania.ConfigIni.nMasterVolume = this.iSystemMasterVolume.n現在の値;                                                     // #33700 2014.4.26 yyagi\r
                        CDTXMania.ConfigIni.e判定表示優先度 = (E判定表示優先度) this.iSystemJudgeDispPriority.n現在選択されている項目番号;\r
                }\r
                private void tConfigIniへ記録する・Bass()\r
index 45f1bf6..84f325d 100644 (file)
@@ -1373,12 +1373,12 @@ namespace DTXMania
                        sw.WriteLine( "SoundTimerType={0}", this.bUseOSTimer ? 1 : 0 );\r
                        sw.WriteLine();\r
 \r
-                       //sw.WriteLine( "; 全体ボリュームの設定" );\r
-                       //sw.WriteLine( "; (0=無音 ~ 100=最大。WASAPI/ASIO時のみ有効)" );\r
-                       //sw.WriteLine( "; Master volume settings" );\r
-                       //sw.WriteLine( "; (0=Silent - 100=Max)" );\r
-                       //sw.WriteLine( "MasterVolume={0}", this.nMasterVolume );\r
-                       //sw.WriteLine();\r
+                       sw.WriteLine( "; 全体ボリュームの設定" );\r
+                       sw.WriteLine( "; (0=無音 ~ 100=最大。WASAPI/ASIO時のみ有効)" );\r
+                       sw.WriteLine( "; Master volume settings" );\r
+                       sw.WriteLine( "; (0=Silent - 100=Max)" );\r
+                       sw.WriteLine( "MasterVolume={0}", this.nMasterVolume );\r
+                       sw.WriteLine();\r
 \r
                        #endregion\r
                        #region [ ギター/ベース/ドラム 有効/無効 ]\r
@@ -2237,10 +2237,10 @@ namespace DTXMania
                                                                                        {\r
                                                                                                this.bUseOSTimer = C変換.bONorOFF( str4[ 0 ] );\r
                                                                                        }\r
-                                                                                       //else if ( str3.Equals( "MasterVolume" ) )\r
-                                                                                       //{\r
-                                                                                       //    this.nMasterVolume = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 100, this.nMasterVolume );\r
-                                                                                       //}\r
+                                                                                       else if ( str3.Equals( "MasterVolume" ) )\r
+                                                                                       {\r
+                                                                                           this.nMasterVolume = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 100, this.nMasterVolume );\r
+                                                                                       }\r
                                                                                        #endregion\r
                                                                                        else if ( str3.Equals( "VSyncWait" ) )\r
                                                                                        {\r
index f51727c..856eeaf 100644 (file)
@@ -48,49 +48,6 @@ namespace FDK
                        {\r
                                return _nMasterVolume;\r
                        }\r
-                       //get\r
-                       //{\r
-                       //    if ( SoundDeviceType == ESoundDeviceType.ExclusiveWASAPI || SoundDeviceType == ESoundDeviceType.ASIO )\r
-                       //    {\r
-                       //        return Bass.BASS_GetConfig(BASSConfig.BASS_CONFIG_GVOL_STREAM ) / 100;\r
-                       //    }\r
-                       //    else\r
-                       //    {\r
-                       //        return 100;\r
-                       //    }\r
-                       //}\r
-                       //set\r
-                       //{\r
-                       //    if ( SoundDeviceType == ESoundDeviceType.ExclusiveWASAPI )\r
-                       //    {\r
-                       //        bool b = BassWasapi.BASS_WASAPI_SetVolume( BASSWASAPIVolume.BASS_WASAPI_CURVE_LINEAR, value / 100.0f );\r
-                       //        if ( !b )\r
-                       //        {\r
-                       //            BASSError be = Bass.BASS_ErrorGetCode();\r
-                       //            Trace.TraceInformation( "WASAPI Master Volume Set Error: " + be.ToString() );\r
-                       //        }\r
-                       //    }\r
-                       //}\r
-                       //set\r
-                       //{\r
-                       //    if ( SoundDeviceType == ESoundDeviceType.ExclusiveWASAPI || SoundDeviceType == ESoundDeviceType.ASIO )\r
-                       //    {\r
-                       //        bool b = Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_GVOL_STREAM, value * 100 );\r
-                       //        if ( !b )\r
-                       //        {\r
-                       //            BASSError be = Bass.BASS_ErrorGetCode();\r
-                       //            Trace.TraceInformation( "Master Volume Set Error: " + be.ToString() );\r
-                       //        }\r
-                       //    }\r
-                       //}\r
-                       //set\r
-                       //{\r
-                       //    if ( SoundDeviceType == ESoundDeviceType.ExclusiveWASAPI || SoundDeviceType == ESoundDeviceType.ASIO )\r
-                       //    {\r
-                       //        var nodes = new BASS_MIXER_NODE[ 1 ] { new BASS_MIXER_NODE( 0, (float) value ) };\r
-                       //        BassMix.BASS_Mixer_ChannelSetEnvelope( SoundDevice.hMixer, BASSMIXEnvelope.BASS_MIXER_ENV_VOL, nodes );\r
-                       //    }\r
-                       //}\r
                        set\r
                        {\r
                                SoundDevice.nMasterVolume = value;\r
index 1679acc..5c28642 100644 (file)
@@ -85,23 +85,35 @@ namespace FDK
                {\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 = BassAsio.BASS_ASIO_ErrorGetCode();\r
+                                       BASSError be = Bass.BASS_ErrorGetCode();\r
                                        Trace.TraceInformation( "ASIO Master Volume Get Error: " + be.ToString() );\r
-                                       f音量 = 0.0f;\r
+                               }\r
+                               else\r
+                               {\r
+                                       Trace.TraceInformation( "ASIO 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
+                               //bool b = Bass.BASS_SetVolume( value / 100.0f );\r
                                if ( !b )\r
                                {\r
-                                       BASSError be = BassAsio.BASS_ASIO_ErrorGetCode();\r
+                                       BASSError be = Bass.BASS_ErrorGetCode();\r
                                        Trace.TraceInformation( "ASIO Master Volume Set Error: " + be.ToString() );\r
                                }\r
+                               else\r
+                               {\r
+                                       //int n = this.nMasterVolume;   \r
+                                       //Trace.TraceInformation( "ASIO Master Volume Set Success: " + value );\r
+\r
+                               }\r
                        }\r
                }\r
 \r
@@ -291,6 +303,33 @@ namespace FDK
                        long nミキサーの1サンプルあたりのバイト数 = mixerInfo.chans * nサンプルサイズbyte;\r
                        this.nミキサーの1秒あたりのバイト数 = nミキサーの1サンプルあたりのバイト数 * mixerInfo.freq;\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 +410,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 +426,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 fadeec1..462b2b6 100644 (file)
@@ -64,14 +64,15 @@ namespace FDK
                                }\r
                                else\r
                                {\r
-                                       Trace.TraceInformation( "WASAPI Master Volume Get Success: " + (f音量 * 100) );\r
+                                       //Trace.TraceInformation( "WASAPI Master Volume Get Success: " + (f音量 * 100) );\r
 \r
                                }\r
                                return (int) ( f音量 * 100 );\r
                        }\r
                        set\r
                        {\r
-                               bool b = Bass.BASS_SetVolume( value / 100.0f );\r
+                               bool b = Bass.BASS_ChannelSetAttribute( this.hMixer, BASSAttribute.BASS_ATTRIB_VOL, (float) ( value / 100.0 ) );\r
+                               //bool b = Bass.BASS_SetVolume( value / 100.0f );\r
                                // hMixerに対するBASS_ChannelSetAttribute()でBASS_ATTRIB_VOLを変更: 出力音量に反映されず\r
                                // Bass_SetVolume(): BASS_ERROR_NOTAVIL ("no sound" deviceには適用不可)\r
 \r
@@ -288,13 +289,13 @@ namespace FDK
                                info.freq,\r
                                info.chans,\r
                                BASSFlag.BASS_MIXER_NONSTOP | BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_DECODE );       // デコードのみ=発声しない。WASAPIに出力されるだけ。\r
-                       if (this.hMixer == 0)\r
+                       if ( this.hMixer == 0 )\r
                        {\r
                                BASSError errcode = Bass.BASS_ErrorGetCode();\r
                                BassWasapi.BASS_WASAPI_Free();\r
                                Bass.BASS_Free();\r
                                this.bIsBASSFree = true;\r
-                               throw new Exception( string.Format( "BASSミキサの作成に失敗しました。[{0}]", errcode ) );\r
+                               throw new Exception( string.Format( "BASSミキサ(mixing)の作成に失敗しました。[{0}]", errcode ) );\r
                        }\r
 \r
 \r
@@ -304,6 +305,37 @@ namespace FDK
                        long nミキサーの1サンプルあたりのバイト数 = mixerInfo.chans * 4;       // 4 = sizeof(FLOAT)\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
+                               info.freq,\r
+                               info.chans,\r
+                               BASSFlag.BASS_MIXER_NONSTOP | BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_DECODE );       // デコードのみ=発声しない。WASAPIに出力されるだけ。\r
+                       if ( this.hMixer_DeviceOut == 0 )\r
+                       {\r
+                               BASSError errcode = Bass.BASS_ErrorGetCode();\r
+                               BassWasapi.BASS_WASAPI_Free();\r
+                               Bass.BASS_Free();\r
+                               this.bIsBASSFree = true;\r
+                               throw new Exception( string.Format( "BASSミキサ(最終段)の作成に失敗しました。[{0}]", errcode ) );\r
+                       }\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
+                                       BassWasapi.BASS_WASAPI_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
                        BassWasapi.BASS_WASAPI_Start();\r
@@ -364,13 +396,14 @@ namespace FDK
                #endregion\r
 \r
                protected int hMixer = -1;\r
+               protected int hMixer_DeviceOut = -1;\r
                protected WASAPIPROC tWasapiProc = null;\r
 \r
                protected int tWASAPI処理( IntPtr buffer, int length, IntPtr user )\r
                {\r
                        // BASSミキサからの出力データをそのまま WASAPI 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
                        if ( num == -1 ) num = 0;\r
 \r
 \r
index 0d47b1e..adaa320 100644 (file)
Binary files a/実行時フォルダ(DTXCreator)/dll/FDK.dll and b/実行時フォルダ(DTXCreator)/dll/FDK.dll differ
index ade3eb1..19f1763 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 0d47b1e..adaa320 100644 (file)
Binary files a/実行時フォルダ/dll/FDK.dll and b/実行時フォルダ/dll/FDK.dll differ