//);\r
// wc.rSound[ i ].t再生位置を変更する( wc.rSound[ i ].t時刻から位置を返す( nAbsTimeFromStartPlaying ) );\r
wc.rSound[ i ].t再生位置を変更する( nAbsTimeFromStartPlaying ); // WASAPI/ASIO用\r
+//Debug.WriteLine( "再生位置を変更: " + Path.GetFileName( wc.strファイル名 ) + nAbsTimeFromStartPlaying + "ms");\r
}\r
}\r
}\r
}\r
}\r
+\r
+ /// <summary>\r
+ /// デバッグ用\r
+ /// </summary>\r
+ public void tWaveBGM再生位置表示()\r
+ {\r
+ foreach ( CWAV wc in this.listWAV.Values )\r
+ {\r
+ if ( wc.rSound[ 0 ] != null && wc.rSound[ 0 ].n総演奏時間ms >= 5000 )\r
+ {\r
+ for ( int i = 0; i < nPolyphonicSounds; i++ )\r
+ {\r
+ if ( ( wc.rSound[ i ] != null ) && ( wc.rSound[ i ].b再生中 ) )\r
+ {\r
+ long n位置byte;\r
+ double db位置ms;\r
+ wc.rSound[ i ].t再生位置を取得する( out n位置byte, out db位置ms );\r
+ Trace.TraceInformation( "再生位置: {0}, seek先={1}ms / {2}byte, 全音長={3}ms",\r
+ Path.GetFileName( wc.rSound[ 0 ].strファイル名 ),\r
+ db位置ms, n位置byte,\r
+ wc.rSound[ 0 ].n総演奏時間ms\r
+ );\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
public void tWavの再生停止( int nWaveの内部番号 )\r
{\r
tWavの再生停止( nWaveの内部番号, false );\r
//CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Frame: {0:####0} fps", CDTXMania.FPS.n現在のFPS ) );\r
CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Frame: {0} fps", CDTXMania.FPS.n現在のFPS ) );\r
y -= 0x10 * 2;\r
- CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound CPU : {0:####0.00}%", CDTXMania.Sound管理.GetCPUusage() ) );\r
- y -= 0x10 * 2;\r
- CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Mixing: {0:####0}", CDTXMania.Sound管理.GetMixingStreams() ) );\r
- y -= 0x10 * 2;\r
- CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Streams: {0:####0}", CDTXMania.Sound管理.GetStreams() ) );\r
- y -= 0x10 * 2;\r
+ //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound CPU : {0:####0.00}%", CDTXMania.Sound管理.GetCPUusage() ) );\r
+ //y -= 0x10 * 2;\r
+ //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Mixing: {0:####0}", CDTXMania.Sound管理.GetMixingStreams() ) );\r
+ //y -= 0x10 * 2;\r
+ //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Streams: {0:####0}", CDTXMania.Sound管理.GetStreams() ) );\r
+ //y -= 0x10 * 2;\r
}\r
}\r
}\r
}\r
catch( Exception e )\r
{\r
- Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + e.ToString() );\r
+ Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + e.ToString() + ": " + n位置ms + "ms" );\r
}\r
finally\r
{\r
if ( !b )\r
{\r
BASSError be = Bass.BASS_ErrorGetCode();\r
- Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + be.ToString() );\r
+ Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + be.ToString() + ": " + n位置ms + "MS" );\r
}\r
}\r
+ //if ( this.n総演奏時間ms > 5000 )\r
+ //{\r
+ // Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seeked to " + n位置ms + "ms = " + Bass.BASS_ChannelSeconds2Bytes( this.hBassStream, n位置ms * this.db周波数倍率 * this.db再生速度 / 1000.0 ) );\r
+ //}\r
}\r
else if( this.bDirectSoundである )\r
{\r
{\r
Trace.TraceError( "{0}: Seek error: {1}", Path.GetFileName( this.strファイル名 ), n位置ms, e.Message );\r
}\r
+ //if ( this.n総演奏時間ms > 5000 )\r
+ //{\r
+ // Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seeked to " + n位置ms + "ms = " + n位置sample );\r
+ //}\r
+ }\r
+ }\r
+ /// <summary>\r
+ /// デバッグ用\r
+ /// </summary>\r
+ /// <param name="n位置byte"></param>\r
+ /// <param name="db位置ms"></param>\r
+ public void t再生位置を取得する( out long n位置byte, out double db位置ms )\r
+ {\r
+ if ( this.bBASSサウンドである )\r
+ {\r
+ n位置byte = BassMix.BASS_Mixer_ChannelGetPosition( this.hBassStream );\r
+ db位置ms = Bass.BASS_ChannelBytes2Seconds( this.hBassStream, n位置byte );\r
+ }\r
+ else if ( this.bDirectSoundである )\r
+ {\r
+ n位置byte = this.Buffer.CurrentPlayPosition;\r
+ db位置ms = n位置byte / this.Buffer.Format.SamplesPerSecond / 0.001 / _db周波数倍率 / _db再生速度;\r
+ }\r
+ else\r
+ {\r
+ n位置byte = 0;\r
+ db位置ms = 0.0;\r
}\r
}\r
\r
+\r
public static void tすべてのサウンドを初期状態に戻す()\r
{\r
foreach ( var sound in CSound.listインスタンス )\r
\r
private void tBASSサウンドを作成する( string strファイル名, int hMixer, BASSFlag flags )\r
{\r
- if ( String.Compare( Path.GetExtension( strファイル名 ), ".xa", true ) == 0 ) // caselessで文字列比較\r
+ #region [ xaとwav(RIFF chunked vorbis)に対しては専用の処理をする ]\r
+ switch ( Path.GetExtension( strファイル名 ) )\r
{\r
- tBASSサウンドを作成するXA( strファイル名, hMixer, flags );\r
- return;\r
+ case ".xa":\r
+ tBASSサウンドを作成するXA( strファイル名, hMixer, flags );\r
+ return;\r
+\r
+ case ".wav":\r
+ if ( tRIFFchunkedVorbisならDirectShowでDecodeする( strファイル名, ref byArrWAVファイルイメージ ) )\r
+ {\r
+ tBASSサウンドを作成する( byArrWAVファイルイメージ, hMixer, flags );\r
+ return;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
+ #endregion\r
\r
this.e作成方法 = E作成方法.ファイルから;\r
this.strファイル名 = strファイル名;\r
\r
tBASSサウンドを作成する・ストリーム生成後の共通処理( hMixer );\r
}\r
+\r
+ /// <summary>\r
+ /// Decode "RIFF chunked Vorbis" to "raw wave"\r
+ /// because BASE.DLL has two problems for RIFF chunked Vorbis;\r
+ /// 1. time seek is not fine 2. delay occurs (about 10ms)\r
+ /// </summary>\r
+ /// <param name="strファイル名">wave filename</param>\r
+ /// <param name="byArrWAVファイルイメージ">wav file image</param>\r
+ /// <returns></returns>\r
+ private bool tRIFFchunkedVorbisならDirectShowでDecodeする( string strファイル名, ref byte[] byArrWAVファイルイメージ )\r
+ {\r
+ bool bファイルにVorbisコンテナが含まれている = false;\r
+\r
+ #region [ ファイルがWAVかつ、Vorbisコンテナが含まれているかを調べ、それに該当するなら、DirectShowでデコードする。]\r
+ //-----------------\r
+ try\r
+ {\r
+ using ( var ws = new WaveStream( strファイル名 ) )\r
+ {\r
+ if ( ws.Format.FormatTag == (WaveFormatTag) 0x6770 || // Ogg Vorbis Mode 2+\r
+ ws.Format.FormatTag == (WaveFormatTag) 0x6771 ) // Ogg Vorbis Mode 3+\r
+ {\r
+ Trace.TraceInformation( Path.GetFileName( strファイル名 ) + ": RIFF chunked Vorbis. Decode to raw Wave first, to avoid BASS.DLL troubles" );\r
+ CDStoWAVFileImage.t変換( strファイル名, out byArrWAVファイルイメージ );\r
+ bファイルにVorbisコンテナが含まれている = true;\r
+ }\r
+ }\r
+ }\r
+ catch\r
+ {\r
+ Trace.TraceWarning( "Error: " + Path.GetFileName( strファイル名 ) + " : RIFF chunked Vorbisのデコードに失敗しました。" );\r
+ }\r
+ #endregion\r
+\r
+ return bファイルにVorbisコンテナが含まれている;\r
+ }\r
+\r
private void tBASSサウンドを作成するXA( string strファイル名, int hMixer, BASSFlag flags )\r
{\r
int nPCMデータの先頭インデックス;\r