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
}\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
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
//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
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
{\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
{\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
{\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
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
\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
\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
}\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
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
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
#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