OSDN Git Service

機能強化
authoryyagi <yyagi.dtxmania@gmail.com>
Mon, 11 Dec 2017 14:56:10 +0000 (23:56 +0900)
committeryyagi <yyagi.dtxmania@gmail.com>
Mon, 11 Dec 2017 14:56:10 +0000 (23:56 +0900)
#37231 Win10の低遅延サウンド再生方式に対応。WASAPI共有モードで、10ms程度のレイテンシを得られます。
#xxxxx 起動時に出力する環境ログ出力の大幅強化。

バグ修正
#37775 起動時に例外が発生する場合がある問題を修正。
#37243 アプリ起動中にサウンド設定を変更すると、設定変更に失敗して勝手にWASAPI(Shared)になってしまう問題を修正。
#37273 Win8.1以降のOSを使用していても、DTXManiaLog.txt 内のOSバージョンが、6.2.9200.0 (Win8.0) となってしまう問題を修正。

17 files changed:
.gitignore
DTXMania.sln
DTXMania/DTXMania.csproj
DTXMania/Properties/AssemblyInfo.cs
DTXMania/コード/全体/CDTXMania.cs
DTXViewerプロジェクト/@DTXViewerプロジェクト/Resource/Thumbs.db [deleted file]
FDK/FDK.csproj
FDK/コード/00.共通/COS.cs
FDK/コード/03.サウンド/CSound.cs
FDK/コード/03.サウンド/CSoundDeviceWASAPI.cs
RuntimeResources/DTXCreator.exe
RuntimeResources/DTXManiaGR.exe
RuntimeResources/dll/FDK.dll
RuntimeResources/dll/bassmix.dll
RuntimeResources/dll/basswasapi.dll
RuntimeResources/ja-JP/DTXCreator.resources.dll
RuntimeResources/ja-JP/DTXManiaGR.resources.dll

index 4b0c1e6..731e4ec 100644 (file)
@@ -266,3 +266,4 @@ paket-files/
 # Python Tools for Visual Studio (PTVS)
 __pycache__/
 *.pyc
+Thumbs.db
index 8a6d4d7..c2f168e 100644 (file)
@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26430.6
+VisualStudioVersion = 15.0.27004.2002
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FDK", "FDK\FDK.csproj", "{BCD40908-F3E2-4707-BFAA-1DD99DF6357D}"
 EndProject
@@ -31,4 +31,7 @@ Global
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
        EndGlobalSection
+       GlobalSection(ExtensibilityGlobals) = postSolution
+               SolutionGuid = {AFC495EE-6FF0-43DA-9AE0-1EEFCE8F5338}
+       EndGlobalSection
 EndGlobal
index 3b52ec3..f43e49a 100644 (file)
@@ -91,6 +91,7 @@
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Management" />
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Web" />
     <Reference Include="System.Windows.Forms" />
index dc1226b..efc6eae 100644 (file)
@@ -11,7 +11,7 @@ using System.Resources;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("DTXManiaGR")]
-[assembly: AssemblyCopyright( "Copyright (C) 2000-2017 DTXMania Group" )]
+[assembly: AssemblyCopyright( "Copyright (C) 2000-2018 DTXMania Group" )]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -33,8 +33,8 @@ using System.Resources;
 // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を 
 // 既定値にすることができます:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("110.0.0.0")]
-[assembly: AssemblyFileVersion("110.0.0.0")]
+[assembly: AssemblyVersion("111.0.0.0")]
+[assembly: AssemblyFileVersion("111.0.0.0")]
 [assembly: NeutralResourcesLanguageAttribute("ja-JP")]
 
 // このアセンブリは「ライブラリ」である(難読化ツールへの指示)。
index ae4a10f..3728449 100644 (file)
@@ -7,6 +7,7 @@ using System.Drawing;
 using System.Diagnostics;
 using System.IO;
 using System.Threading;
+using System.Management;
 using SharpDX;
 using SharpDX.Direct3D9;
 using FDK;
@@ -23,7 +24,7 @@ namespace DTXMania
        {
                // プロパティ
                #region [ properties ]
-               public static readonly string VERSION = "110(170901)";
+               public static readonly string VERSION = "111(180101)";
                public static readonly string SLIMDXDLL = "c_net20x86_Jun2010";
                public static readonly string D3DXDLL = "d3dx9_43.dll";     // June 2010
                                                                                                                                                                                                                                                                //public static readonly string D3DXDLL = "d3dx9_42.dll";       // February 2010
@@ -197,13 +198,13 @@ namespace DTXMania
                        #endregion
 
                        #region [ 言語リソースの初期化 ]
-                       Trace.TraceInformation( "言語リソースの初期化を行います。" );
+                       Trace.TraceInformation("言語リソースの初期化を行います。");
                        Trace.Indent();
                        try
                        {
                                Resources = new CResources();
-                               Resources.LoadResources( "" );
-                               Trace.TraceInformation( "言語リソースの初期化を完了しました。" );
+                               Resources.LoadResources("");
+                               Trace.TraceInformation("言語リソースの初期化を完了しました。");
                        }
                        finally
                        {
@@ -257,21 +258,21 @@ namespace DTXMania
                        Trace.WriteLine("");
                        Trace.TraceInformation("----------------------");
                        Trace.TraceInformation("■ アプリケーションの初期化");
-                       Trace.TraceInformation("OS Version: " + Environment.OSVersion);
-                       Trace.TraceInformation("ProcessorCount: " + Environment.ProcessorCount.ToString());
-                       Trace.TraceInformation("CLR Version: " + Environment.Version.ToString());
+
+                       PutSystemLog();
+
+
                        #endregion
 
                        #region [ 言語の設定 ]
-                       Trace.TraceInformation( "言語情報の読み込みを開始します。" );
+                       Trace.TraceInformation("言語情報の読み込みを開始します。");
                        //Debug.WriteLine( "language=" + Resources.Language );
                        //Debug.WriteLine( "settings=" + instance.ConfigIni.strLanguage );
                        Resources.Language = instance.ConfigIni.strLanguage;
-                       Trace.TraceInformation( "言語を{0}に設定しました。", Resources.Language );
+                       Trace.TraceInformation("言語を{0}に設定しました。", Resources.Language);
 
                        #endregion
 
-       
                        #region [ DTXVmodeクラス の初期化 ]
                        //Trace.TraceInformation( "DTXVモードの初期化を行います。" );
                        //Trace.Indent();
@@ -340,7 +341,7 @@ namespace DTXMania
                                        }
 
                                        CDTXMania.Instance.ConfigIni.bFullScreen.Value = false;
-                                       CDTXMania.Instance.ConfigIni.rcWindow_backup = CDTXMania.Instance.ConfigIni.rcWindow;           // #36612 2016.9.12 yyagi
+                                       CDTXMania.Instance.ConfigIni.rcWindow_backup = CDTXMania.Instance.ConfigIni.rcWindow;       // #36612 2016.9.12 yyagi
                                        CDTXMania.Instance.ConfigIni.rcWindow.W = CDTXMania.Instance.ConfigIni.rcViewerWindow.W;
                                        CDTXMania.Instance.ConfigIni.rcWindow.H = CDTXMania.Instance.ConfigIni.rcViewerWindow.H;
                                        CDTXMania.Instance.ConfigIni.rcWindow.X = CDTXMania.Instance.ConfigIni.rcViewerWindow.X;
@@ -378,7 +379,7 @@ namespace DTXMania
                        }
                        else
                        {
-                               Trace.TraceInformation( "通常モードで起動します。" );
+                               Trace.TraceInformation("通常モードで起動します。");
                        }
                        #endregion
 
@@ -484,10 +485,10 @@ namespace DTXMania
                        settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;
                        settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;
                        settings.EnableVSync = ConfigIni.bVSyncWait;
-            //settings.MultisampleType = MultisampleType.FourSamples;
-            //settings.MultisampleQuality = 3;
-            //settings.MultisampleType = MultisampleType.NonMaskable;
-            //settings.Multithreaded = true;
+                       //settings.MultisampleType = MultisampleType.FourSamples;
+                       //settings.MultisampleQuality = 3;
+                       //settings.MultisampleType = MultisampleType.NonMaskable;
+                       //settings.Multithreaded = true;
 
 
                        try
@@ -554,7 +555,7 @@ namespace DTXMania
                                Resources.csvCurrentPath = CDTXMania.Instance.ConfigIni.strSystemSkinSubfolderPath.Value;
                                Trace.TraceInformation("Skin Path:" + Resources.csvCurrentPath);
 
-                bool ret = Resources.LoadResources(instance.ConfigIni.strLanguage);
+                               bool ret = Resources.LoadResources(instance.ConfigIni.strLanguage);
                                if (ret)
                                {
                                        Trace.TraceInformation("スキンフォルダ内に言語リソースが見つかりました。この言語リソースを使用します。");
@@ -822,6 +823,7 @@ namespace DTXMania
                        #endregion
                }
 
+
                public void t全画面_ウィンドウモード切り替え()
                {
 #if WindowedFullscreen
@@ -1026,6 +1028,10 @@ namespace DTXMania
                }
                protected override void Draw(GameTime gameTime)
                {
+                       if (Sound管理 == null)
+                       {
+                               return;
+                       }
                        Sound管理.t再生中の処理をする();
 
                        if (Timer != null)
@@ -1969,7 +1975,7 @@ namespace DTXMania
                        }
                        #endregion
 
-                       //GC.Collect( 0, GCCollectionMode.Optimized, false );           // Rel105で処理が重くなっていることに対する、暫定処置。
+                       GC.Collect( 0, GCCollectionMode.Optimized, false );             // Rel105で処理が重くなっていることに対する、暫定処置。
                                                                                                                                        // 重くなっている原因に対する適切な処置をして、処理が104程度に軽くなったら、
                                                                                                                                        // この暫定処置は削除します。
                }
@@ -2893,5 +2899,145 @@ namespace DTXMania
                                bマウスカーソル表示中 = false;
                        }
                }
+
+               /// <summary>
+               /// システム環境のログを出力する
+               /// </summary>
+               private void PutSystemLog()
+               {
+                       System.Management.ManagementClass mc =
+                               new System.Management.ManagementClass("Win32_Processor");
+                       System.Management.ManagementObjectCollection moc = mc.GetInstances();
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("-------------------------");
+                               Trace.TraceInformation("CPU Information:");
+                               //Trace.TraceInformation("DeviceID      = {0}", mo["DeviceID"]);
+                               Trace.TraceInformation("Name          = {0}", mo["Name"]);
+                               Trace.TraceInformation("MaxClockSpeed = {0}MHz", mo["MaxClockSpeed"]);
+                               Trace.TraceInformation("L2CacheSize   = {0}KB", mo["L2CacheSize"]);
+                               Trace.TraceInformation("L3CacheSize   = {0}KB", mo["L3CacheSize"]);
+                               Trace.TraceInformation("NumberOfLogicalProcessors = {0}", mo["NumberOfLogicalProcessors"]);
+                       }
+                       moc.Dispose();
+                       moc.Dispose();
+
+                       //System.Management.ManagementClass mc =
+                       //      new System.Management.ManagementClass("Win32_OperatingSystem");
+                       //System.Management.ManagementObjectCollection moc = mc.GetInstances();
+                       mc =
+                               new System.Management.ManagementClass("Win32_OperatingSystem");
+                       moc = mc.GetInstances();
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("-------------------------");
+                               Trace.TraceInformation("OS Information:");
+                               //簡単な説明(Windows 8.1では「Microsoft Windows 8.1 Pro」等)
+                               Trace.TraceInformation("OS: " + mo["Caption"]);
+                               //バージョン(Windows 8.1では、「6.3.9600」)
+                               Trace.TraceInformation("Version: " + mo["Version"]);
+                               //ビルド番号(Windows 8.1では「9600」)
+                               //Trace.TraceInformation( "BuildNumber: " + mo["BuildNumber"]);
+
+                               //サービスパック(Windows 8.1ではNULL)
+                               Trace.TraceInformation("CSDVersion (ServicePack): " + mo["CSDVersion"]);
+                               //言語(日本語は「1041」)
+                               Trace.TraceInformation("OSLanguage: " + mo["OSLanguage"]);
+
+                               Trace.TraceInformation("OSArchitecture: " + mo["OSArchitecture"]);
+
+                               //Trace.TraceInformation("TotalVisibleMemorySize = {0}", mo["TotalVisibleMemorySize"]);
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       Trace.TraceInformation("-------------------------");
+                       Trace.TraceInformation("General Environment Information:");
+                       //Trace.TraceInformation("OS Version: " + Environment.OSVersion);       // fake version will be returned (due to the lack of manifest settings)
+                       //Trace.TraceInformation("ProcessorCount: " + Environment.ProcessorCount.ToString());
+                       Trace.TraceInformation("CLR Version: " + Environment.Version.ToString());
+                       Trace.TraceInformation("SystemPageSize: " + Environment.SystemPageSize.ToString());
+
+                       var cominfo = new Microsoft.VisualBasic.Devices.ComputerInfo();
+                       Trace.TraceInformation("TotalPhysicalMemorySize: {0:F2}GB", (cominfo.TotalPhysicalMemory / 1024f / 1024f / 1024f));
+                       Trace.TraceInformation("VirtialMemorySize: {0:F2}GB", (cominfo.TotalVirtualMemory / 1024f / 1024f / 1024f));
+                       Trace.TraceInformation("FreePhysicalMemorySize: {0:F2}MB", (cominfo.AvailablePhysicalMemory / 1024f / 1024f));
+                       Trace.TraceInformation("FreeVirtualMemorySize: {0:F2}MB", (cominfo.AvailableVirtualMemory / 1024f / 1024f));
+                       //Trace.TraceInformation(cominfo.OSFullName + ", " + cominfo.OSPlatform + ", " + cominfo.OSVersion);
+
+                       mc = new System.Management.ManagementClass("Win32_PhysicalMemory");
+                       moc = mc.GetInstances();
+                       Trace.TraceInformation("-------------------------");
+                       Trace.TraceInformation("Physical Memory Information:");
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("Capacity: {0:F2}GB", (Convert.ToInt64(mo["Capacity"]) / 1024f / 1024f / 1024f));
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       mc = new System.Management.ManagementClass("Win32_DisplayControllerConfiguration");
+                       moc = mc.GetInstances();
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("-------------------------");
+                               Trace.TraceInformation("Display Adapter Information:");
+                               Trace.TraceInformation("Name: " + mo["Name"]);
+                               Trace.TraceInformation("VideoMode: " + mo["VideoMode"]);
+                               Trace.TraceInformation("HorizontalResolution: " + mo["HorizontalResolution"]);
+                               Trace.TraceInformation("VerticalResolution: " + mo["VerticalResolution"]);
+                               Trace.TraceInformation("RefreshRate: " + mo["RefreshRate"]);
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       mc = new System.Management.ManagementClass("Win32_VideoController");
+                       moc = mc.GetInstances();
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("-------------------------");
+                               Trace.TraceInformation("Video Controller Information:");
+                               Trace.TraceInformation("Description: " + mo["Description"]);
+                               Trace.TraceInformation("AdapterRAM: {0}MB", (Convert.ToInt64(mo["AdapterRAM"]) / 1024f / 1024f));
+                               Trace.TraceInformation("CapabilityDescriptions: " + mo["CapabilityDescriptions"]);
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       mc = new System.Management.ManagementClass("Win32_DesktopMonitor");
+                       moc = mc.GetInstances();
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("-------------------------");
+                               Trace.TraceInformation("Display Information:");
+                               Trace.TraceInformation("Description: " + mo["Description"]);
+                               Trace.TraceInformation("PixelsPerXLogicalInch: " + mo["PixelsPerXLogicalInch"]);
+                               Trace.TraceInformation("PixelsPerYLogicalInch: " + mo["PixelsPerYLogicalInch"]);
+                               Trace.TraceInformation("ScreenWidth: " + mo["ScreenWidth"]);
+                               Trace.TraceInformation("ScreenHeight: " + mo["ScreenHeight"]);
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       mc = new System.Management.ManagementClass("Win32_SoundDevice");
+                       moc = mc.GetInstances();
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               Trace.TraceInformation("-------------------------");
+                               Trace.TraceInformation("Sound Information:");
+                               //Trace.TraceInformation("Caption: " + mo["Caption"]);
+                               Trace.TraceInformation("ProductName: " + mo["ProductName"]);
+                               //Trace.TraceInformation("DMABufferSize: " + mo["DMABufferSize"]);
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       Trace.TraceInformation("----------------------");
+                       Trace.TraceInformation("DTXMania settings:");
+                       Trace.TraceInformation("VSyncWait: " + ConfigIni.bVSyncWait.ToString());
+                       Trace.TraceInformation("Fullscreen: " + ConfigIni.bFullScreen.ToString());
+                       Trace.TraceInformation("----------------------");
+               }
+
        }
 }
diff --git a/DTXViewerプロジェクト/@DTXViewerプロジェクト/Resource/Thumbs.db b/DTXViewerプロジェクト/@DTXViewerプロジェクト/Resource/Thumbs.db
deleted file mode 100644 (file)
index a96ed4c..0000000
Binary files a/DTXViewerプロジェクト/@DTXViewerプロジェクト/Resource/Thumbs.db and /dev/null differ
index 8c99125..46560b1 100644 (file)
@@ -92,6 +92,7 @@
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Management" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
   </ItemGroup>
index 32fb6e2..d0d694b 100644 (file)
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Management;
 
 namespace FDK
 {
@@ -58,13 +59,21 @@ namespace FDK
                private static bool bCheckOSVersion(int major, int minor)
                {
                        //プラットフォームの取得
-                       System.OperatingSystem os = System.Environment.OSVersion;
-                       if (os.Platform != PlatformID.Win32NT)      // NT系でなければ、XP以前か、PC Windows系以外のOS。
+                       //System.OperatingSystem os = System.Environment.OSVersion;
+                       //if (os.Platform != PlatformID.Win32NT)      // NT系でなければ、XP以前か、PC Windows系以外のOS。
+                       //{
+                       //      return false;
+                       //}
+                       //var mmb = tpGetOSVersion();
+                       int _major, _minor, _build;
+                       tpGetOSVersion(out _major, out _minor, out _build);
+
+                       //if (os.Version.Major >= major && os.Version.Minor >= minor)
+                       if (_major > major)
                        {
-                               return false;
+                               return true;
                        }
-
-                       if (os.Version.Major >= major && os.Version.Minor >= minor)
+                       else if (_major == major && _minor >= minor)
                        {
                                return true;
                        }
@@ -73,5 +82,73 @@ namespace FDK
                                return false;
                        }
                }
+
+
+               //public static (int major, int minor, int build) tpGetOSVersion()
+               public static void tpGetOSVersion(out int major, out int minor, out int build)
+               {
+                       //var result = (major: 0, minor: 0, build: 0);
+                       major = 0;
+                       minor = 0;
+                       build = 0;
+
+                       System.Management.ManagementClass mc =
+                               new System.Management.ManagementClass("Win32_OperatingSystem");
+                       System.Management.ManagementObjectCollection moc = mc.GetInstances();
+
+                       foreach (System.Management.ManagementObject mo in moc)
+                       {
+                               string ver = mo["Version"].ToString();
+                               string[] majorminor = ver.Split(new char[] { '.' }, StringSplitOptions.None);
+
+                               major = Convert.ToInt32(majorminor[0]);
+                               minor = Convert.ToInt32(majorminor[1]);
+                               build = Convert.ToInt32(mo["BuildNumber"]);
+
+                               break;  // 1回ループで終了(でいいよね)
+                       }
+                       moc.Dispose();
+                       mc.Dispose();
+
+                       //return result;
+               }
+               public enum WIN10BUILD : int
+               {
+                       TH1 = 10240,
+                       TH2 = 10586,
+                       RS1 = 14393,
+                       RS2 = 15063,
+                       RS3 = 16299,
+                       UNKNOWN = 999999,
+                       NOTWIN10 = 0
+               }
+               private static WIN10BUILD GetWin10BuildNumber()
+               {
+                       WIN10BUILD ret = WIN10BUILD.UNKNOWN;
+
+                       //var mmb = tpGetOSVersion();
+                       int major, minor, build;
+                       tpGetOSVersion(out major, out minor, out build);
+
+                       if (major != 10)
+                       {
+                               ret = WIN10BUILD.NOTWIN10;
+                       }
+                       else if ((build != (int)WIN10BUILD.TH1) &&
+                                         (build != (int)WIN10BUILD.TH2) &&
+                                         (build != (int)WIN10BUILD.RS1) &&
+                                         (build != (int)WIN10BUILD.RS2) &&
+                                         (build != (int)WIN10BUILD.RS3)
+                       )
+                       {
+                               ret = (WIN10BUILD)build;
+                       }
+                       else
+                       {
+                               ret = WIN10BUILD.UNKNOWN;
+                       }
+
+                       return ret;
+               }
        }
 }
index ae565b4..478a2a9 100644 (file)
@@ -259,6 +259,7 @@ namespace FDK
                        rc演奏用タイマ = null;                                            // Global.Bass 依存(つまりユーザ依存)
                        nMixing = 0;
                        SoundDelayExclusiveWASAPI = _nSoundDelayExclusiveWASAPI;
+                       SoundDelaySharedWASAPI = _nSoundDelayExclusiveWASAPI;
                        SoundDelayASIO = _nSoundDelayASIO;
                        ASIODevice = _nASIODevice;
                        bUseOSTimer = _bUseOSTimer;
@@ -1580,35 +1581,46 @@ Debug.WriteLine("更に再生に失敗: " + Path.GetFileName(this.strファイ
                        //-----------------
                        try
                        {
+Debug.WriteLine("1:" + strファイル名);
                                using( var ws = new SoundStream( new FileStream( strファイル名, FileMode.Open ) ) )
                                {
+Debug.WriteLine("2");
                                        if( ws.Format.Encoding == WaveFormatEncoding.OggVorbisMode2Plus ||
                                                ws.Format.Encoding == WaveFormatEncoding.OggVorbisMode3Plus )
                                        {
+Debug.WriteLine("3");
                                                Trace.TraceInformation( Path.GetFileName( strファイル名 ) + ": RIFF chunked Vorbis. Decode to raw Wave first, to avoid BASS.DLL troubles" );
                                                try
                                                {
+Debug.WriteLine("4");
                                                        CDStoWAVFileImage.t変換( strファイル名, out byArrWAVファイルイメージ );
+Debug.WriteLine("5");
                                                        bファイルにVorbisコンテナが含まれている = true;
+Debug.WriteLine("6");
                                                }
                                                catch
                                                {
+Debug.WriteLine("7");
                                                        Trace.TraceWarning( "Warning: " + Path.GetFileName( strファイル名 ) + " : RIFF chunked Vorbisのデコードに失敗しました。" );
                                                }
                                        }
+Debug.WriteLine("8");
                                }
                        }
                        catch ( InvalidDataException )
                        {
                                // DirectShowのデコードに失敗したら、次はACMでのデコードを試すことになるため、ここではエラーログを出さない。
                                // Trace.TraceWarning( "Warning: " + Path.GetFileName( strファイル名 ) + " : デコードに失敗しました。" );
+Debug.WriteLine("9");
                        }
-                       catch ( Exception )
+                       catch ( Exception e)
                        {
+Debug.WriteLine("10: " + e.Message);
                                Trace.TraceWarning( "Warning: " + Path.GetFileName( strファイル名 ) + " : 読み込みに失敗しました。" );
                        }
                        #endregion
 
+Debug.WriteLine("11 " + bファイルにVorbisコンテナが含まれている.ToString());
                        return bファイルにVorbisコンテナが含まれている;
                }
 
index f8eae80..6cd0824 100644 (file)
@@ -108,8 +108,8 @@ namespace FDK
                /// WASAPIの初期化
                /// </summary>
                /// <param name="mode"></param>
-               /// <param name="n希望バッファサイズms">(未使用; 本メソッド内で自動設定する)</param>
-               /// <param name="n更新間隔ms">(未使用; 本メソッド内で自動設定する)</param>
+               /// <param name="n希望バッファサイズms">WASAPIのサウンドバッファサイズ</param>
+               /// <param name="n更新間隔ms">サウンドバッファの更新間隔</param>
                public CSoundDeviceWASAPI( Eデバイスモード mode, long n希望バッファサイズms, long n更新間隔ms )
                {
                        // 初期化。
@@ -172,7 +172,7 @@ namespace FDK
 
                        // BASS の初期化。
 
-                       int n周波数 = 44100;   // 仮決め。lデバイス(≠ドライバ)がネイティブに対応している周波数であれば何でもいい?ようだ。BASSWASAPIでデバイスの周波数は変えられる。いずれにしろBASSMXで自動的にリサンプリングされる。
+                       int n周波数 = 48000;   // 仮決め。lデバイス(≠ドライバ)がネイティブに対応している周波数であれば何でもいい?ようだ。BASSWASAPIでデバイスの周波数は変えられる。いずれにしろBASSMXで自動的にリサンプリングされる。
                                                                // BASS_Initは、WASAPI初期化の直前に行うよう変更。WASAPIのmix周波数を使って初期化することで、余計なリサンプリング処理を省き高速化するため。
                                                                //if( !Bass.BASS_Init( nデバイス, n周波数, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero ) )
                                                                //      throw new Exception( string.Format( "BASS (WASAPI) の初期化に失敗しました。(BASS_Init)[{0}]", Bass.BASS_ErrorGetCode().ToString() ) );
@@ -260,10 +260,10 @@ namespace FDK
                                        count++; // count it
                                }
                        }
-                       #endregion
+               #endregion
 
                Retry:
-                       var flags = ( mode == Eデバイスモード.排他 ) ? BASSWASAPIInit.BASS_WASAPI_AUTOFORMAT | BASSWASAPIInit.BASS_WASAPI_EXCLUSIVE : BASSWASAPIInit.BASS_WASAPI_AUTOFORMAT;
+                       var flags = (mode == Eデバイスモード.排他) ? BASSWASAPIInit.BASS_WASAPI_AUTOFORMAT | BASSWASAPIInit.BASS_WASAPI_EXCLUSIVE : BASSWASAPIInit.BASS_WASAPI_AUTOFORMAT;
                        //var flags = ( mode == Eデバイスモード.排他 ) ? BASSWASAPIInit.BASS_WASAPI_AUTOFORMAT | BASSWASAPIInit.BASS_WASAPI_EVENT | BASSWASAPIInit.BASS_WASAPI_EXCLUSIVE : BASSWASAPIInit.BASS_WASAPI_AUTOFORMAT | BASSWASAPIInit.BASS_WASAPI_EVENT;
                        if ( COS.bIsWin7OrLater && CSound管理.bSoundUpdateByEventWASAPI )
                        {
@@ -272,18 +272,20 @@ namespace FDK
                        n周波数 = deviceInfo.mixfreq;
                        nチャンネル数 = deviceInfo.mixchans;
 
-                       Trace.TraceInformation("n希望バッファサイズms=" + n希望バッファサイズms);
-                       Trace.TraceInformation("n更新間隔ms=" + n更新間隔ms);
-
-
                        // 更新間隔として、WASAPI排他時はminperiodより大きい最小のms値を、WASAPI共有時はdefperiodより大きい最小のms値を用いる
+                       // (Win10のlow latency modeではない前提でまずは設定値を決める)
                        float fPeriod = (mode == Eデバイスモード.排他) ? deviceInfo.minperiod : deviceInfo.defperiod;
-                       Trace.TraceInformation("fPeriod=" + fPeriod);
+
+                       Trace.TraceInformation("arg: n希望バッファサイズms=" + n希望バッファサイズms);
+                       Trace.TraceInformation("arg: n更新間隔ms=" + n更新間隔ms);
+                       Trace.TraceInformation("fPeriod = " + fPeriod + " (排他時: minperiod, 共有時: defperiod。Win10 low latency audio考慮前)");
+
                        float f更新間隔sec = (n更新間隔ms > 0) ? (n更新間隔ms / 1000.0f) : fPeriod;
                        if (f更新間隔sec < fPeriod)
                        {
                                f更新間隔sec = fPeriod;     // Win10では、更新間隔がminperiod以下だと、確実にBASS_ERROR_UNKNOWNとなる。
                        }
+                       Trace.TraceInformation("f更新間隔sec=" + f更新間隔sec);
                        // バッファサイズは、更新間隔より大きくする必要あり。(イコールだと、WASAPI排他での初期化時にBASS_ERROR_UNKNOWNとなる)
                        // そのため、最低でも、更新間隔より1ms大きく設定する。
                        float f希望バッファサイズsec = (n希望バッファサイズms > 0) ? (n希望バッファサイズms / 1000.0f) : fPeriod + 0.001f;
@@ -291,15 +293,36 @@ namespace FDK
                        {
                                f希望バッファサイズsec = fPeriod + 0.001f;
                        }
-                       // WASAPI排他時は、バッファサイズは更新間隔の4倍必要(event driven時を除く)
-                       if (mode == Eデバイスモード.排他 &&
-                               (flags & BASSWASAPIInit.BASS_WASAPI_EVENT) != BASSWASAPIInit.BASS_WASAPI_EVENT &&
-                               f希望バッファサイズsec < f更新間隔sec * 4)
+                       // WASAPI排他時は、バッファサイズは更新間隔の4倍必要(event driven時は2倍)
+                       if (mode == Eデバイスモード.排他)
                        {
-                               f希望バッファサイズsec = f更新間隔sec * 4;
+                               if ( (flags & BASSWASAPIInit.BASS_WASAPI_EVENT) != BASSWASAPIInit.BASS_WASAPI_EVENT &&
+                                       f希望バッファサイズsec < f更新間隔sec * 4)
+                               {
+                                       f希望バッファサイズsec = f更新間隔sec * 4;
+                               }
+                               else if ((flags & BASSWASAPIInit.BASS_WASAPI_EVENT) == BASSWASAPIInit.BASS_WASAPI_EVENT &&
+                                       f希望バッファサイズsec < f更新間隔sec * 2)
+                               {
+                                       f希望バッファサイズsec = f更新間隔sec * 2;
+                               }
                        }
-                       Trace.TraceInformation("f希望バッファサイズsec=" + f希望バッファサイズsec);
-                       Trace.TraceInformation("f更新間隔sec=" + f更新間隔sec);
+
+                       if (COS.bIsWin10OrLater && (mode == Eデバイスモード.共有))             // Win10 low latency shared mode support
+                       {
+                               // バッファ自動設定をユーザーが望む場合は、periodを最小値にする。さもなくば、バッファサイズとしてユーザーが指定した値を、periodとして用いる。
+                               if (n希望バッファサイズms == 0)
+                               {
+                                       f更新間隔sec = deviceInfo.minperiod;
+                               }
+                               else
+                               {
+                                       f更新間隔sec = n希望バッファサイズms / 1000.0f;
+                               }
+                               f希望バッファサイズsec = 0.0f;
+                       }
+
+                       Trace.TraceInformation("f希望バッファサイズsec=" + f希望バッファサイズsec + ", f更新間隔sec=" + f更新間隔sec + ": Win10 low latency audio 考慮後");
 
                        Trace.TraceInformation("Start Bass_Wasapi_Init(device=" + nDevNo + ", freq=" + n周波数 + ", nchans=" + nチャンネル数 + ", flags=" + flags + "," +
                                " buffer=" + f希望バッファサイズsec + ", period=" + f更新間隔sec);
@@ -351,7 +374,7 @@ namespace FDK
                                        int n1サンプルのバイト数 = 2 * wasapiInfo.chans; // default;
                                        int n1秒のバイト数 = n1サンプルのバイト数 * wasapiInfo.freq;
                                        this.n実バッファサイズms = (long)(wasapiInfo.buflen * 1000.0f / n1秒のバイト数);
-                                       this.n実出力遅延ms = 0;    // 初期値はゼロ
+                                       this.n実出力遅延ms = 0;  // 初期値はゼロ
                                        var devInfo = BassWasapi.BASS_WASAPI_GetDeviceInfo( BassWasapi.BASS_WASAPI_GetDevice() );       // 共有モードの場合、更新間隔はデバイスのデフォルト値に固定される。
                                        //Trace.TraceInformation( "BASS を初期化しました。(WASAPI共有モード, 希望バッファサイズ={0}ms, 更新間隔{1}ms)", n希望バッファサイズms, devInfo.defperiod * 1000.0f );
                                        Trace.TraceInformation("使用デバイス: #" + nDevNo + " : " + deviceInfo.name + ", flags=" + deviceInfo.flags);
@@ -361,8 +384,9 @@ namespace FDK
                                                wasapiInfo.format.ToString(),
                                                wasapiInfo.buflen,
                                                n実バッファサイズms.ToString(),
-                                               n希望バッファサイズms.ToString(),
-                                               n更新間隔ms.ToString());
+                                               (f希望バッファサイズsec * 1000).ToString(),  //n希望バッファサイズms.ToString(),
+                                               (f更新間隔sec * 1000).ToString()            //n更新間隔ms.ToString()
+                                       );
                                        Trace.TraceInformation("デバイスの最小更新時間={0}ms, 既定の更新時間={1}ms", deviceInfo.minperiod * 1000, deviceInfo.defperiod * 1000);
                                        this.bIsBASSFree = false;
                                        //-----------------
index d97ba0b..f1335aa 100644 (file)
Binary files a/RuntimeResources/DTXCreator.exe and b/RuntimeResources/DTXCreator.exe differ
index 29fd5f6..1dd2654 100644 (file)
Binary files a/RuntimeResources/DTXManiaGR.exe and b/RuntimeResources/DTXManiaGR.exe differ
index fb5bc5d..2f79b3b 100644 (file)
Binary files a/RuntimeResources/dll/FDK.dll and b/RuntimeResources/dll/FDK.dll differ
index 92d080c..11c4c17 100644 (file)
Binary files a/RuntimeResources/dll/bassmix.dll and b/RuntimeResources/dll/bassmix.dll differ
index 9877a2b..5769f9a 100644 (file)
Binary files a/RuntimeResources/dll/basswasapi.dll and b/RuntimeResources/dll/basswasapi.dll differ
index c4b6ac9..7eec695 100644 (file)
Binary files a/RuntimeResources/ja-JP/DTXCreator.resources.dll and b/RuntimeResources/ja-JP/DTXCreator.resources.dll differ
index e166bf9..c9bde35 100644 (file)
Binary files a/RuntimeResources/ja-JP/DTXManiaGR.resources.dll and b/RuntimeResources/ja-JP/DTXManiaGR.resources.dll differ