}\r
public void t再生を再開する( long t ) // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
{\r
+ Debug.WriteLine( "t再生を再開する(long " + t + ")" );\r
+ t再生位置を変更する( t );\r
tサウンドを再生する();\r
}\r
public bool b一時停止中\r
{\r
- get { return ( BassMix.BASS_Mixer_ChannelIsActive( this.hBassStream ) == BASSActive.BASS_ACTIVE_PAUSED ); }\r
+ get\r
+ {\r
+ bool ret = ( BassMix.BASS_Mixer_ChannelIsActive( this.hBassStream ) == BASSActive.BASS_ACTIVE_PAUSED ) &\r
+ ( BassMix.BASS_Mixer_ChannelGetPosition( this.hBassStream ) > 0 );\r
+ return ret;\r
+ }\r
}\r
public bool b再生中\r
{\r
// ミキサーにBASSファイルストリームを追加。\r
\r
BassMix.BASS_Mixer_StreamAddChannel( hMixer, this.hBassStream, BASSFlag.BASS_SPEAKER_FRONT | BASSFlag.BASS_MIXER_PAUSE | BASSFlag.BASS_MIXER_NORAMPIN );\r
- //BassMix.BASS_Mixer_ChannelPause( this.hBassStream ); // 追加すると勝手に再生(ミキサへの出力)が始まるので即停止。\r
\r
\r
// インスタンスリストに登録。\r
// ミキサーにBASSファイルストリームを追加。\r
\r
BassMix.BASS_Mixer_StreamAddChannel( hMixer, this.hBassStream, BASSFlag.BASS_SPEAKER_FRONT | BASSFlag.BASS_MIXER_PAUSE | BASSFlag.BASS_MIXER_NORAMPIN );\r
-// BassMix.BASS_Mixer_ChannelPause( this.hBassStream ); // 追加すると勝手に再生(ミキサへの出力)が始まるので即停止。\r
\r
\r
// インスタンスリストに登録。\r
Debug.WriteLine( "xaデコード開始: " + Path.GetFileName( strファイル名 ) );\r
Cxa xa = new Cxa();\r
xa.Decode( strファイル名, out this.byArrWAVファイルイメージ );\r
-Debug.WriteLine( "デコード完了:" + Path.GetFileName(strファイル名));\r
-//return;\r
+\r
this.e作成方法 = E作成方法.WAVファイルイメージから;\r
this.hGC = GCHandle.Alloc( this.byArrWAVファイルイメージ, GCHandleType.Pinned ); // byte[] をピン留め\r
\r
-Debug.WriteLine( "ピン止め完了:" + Path.GetFileName( strファイル名 ) );\r
- // BASSファイルストリームを作成。\r
- //xah.id = br.ReadUInt32();\r
- //xah.nDataLen = br.ReadUInt32();\r
- //xah.nSamples = br.ReadUInt32();\r
- //xah.nSamplesPerSec = br.ReadUInt16();\r
- //xah.nBits = br.ReadByte();\r
- //xah.nChannels = br.ReadByte();\r
- //xah.nLoopPtr = br.ReadUInt32();\r
- // Debug.WriteLine( "**WAVEFORMATEX**" );\r
- //Debug.WriteLine( "wFormatTag= " + wfx.wFormatTag.ToString("X4") );\r
- //Debug.WriteLine( "nChannels = " + wfx.nChannels.ToString( "X4" ) );\r
- //Debug.WriteLine( "nSamplesPerSec= " + wfx.nSamplesPerSec.ToString( "X8" ) );\r
- //Debug.WriteLine( "nAvgBytesPerSec= " + wfx.nAvgBytesPerSec.ToString( "X8" ) );\r
- //Debug.WriteLine( "nBlockAlign= " + wfx.nBlockAlign.ToString( "X4" ) );\r
- //Debug.WriteLine( "wBitsPerSample= " + wfx.wBitsPerSample.ToString( "X4" ) );\r
- //Debug.WriteLine( "cbSize= " + wfx.cbSize.ToString( "X4" ) );\r
- //xash.pSrc = pXaBuf;\r
- //xash.nSrcLen = xah.nDataLen;\r
- //xash.nSrcUsed = 0;\r
- //xash.pDst = pWavBuf;\r
- //xash.nDstLen = dlen2;\r
- //xash.nDstUsed = 0;\r
- //xaDecodeConvert( hxas, ref xash );\r
-\r
-\r
-//this.hBassStream = Bass.BASS_SampleCreate(256, 28160, 1, 1, BASSFlag.BASS_SAMPLE_LOOP| BASSFlag.BASS_SAMPLE_OVER_POS); // create sample\r
-//if ( this.hBassStream == 0 )\r
-//{\r
-// BASSError err = Bass.BASS_ErrorGetCode();\r
-// Debug.WriteLine( "11BASS_SampleCreate: " + err );\r
-// throw new Exception( "11サウンドストリームの生成に失敗しました。(BASS_SampleCreate: " + err + ")" );\r
-// }\r
-//short[] data = new short[128]; // data buffer\r
-//int a;\r
-//for (a=0; a<128; a++)\r
-// data[a]=(short)(32767.0*Math.Sin((double)a*6.283185/64)); // sine wave\r
-//bool bb=Bass.BASS_SampleSetData(this.hBassStream, data); // set the sample's data\r
-//if ( !bb )\r
-//{\r
-// hGC.Free();\r
-// BASSError err = Bass.BASS_ErrorGetCode();\r
-// Debug.WriteLine( "11BASS_SampleSetData: " + err );\r
-// throw new Exception( "サウンドストリームの生成に失敗しました。(BASS_SampleSetData)" );\r
-//}\r
-\r
-\r
-Debug.WriteLine( "xash.nDstLen=" + xa.xastreamheader.nDstLen + ", xah.nSamplesPerSec=" + xa.xaheader.nSamplesPerSec + ", xah.nChannels=" + xa.xaheader.nChannels );\r
- //this.hBassStream = Bass.BASS_SampleCreate( (int) xash.nDstLen, xah.nSamplesPerSec, xah.nChannels, 1, flags );\r
-//◆ XA Decorder liblary 001 のバグ\r
-//デコード後の XASTREAMHEADER::nDstUsed が大きめの値を返してくるので\r
-//そのままのサイズで再生すると最後にノイズが乗る。\r
-//そこで、xaDecodeConvert() 後のPCMサイズは、次の式で算出する。\r
-//dwPCMSize = nSamples * nChannels * 2;\r
-//(nSamples, nChannels は XAHEADER のメンバ)\r
\r
_myStreamCreate = new STREAMPROC( MyFileProc );\r
\r
- int length = (int) ( xa.xaheader.nSamples * xa.xaheader.nChannels * 2 );\r
-Debug.WriteLine( "length=" + length );\r
-// this.hBassStream = Bass.BASS_SampleCreate( length, xa.xaheader.nSamplesPerSec, xa.xaheader.nChannels, 1, BASSFlag.BASS_STREAM_DECODE );\r
+ // BASSファイルストリームを作成。\r
+\r
this.hBassStream = Bass.BASS_StreamCreate( xa.xaheader.nSamplesPerSec, xa.xaheader.nChannels, BASSFlag.BASS_STREAM_DECODE, _myStreamCreate, IntPtr.Zero );\r
if ( this.hBassStream == 0 )\r
{\r
Debug.WriteLine( "BASS_SampleCreate: " + err );\r
throw new Exception( "サウンドストリームの生成に失敗しました。(BASS_SampleCreate: " + err + ")" );\r
}\r
-Debug.WriteLine( "SampleCreate完了:" + Path.GetFileName( strファイル名 ) );\r
-// bool b = Bass.BASS_SampleSetData( this.hBassStream, this.byArrWAVファイルイメージ); // ★★★★★★★★★★★★★★ 多分bufをshort見せしないとダメ!!!\r
-// if ( !b )\r
-// {\r
-// hGC.Free();\r
-// BASSError err = Bass.BASS_ErrorGetCode();\r
-// Debug.WriteLine( "BASS_SampleSetData: " + err );\r
-// throw new Exception( "サウンドストリームの生成に失敗しました。(BASS_SampleSetData)" );\r
-// }\r
-//Debug.WriteLine( "SampleSetData完了:" + Path.GetFileName( strファイル名 ) );\r
-\r
\r
// ミキサーにBASSファイルストリームを追加。\r
\r
BassMix.BASS_Mixer_StreamAddChannel( hMixer, this.hBassStream, BASSFlag.BASS_SPEAKER_FRONT | BASSFlag.BASS_MIXER_PAUSE | BASSFlag.BASS_MIXER_NORAMPIN );\r
- // BassMix.BASS_Mixer_ChannelPause( this.hBassStream ); // 追加すると勝手に再生(ミキサへの出力)が始まるので即停止。\r
-Debug.WriteLine( "StreamAddChannel完了:" + Path.GetFileName( strファイル名 ) );\r
\r
// インスタンスリストに登録。\r
\r
CSound.listインスタンス.Add( this );\r
-Debug.WriteLine( "listインスタンス.Add完了:" + Path.GetFileName( strファイル名 ) );\r
\r
// nBytesとn総演奏時間の取得; DTXMania用に追加。\r
- //nBytes = Bass.BASS_ChannelGetLength( this.hBassStream );\r
- nBytes = length;\r
+ nBytes = (int) ( xa.xaheader.nSamples * xa.xaheader.nChannels * 2 ); // nBytes = Bass.BASS_ChannelGetLength( this.hBassStream );\r
double seconds = Bass.BASS_ChannelBytes2Seconds( this.hBassStream, nBytes );\r
this.n総演奏時間ms = (int) ( seconds * 1000 );\r
-Debug.WriteLine( "nBytes=" + nBytes + ", n総演奏時間=" + this.n総演奏時間ms );\r
}\r
//-----------------\r
\r
-// private byte[] _data = null; // our local buffer\r
private int pos = 0;\r
private int MyFileProc( int handle, IntPtr buffer, int length, IntPtr user )\r
{\r
-\r
- // increase the data buffer as needed\r
- //if ( _data == null || _data.Length < length )\r
- // _data = new byte[ length ];\r
-\r
int bytesread = ( pos + length > Convert.ToInt32(nBytes) ) ? Convert.ToInt32(nBytes) - pos : length;\r
\r
Marshal.Copy( byArrWAVファイルイメージ, pos, buffer, bytesread );\r
pos += bytesread;\r
\r
- if ( bytesread < length )\r
+ if ( pos >= nBytes )\r
{\r
// set indicator flag\r
bytesread |= (int) BASSStreamProc.BASS_STREAMPROC_END;\r