OSDN Git Service

#24820 演奏画面でのpauseとresumeが動作するよう修正。(ただし、まだちょっとおかしい)
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sat, 22 Dec 2012 17:27:28 +0000 (17:27 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sat, 22 Dec 2012 17:27:28 +0000 (17:27 +0000)
#24820 xa(からdecodeしたrawデータ)の再生のコールバックでの、データ終了判定条件を変更。
#24820 デバッグコード削除。

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/branches/120724(DTXMania%20with%20%2324820)@470 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
FDK17プロジェクト/コード/03.サウンド/CSound.cs
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/FDK.dll

index 0fa9972..b04284e 100644 (file)
@@ -1600,10 +1600,11 @@ namespace DTXMania
                                                                Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes)", cwav.strコメント文, str, cwav.rSound[ 0 ].nサウンドバッファサイズ, cwav.rSound[ 0 ].bストリーム再生する ? "Stream" : "OnMemory" );\r
                                                        }\r
                                                }\r
-                                               catch\r
+                                               catch ( Exception e )\r
                                                {\r
                                                        cwav.rSound[ i ] = null;\r
                                                        Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str );\r
+                                                       Trace.TraceError( "例外: ", e.Message );\r
                                                }\r
                                        }\r
                                }\r
index 5eacf16..3131628 100644 (file)
@@ -587,11 +587,18 @@ Debug.WriteLine( "★★tサウンドを生成する()" + SoundDevice.e出力デ
                }\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
@@ -844,7 +851,6 @@ Debug.WriteLine( "停止: " + System.IO.Path.GetFileName( this.strファイル
                        // ミキサーに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
@@ -873,7 +879,6 @@ Debug.WriteLine( "停止: " + System.IO.Path.GetFileName( this.strファイル
                        // ミキサーに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
@@ -890,72 +895,15 @@ Debug.WriteLine( "停止: " + System.IO.Path.GetFileName( this.strファイル
                        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
@@ -964,53 +912,31 @@ Debug.WriteLine( "length=" + length );
 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
index 28845dd..4a4729a 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index f7b6f69..9f0a363 100644 (file)
Binary files a/実行時フォルダ/FDK.dll and b/実行時フォルダ/FDK.dll differ