# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
+Thumbs.db
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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {AFC495EE-6FF0-43DA-9AE0-1EEFCE8F5338}
+ EndGlobalSection
EndGlobal
<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" />
[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("")]
// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を
// 既定値にすることができます:
// [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")]
// このアセンブリは「ライブラリ」である(難読化ツールへの指示)。
using System.Diagnostics;
using System.IO;
using System.Threading;
+using System.Management;
using SharpDX;
using SharpDX.Direct3D9;
using FDK;
{
// プロパティ
#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
#endregion
#region [ 言語リソースの初期化 ]
- Trace.TraceInformation( "言語リソースの初期化を行います。" );
+ Trace.TraceInformation("言語リソースの初期化を行います。");
Trace.Indent();
try
{
Resources = new CResources();
- Resources.LoadResources( "" );
- Trace.TraceInformation( "言語リソースの初期化を完了しました。" );
+ Resources.LoadResources("");
+ Trace.TraceInformation("言語リソースの初期化を完了しました。");
}
finally
{
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();
}
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;
}
else
{
- Trace.TraceInformation( "通常モードで起動します。" );
+ Trace.TraceInformation("通常モードで起動します。");
}
#endregion
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
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("スキンフォルダ内に言語リソースが見つかりました。この言語リソースを使用します。");
#endregion
}
+
public void t全画面_ウィンドウモード切り替え()
{
#if WindowedFullscreen
}
protected override void Draw(GameTime gameTime)
{
+ if (Sound管理 == null)
+ {
+ return;
+ }
Sound管理.t再生中の処理をする();
if (Timer != null)
}
#endregion
- //GC.Collect( 0, GCCollectionMode.Optimized, false ); // Rel105で処理が重くなっていることに対する、暫定処置。
+ GC.Collect( 0, GCCollectionMode.Optimized, false ); // Rel105で処理が重くなっていることに対する、暫定処置。
// 重くなっている原因に対する適切な処置をして、処理が104程度に軽くなったら、
// この暫定処置は削除します。
}
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("----------------------");
+ }
+
}
}
<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>
using System;
using System.Collections.Generic;
using System.Text;
+using System.Management;
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;
}
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;
+ }
}
}
rc演奏用タイマ = null; // Global.Bass 依存(つまりユーザ依存)
nMixing = 0;
SoundDelayExclusiveWASAPI = _nSoundDelayExclusiveWASAPI;
+ SoundDelaySharedWASAPI = _nSoundDelayExclusiveWASAPI;
SoundDelayASIO = _nSoundDelayASIO;
ASIODevice = _nASIODevice;
bUseOSTimer = _bUseOSTimer;
//-----------------
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コンテナが含まれている;
}
/// 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 )
{
// 初期化。
// 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() ) );
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 )
{
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;
{
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);
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);
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;
//-----------------