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
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
//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
\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