static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Invalid arguments. Usage is info.exe <file name>"); return; } try { using (var stream = new FileStream(args[0], FileMode.Open)) { var headerInfo = FileHeaderUtil.GetHeaderInfo(stream); Console.WriteLine("Channels {0}", headerInfo.Channels); Console.WriteLine("Frequency {0}", headerInfo.Frequency); Console.WriteLine("Sample Bits {0}", headerInfo.SampleBits); Console.WriteLine("Sample Count {0}", headerInfo.SampleCount); Console.ReadLine(); } } catch (Exception ex) { Console.WriteLine("Encountered an error processing the file."); Console.WriteLine(ex.ToString()); } }
static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Invalid parameters. Usage is split.exe <filename>"); Console.WriteLine("You can only split STEREO files."); return; } using (var streamIn = new FileStream(args[0], FileMode.Open)) { var info = FileHeaderUtil.GetHeaderInfo(streamIn); if (info.Channels != Channel.Mono) { throw new InvalidDataException(); } info.SampleCount *= 2; info.Channels = Channel.Stereo; var outputStream = Console.OpenStandardOutput(); FileHeaderUtil.WriteHeaderInfo(outputStream, info); while (streamIn.Length != streamIn.Position) { var sample = SampleUtils.ReadSample(streamIn, info); SampleUtils.WriteSample(sample, outputStream, info); SampleUtils.WriteSample(sample, outputStream, info); } } }
static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Usage: computeFourier <filename>"); return; } using (var stream = new FileStream(args[0], FileMode.Open)) { var info = FileHeaderUtil.GetHeaderInfo(stream); uint[] samples = Fourier.ReadSamples(stream, 0, 256, info); var vals = Fourier.CalculateComplex(samples, samples.Length); Console.WriteLine("Lowest Frequency Energy: {0} + {1}i", vals[0].Real, vals[0].Imaginary); Console.WriteLine("Highest Frequency Energy: {0} + {1}i", vals[samples.Length / 2].Real, vals[samples.Length / 2].Imaginary); //foreach (var mag in vals) // Console.WriteLine(mag); Console.ReadLine(); } }
static void Main(string[] args) { if (args.Length != 6) { Console.WriteLine("Invalid number of parameters."); Console.WriteLine("Usage is gensine.exe <channels> <frequency> <sample size> <sample rate> <amplitude> <duration>"); Console.WriteLine("<channels> := Mono, Stereo"); Console.WriteLine("<frequency> := int (Hz)"); Console.WriteLine("<sample size> := 8, 16, 24, or 32"); Console.WriteLine("<sample rate> := int (samples/sec)"); Console.WriteLine("<amplitude> := int"); Console.WriteLine("<duration> := double (seconds)"); return; } Channel channels = (Channel)Enum.Parse(typeof(Channel), args[0], true); int frequency = int.Parse(args[1]); int sampleSize = int.Parse(args[2]); int sampleRate = int.Parse(args[3]); int amplitude = int.Parse(args[4]); double duration = double.Parse(args[5]); var info = new FileInfo { Channels = channels, Frequency = sampleRate, SampleBits = sampleSize, SampleCount = (int)(sampleRate * duration) }; double samplesPerCycle = sampleRate / (double)frequency; double interval = 2 * Math.PI / samplesPerCycle; double offset = 0; var outputStream = Console.OpenStandardOutput(); FileHeaderUtil.WriteHeaderInfo(outputStream, info); for (int i = 0; i < info.SampleCount; i++) { if (offset > 2 * Math.PI) { offset -= 2 * Math.PI; } uint sample = (uint)(((Math.Sin(offset) + 1) * amplitude / 2.0) + (amplitude / 2.0)); SampleUtils.WriteSample(sample, outputStream, info); if (info.Channels == Channel.Stereo) { SampleUtils.WriteSample(sample, outputStream, info); } offset += interval; } }
public override void Render(GenContext ctx) { ctx.Tasks.Add(Task.Run(() => { GenArgs args = ctx.GenArgs; var brightRequirePath = args.TypescriptBrightRequirePath; var brightPackageName = args.TypescriptBrightPackageName; var render = ctx.Render; var ass = ctx.Assembly; var fileContent = new List <string>(); if (args.TypescriptUsePuertsByteBuf) { fileContent.Add(TypescriptStringTemplate.PuertsByteBufImports); } else { fileContent.Add(TypescriptStringTemplate.GetByteBufImports(brightRequirePath, brightPackageName)); } if (args.TypescriptEmbedBrightTypes) { fileContent.Add(StringTemplateManager.Ins.GetTemplateString("config/typescript_bin/vectors")); fileContent.Add(TypescriptStringTemplate.SerializeTypes); fileContent.Add(TypescriptStringTemplate.ProtoTypes); } else { fileContent.Add(TypescriptStringTemplate.GetSerializeImports(brightRequirePath, brightPackageName)); fileContent.Add(TypescriptStringTemplate.GetProtocolImports(brightRequirePath, brightPackageName)); fileContent.Add(TypescriptStringTemplate.GetVectorImports(brightRequirePath, brightPackageName)); } fileContent.Add(@$ "export namespace {ass.TopModule} {{"); foreach (var type in ctx.ExportTypes) { fileContent.Add(render.RenderAny(type)); } fileContent.Add(render.RenderStubs("ProtocolStub", ass.TopModule, ctx.ExportTypes.Where(t => t is DefProto).Cast <DefProto>().ToList(), ctx.ExportTypes.Where(t => t is DefRpc).Cast <DefRpc>().ToList())); fileContent.Add("}"); // end of topmodule var content = FileHeaderUtil.ConcatAutoGenerationHeader(string.Join('\n', fileContent), ELanguage.TYPESCRIPT); var file = "Types.ts"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); }
public override void Render(GenContext ctx) { DefAssembly ass = ctx.Assembly; ctx.Tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(RenderTypes(ctx.ExportTypes), Common.ELanguage.LUA); var file = "Types.lua"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); }
private void OpenAudioFile() { var ofd = new OpenFileDialog(); if (ofd.ShowDialog() == true) { audioStream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read); canComputeFourier = true; fileInfo = FileHeaderUtil.GetHeaderInfo(audioStream); audioStream.Seek(0, SeekOrigin.Begin); FirstSampleIndex = 0; OnPropertyChanged("MaximumSampleIndex"); OnPropertyChanged("CanComputeFourier"); } }
protected void GenerateCodeScatter(GenContext ctx) { string genType = ctx.GenType; ctx.Render = this; ctx.Lan = GetLanguage(ctx); DefAssembly.LocalAssebmly.CurrentLanguage = ctx.Lan; foreach (var c in ctx.ExportTypes) { ctx.Tasks.Add(Task.Run(() => { string body = ctx.Render.RenderAny(c); if (string.IsNullOrWhiteSpace(body)) { return; } var content = FileHeaderUtil.ConcatAutoGenerationHeader(body, ctx.Lan); var file = RenderFileUtil.GetDefTypePath(c.FullName, ctx.Lan); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } ctx.Tasks.Add(Task.Run(() => { var module = ctx.TopModule; var name = ctx.TargetService.Manager; var body = ctx.Render.RenderService(name, module, ctx.ExportTables); if (string.IsNullOrWhiteSpace(body)) { return; } var content = FileHeaderUtil.ConcatAutoGenerationHeader(body, ctx.Lan); var file = RenderFileUtil.GetDefTypePath(name, ctx.Lan); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); }
public override void Render(GenContext ctx) { ctx.Assembly.CurrentLanguage = ELanguage.CS; foreach (var c in ctx.Assembly.Types.Values) { if (!(c is DefBean) && !(c is DefEnum)) { continue; } ctx.Tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(RenderAny(c), ELanguage.CS); var file = RenderFileUtil.GetDefTypePath(c.FullName, ELanguage.CS); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } }
public override void Render(GenContext ctx) { foreach (var c in ctx.ExportTypes) { if (!(c is DefEnum || c is DefBean)) { continue; } ctx.Tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(RenderAny(c), ELanguage.CPP); var file = "bp_" + RenderFileUtil.GetUeCppDefTypeHeaderFilePath(c.FullName); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } }
public override void Render(GenContext ctx) { var render = new CppUE4EditorJsonRender(); var renderTypes = ctx.Assembly.Types.Values.Where(c => c is DefEnum || c is DefBean).ToList(); foreach (var c in renderTypes) { ctx.Tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), ELanguage.CPP); var file = "editor_" + RenderFileUtil.GetUeCppDefTypeHeaderFilePath(c.FullName); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } int TYPE_PER_STUB_FILE = 200; for (int i = 0, n = (renderTypes.Count + TYPE_PER_STUB_FILE - 1) / TYPE_PER_STUB_FILE; i < n; i++) { int index = i; ctx.Tasks.Add(Task.Run(() => { int startIndex = index * TYPE_PER_STUB_FILE; var content = FileHeaderUtil.ConcatAutoGenerationHeader( render.RenderStub(renderTypes.GetRange(startIndex, Math.Min(TYPE_PER_STUB_FILE, renderTypes.Count - startIndex))), ELanguage.CPP); var file = $"stub_{index}.cpp"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } }
static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Invalid parameters. Usage is combine.exe <filename 1> <filename 2>"); Console.WriteLine("You can only combine 2 mono files."); return; } using (var streamIn = new FileStream(args[0], FileMode.Open)) using (var stream2In = new FileStream(args[1], FileMode.Open)) { var info = FileHeaderUtil.GetHeaderInfo(streamIn); var info2 = FileHeaderUtil.GetHeaderInfo(stream2In); if (info.Channels != Channel.Mono || info.Channels != Channel.Mono || info.SampleCount != info2.SampleCount || info.SampleBits != info2.SampleCount || info.Frequency != info2.Frequency) { throw new InvalidDataException(); } info.SampleCount *= 2; info.Channels = Channel.Stereo; var outputStream = Console.OpenStandardOutput(); FileHeaderUtil.WriteHeaderInfo(outputStream, info); while (streamIn.Length != streamIn.Position) { long sample1 = SampleUtils.ReadSample(streamIn, info); long sample2 = SampleUtils.ReadSample(stream2In, info); uint combinedSample = (uint)((sample1 + sample2) / 2); SampleUtils.WriteSample(combinedSample, outputStream, info); } } }
protected void GenerateCodeMonolithic(GenContext ctx, string outputFile, List <string> fileContent, Action <List <string> > preContent, Action <List <string> > postContent) { ctx.Tasks.Add(Task.Run(() => { fileContent.Add(FileHeaderUtil.GetAutoGenerationHeader(ctx.Lan)); preContent?.Invoke(fileContent); foreach (var type in ctx.ExportTypes) { fileContent.Add(ctx.Render.RenderAny(type)); } fileContent.Add(ctx.Render.RenderService(ctx.Assembly.TableManagerName, ctx.TopModule, ctx.ExportTables)); postContent?.Invoke(fileContent); var file = outputFile; var md5 = CacheFileUtil.GenMd5AndAddCache(file, string.Join("\n", fileContent)); ctx.GenScatteredFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); }
protected void GenerateCodeScatter(GenContext ctx) { ELanguage lan = ctx.Lan; var render = ctx.Render; DefAssembly ass = ctx.Assembly; foreach (var c in ctx.ExportTypes) { ctx.Tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), lan); var file = RenderFileUtil.GetDefTypePath(c.FullName, lan); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } ctx.Tasks.Add(Task.Run(() => { var module = ass.TopModule; var name = "ProtocolStub"; var content = FileHeaderUtil.ConcatAutoGenerationHeader( render.RenderStubs(name, module, ctx.ExportTypes.Where(t => t is DefProto).Cast <DefProto>().ToList(), ctx.ExportTypes.Where(t => t is DefRpc).Cast <DefRpc>().ToList()), lan); var file = RenderFileUtil.GetDefTypePath(name, lan); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); }
public async Task GenAsync(RemoteAgent agent, GenJob rpc) { var res = new GenJobRes() { ErrCode = Luban.Common.EErrorCode.OK, ErrMsg = "succ", FileGroups = new List <FileGroup>(), }; if (!TryParseArg(rpc.Arg.JobArguments, out GenArgs args, out string errMsg)) { res.ErrCode = Luban.Common.EErrorCode.JOB_ARGUMENT_ERROR; res.ErrMsg = errMsg; agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res); return; } var timer = new ProfileTimer(); timer.StartPhase("= gen_all ="); try { string outputCodeDir = args.OutputCodeDir; timer.StartPhase("build defines"); var loader = new DbDefLoader(agent); await loader.LoadAsync(args.DefineFile); timer.EndPhaseAndLog(); var rawDefines = loader.BuildDefines(); var ass = new DefAssembly(); ass.Load(rawDefines, agent); List <DefTypeBase> exportTypes = ass.GetExportTypes(); var tasks = new List <Task>(); var genCodeFiles = new ConcurrentBag <FileInfo>(); var genType = args.GenType; switch (genType) { case "cs": { var render = new SyncCsRender(); foreach (var c in ass.Types.Values) { tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), Common.ELanguage.CS); var file = RenderFileUtil.GetDefTypePath(c.FullName, Common.ELanguage.CS); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } tasks.Add(Task.Run(() => { var module = ass.TopModule; var name = "Tables"; var content = FileHeaderUtil.ConcatAutoGenerationHeader( render.RenderTables(name, module, ass.Types.Values.Where(t => t is DefTable).Select(t => (DefTable)t).ToList()), Common.ELanguage.CS); var file = RenderFileUtil.GetDefTypePath(name, Common.ELanguage.CS); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); break; } default: { throw new NotSupportedException($"not support gen type:{genType}"); } } await Task.WhenAll(tasks.ToArray()); res.FileGroups.Add(new FileGroup() { Dir = outputCodeDir, Files = genCodeFiles.ToList() }); } catch (Exception e) { res.ErrCode = Luban.Common.EErrorCode.JOB_EXCEPTION; res.ErrMsg = $"{e.Message} \n {e.StackTrace}"; } timer.EndPhaseAndLog(); agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res); }
static void Main(string[] args) { if (args.Length % 2 != 0 || args.Length < 4) { Console.WriteLine("Invalid arguments. There must be an even number of arguments and there must be at least 4 arguments."); Console.WriteLine("Usage: mix.exe <file1> <gain1> <file2> <gain2> [<file N> <gain N> ...]"); return; } var files = new List <Stream>(); var infos = new List <FileInfo>(); var gains = new List <double>(); for (int i = 0; i < args.Length; i++) { if (i % 2 == 0) { files.Add(new FileStream(args[i], FileMode.Open)); infos.Add(FileHeaderUtil.GetHeaderInfo(files.Last())); } else { gains.Add(double.Parse(args[i])); } } foreach (var info in infos) { if (info.Channels != infos[0].Channels || info.SampleBits != infos[0].SampleBits || info.SampleCount != infos[0].SampleCount) { Console.WriteLine("Files incompatible for mixing."); return; } } var outputStream = Console.OpenStandardOutput(); FileHeaderUtil.WriteHeaderInfo(outputStream, infos.First()); var fileInfo = infos.First(); uint maxAmplitude = (uint)(Math.Pow(2, fileInfo.SampleBits) - 1); unchecked { for (int i = 0; i < fileInfo.SampleCount; i++) { uint sample = 0; for (int j = 0; j < files.Count; j++) { sample += (uint)(SampleUtils.ReadSample(files[j], fileInfo) * gains[j]); } if (sample >= maxAmplitude) { sample = maxAmplitude; } SampleUtils.WriteSample(sample, outputStream, fileInfo); } } }
public async Task GenAsync(RemoteAgent agent, GenJob rpc) { var res = new GenJobRes() { ErrCode = Luban.Common.EErrorCode.OK, ErrMsg = "succ", FileGroups = new List <FileGroup>(), }; if (!TryParseArg(rpc.Arg.JobArguments, out GenArgs args, out string errMsg)) { res.ErrCode = Luban.Common.EErrorCode.JOB_ARGUMENT_ERROR; res.ErrMsg = errMsg; agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res); return; } var timer = new ProfileTimer(); timer.StartPhase("= gen_all ="); try { string inputDataDir = args.InputDataDir; string outputCodeDir = args.OutputCodeDir; string outputDataDir = args.OutputDataDir; var genTypes = args.GenType.Split(',').Select(s => s.Trim()).ToList(); timer.StartPhase("build defines"); var loader = new CfgDefLoader(agent); await loader.LoadAsync(args.DefineFile); timer.EndPhaseAndLog(); var rawDefines = loader.BuildDefines(); TimeZoneInfo timeZoneInfo = string.IsNullOrEmpty(args.TimeZone) ? TimeZoneInfo.Local : TimeZoneInfo.FindSystemTimeZoneById(args.TimeZone); var ass = new DefAssembly(timeZoneInfo); ass.Load(args.Service, rawDefines, agent); var targetService = ass.CfgTargetService; List <DefTable> exportTables = ass.GetExportTables(); List <DefTypeBase> exportTypes = ass.GetExportTypes(); bool hasLoadCfgData = false; async Task CheckLoadCfgDataAsync() { if (!hasLoadCfgData) { hasLoadCfgData = true; var timer = new ProfileTimer(); timer.StartPhase("load config data"); await LoadCfgDataAsync(agent, ass, args.InputDataDir, args.ExportTestData); timer.EndPhaseAndLog(); timer.StartPhase("validate"); var validateCtx = new ValidatorContext(ass, args.ValidateRootDir); await validateCtx.ValidateTables(exportTables); timer.EndPhaseAndLog(); } } var tasks = new List <Task>(); var genCodeFiles = new ConcurrentBag <FileInfo>(); var genDataFiles = new ConcurrentBag <FileInfo>(); foreach (var genType in genTypes) { switch (genType) { case "code_cs_bin": case "code_cs_json": case "code_java_bin": { ICodeRender render = CreateCodeRender(genType); ELanguage lan = GetLanguage(genType); foreach (var c in exportTypes) { tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), lan); var file = RenderFileUtil.GetDefTypePath(c.FullName, lan); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } tasks.Add(Task.Run(() => { var module = ass.TopModule; var name = targetService.Manager; var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderService(name, module, exportTables), lan); var file = RenderFileUtil.GetDefTypePath(name, lan); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); break; } case "code_lua_bin": { tasks.Add(Task.Run(() => { var render = new LuaRender(); var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAll(ass.Types.Values.ToList()), ELanguage.LUA); var file = "Types.lua"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); break; } case "code_go_bin": { var render = new GoCodeRender(); foreach (var c in exportTypes) { tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), ELanguage.GO); var file = RenderFileUtil.GetDefTypePath(c.FullName, ELanguage.GO); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } tasks.Add(Task.Run(() => { var module = ass.TopModule; var name = targetService.Manager; var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderService(name, module, exportTables), ELanguage.GO); var file = RenderFileUtil.GetDefTypePath(name, ELanguage.GO); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); break; } case "code_cpp_bin": { var render = new CppBinCodeRender(); // 将所有 头文件定义 生成到一个文件 // 按照 const,enum,bean,table, service 的顺序生成 tasks.Add(Task.Run(() => { var headerFileContent = new List <string> { @$ " #pragma once #include <functional> #include " "bright/serialization/ByteBuf.h" " #include " "bright/CfgBean.hpp" " using ByteBuf = bright::serialization::ByteBuf; namespace {ass.TopModule} {{ " }; foreach (var type in exportTypes) { if (type is DefEnum e) { headerFileContent.Add(render.Render(e)); } } foreach (var type in exportTypes) { if (type is DefConst c) { headerFileContent.Add(render.Render(c)); } } foreach (var type in exportTypes) { if (type is DefBean e) { headerFileContent.Add(render.RenderForwardDefine(e)); } } foreach (var type in exportTypes) { if (type is DefBean e) { headerFileContent.Add(render.Render(e)); } } foreach (var type in exportTables) { headerFileContent.Add(render.Render(type)); } headerFileContent.Add(render.RenderService("Tables", ass.TopModule, exportTables)); headerFileContent.Add("}"); // end of topmodule var content = FileHeaderUtil.ConcatAutoGenerationHeader(string.Join('\n', headerFileContent), ELanguage.CPP); var file = "gen_types.h"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); var beanTypes = exportTypes.Where(c => c is DefBean).ToList(); int TYPE_PER_STUB_FILE = 100; for (int i = 0, n = (beanTypes.Count + TYPE_PER_STUB_FILE - 1) / TYPE_PER_STUB_FILE; i < n; i++) { int index = i; tasks.Add(Task.Run(() => { int startIndex = index * TYPE_PER_STUB_FILE; var content = FileHeaderUtil.ConcatAutoGenerationHeader( render.RenderStub(ass.TopModule, beanTypes.GetRange(startIndex, Math.Min(TYPE_PER_STUB_FILE, beanTypes.Count - startIndex))), ELanguage.CPP); var file = $"gen_stub_{index}.cpp"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } break; } case "code_typescript_json": { var render = new TypeScriptJsonCodeRender(); tasks.Add(Task.Run(() => { var fileContent = new List <string> { @$ " export namespace {ass.TopModule} {{ ", @" export class Vector2 { x: number; y: number; constructor(x: number, y: number) { this.x = x; this.y = y; } static fromJson(_json_: any): Vector2 { let x = _json_['x']; let y = _json_['y']; if (x == null || y == null) { throw new Error(); } return new Vector2(x, y); } } export class Vector3 { x: number; y: number; z: number; constructor(x: number, y: number, z: number) { this.x = x; this.y = y; this.z = z; } static fromJson(_json_: any): Vector3 { let x = _json_['x']; let y = _json_['y']; let z = _json_['z']; if (x == null || y == null || z == null) { throw new Error(); } return new Vector3(x, y, z); } } export class Vector4 { x: number; y: number; z: number; w: number; constructor(x: number, y: number, z: number, w: number) { this.x = x; this.y = y; this.z = z; this.w = w; } static fromJson(_json_: any): Vector4 { let x = _json_['x']; let y = _json_['y']; let z = _json_['z']; let w = _json_['w']; if (x == null || y == null || z == null || w == null) { throw new Error(); } return new Vector4(x, y, z, w); } } " }; foreach (var type in exportTypes) { if (type is DefEnum e) { fileContent.Add(render.Render(e)); } } foreach (var type in exportTypes) { if (type is DefConst c) { fileContent.Add(render.Render(c)); } } foreach (var type in exportTypes) { if (type is DefBean e) { fileContent.Add(render.Render(e)); } } foreach (var type in exportTables) { fileContent.Add(render.Render(type)); } fileContent.Add(render.RenderService("Tables", ass.TopModule, exportTables)); fileContent.Add("}"); // end of topmodule var content = FileHeaderUtil.ConcatAutoGenerationHeader(string.Join('\n', fileContent), ELanguage.TYPESCRIPT); var file = "Types.ts"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); }));
public async Task GenAsync(RemoteAgent agent, GenJob rpc) { var res = new GenJobRes() { ErrCode = Luban.Common.EErrorCode.OK, ErrMsg = "succ", FileGroups = new List <FileGroup>(), }; if (!TryParseArg(rpc.Arg.JobArguments, out GenArgs args, out string errMsg)) { res.ErrCode = Luban.Common.EErrorCode.JOB_ARGUMENT_ERROR; res.ErrMsg = errMsg; agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res); return; } var timer = new ProfileTimer(); timer.StartPhase("= gen_all ="); try { string outputCodeDir = args.OutputCodeDir; timer.StartPhase("build defines"); var loader = new DbDefLoader(agent); await loader.LoadAsync(args.DefineFile); timer.EndPhaseAndLog(); var rawDefines = loader.BuildDefines(); var ass = new DefAssembly(); ass.Load(rawDefines, agent, args); List <DefTypeBase> exportTypes = ass.GetExportTypes(); var tasks = new List <Task>(); var genCodeFiles = new ConcurrentBag <FileInfo>(); var genScatteredFiles = new ConcurrentBag <FileInfo>(); var genType = args.GenType; switch (genType) { case "cs": { ass.CurrentLanguage = ELanguage.CS; var render = new AsyncCsRender(); foreach (var c in ass.Types.Values) { tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), Common.ELanguage.CS); var file = RenderFileUtil.GetDefTypePath(c.FullName, Common.ELanguage.CS); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } tasks.Add(Task.Run(() => { var module = ass.TopModule; var name = "Tables"; var content = FileHeaderUtil.ConcatAutoGenerationHeader( render.RenderTables(name, module, ass.Types.Values.Where(t => t is DefTable).Select(t => (DefTable)t).ToList()), Common.ELanguage.CS); var file = RenderFileUtil.GetDefTypePath(name, Common.ELanguage.CS); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); break; } case "typescript": { ass.CurrentLanguage = ELanguage.TYPESCRIPT; var render = new TypescriptRender(); var brightRequirePath = args.TypescriptBrightRequirePath; var brightPackageName = args.TypescriptBrightPackageName; tasks.Add(Task.Run(() => { var fileContent = new List <string>(); fileContent.Add(TypescriptStringTemplate.GetByteBufImports(brightRequirePath, brightPackageName)); fileContent.Add(TypescriptStringTemplate.GetSerializeImports(brightRequirePath, brightPackageName)); fileContent.Add(TypescriptStringTemplate.GetProtocolImports(brightRequirePath, brightPackageName)); fileContent.Add(TypescriptStringTemplate.GetVectorImports(brightRequirePath, brightPackageName)); if (!string.IsNullOrEmpty(brightRequirePath)) { fileContent.Add($"import {{FieldLogger, FieldLoggerGeneric1, FieldLoggerGeneric2}} from '{brightRequirePath}/transaction/FieldLogger'"); fileContent.Add($"import TxnBeanBase from '{brightRequirePath}/transaction/TxnBeanBase'"); fileContent.Add($"import {{TxnTable, TxnTableGeneric}} from '{brightRequirePath}/transaction/TxnTable'"); fileContent.Add($"import TransactionContext from '{brightRequirePath}/transaction/TransactionContext'"); fileContent.Add($"import {{FieldTag}} from '{brightRequirePath}/serialization/FieldTag'"); fileContent.Add($"import TKey from '{brightRequirePath}/storage/TKey'"); fileContent.Add($"import PList from '{brightRequirePath}/transaction/collections/PList'"); fileContent.Add($"import PList1 from '{brightRequirePath}/transaction/collections/PList1'"); fileContent.Add($"import PList2 from '{brightRequirePath}/transaction/collections/PList2'"); fileContent.Add($"import PSet from '{brightRequirePath}/transaction/collections/PSet'"); fileContent.Add($"import PMap from '{brightRequirePath}/transaction/collections/PMap'"); fileContent.Add($"import PMap1 from '{brightRequirePath}/transaction/collections/PMap1'"); fileContent.Add($"import PMap2 from '{brightRequirePath}/transaction/collections/PMap2'"); fileContent.Add($"import SerializeFactory from '{brightRequirePath}/serialization/SerializeFactory'"); } else { fileContent.Add($"import {{FieldLogger, FieldLoggerGeneric1, FieldLoggerGeneric2}} from '{brightPackageName}'"); fileContent.Add($"import {{TxnBeanBase}} from '{brightPackageName}'"); fileContent.Add($"import {{TxnTable, TxnTableGeneric}} from '{brightPackageName}'"); fileContent.Add($"import {{TransactionContext}} from '{brightPackageName}'"); fileContent.Add($"import {{FieldTag}} from '{brightPackageName}'"); fileContent.Add($"import {{TKey}} from '{brightPackageName}'"); fileContent.Add($"import {{PList}} from '{brightPackageName}'"); fileContent.Add($"import {{PList1}} from '{brightPackageName}'"); fileContent.Add($"import {{PList2}} from '{brightPackageName}'"); fileContent.Add($"import {{PSet}} from '{brightPackageName}'"); fileContent.Add($"import {{PMap}} from '{brightPackageName}'"); fileContent.Add($"import {{PMap1}} from '{brightPackageName}'"); fileContent.Add($"import {{PMap2}} from '{brightPackageName}'"); fileContent.Add($"import {{SerializeFactory}} from '{brightPackageName}'"); } fileContent.Add($"export namespace {ass.TopModule} {{"); foreach (var type in exportTypes) { fileContent.Add(render.RenderAny(type)); } var tables = ass.Types.Values.Where(t => t is DefTable).Select(t => (DefTable)t).ToList(); fileContent.Add(render.RenderTables("Tables", ass.TopModule, tables)); fileContent.Add("}"); // end of topmodule var content = FileHeaderUtil.ConcatAutoGenerationHeader(string.Join('\n', fileContent), ELanguage.TYPESCRIPT); var file = "Types.ts"; var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); genCodeFiles.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); break; } default: { throw new NotSupportedException($"not support gen type:{genType}"); } } await Task.WhenAll(tasks.ToArray()); res.FileGroups.Add(new FileGroup() { Dir = outputCodeDir, Files = genCodeFiles.ToList() }); } catch (Exception e) { res.ErrCode = Luban.Common.EErrorCode.JOB_EXCEPTION; res.ErrMsg = $"{e.Message} \n {e.StackTrace}"; } timer.EndPhaseAndLog(); agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res); }
static void Main(string[] args) { using (var streamIn = new FileStream(args[0], FileMode.Open)) { var info = FileHeaderUtil.GetHeaderInfo(streamIn); uint chunkId = 0x46464952; uint chunkSize; // 36 + subchunk2Size uint format = 0x45564157; uint subchunk1Id = 0x20746d66; uint subchunk1Size = 16; uint AudioFormat = 1; uint channelCount = info.Channels == Channel.Mono ? 1u : 2u; uint sampleRate = 8000; // maybe? uint byteRate; // sampleRate * NumChannels * bitsPerSample / 8 uint blockAlign; // NumChannels * bitsPerSample / 8 uint bitsPerSample = (uint)info.SampleBits; // 8, 16, 24, 32 uint Subchunk2Id = 0x61746164; uint Subchunk2Size = (uint)info.SampleCount; // sampleCount * numChannels * bitsPerSample / 8 byteRate = sampleRate * channelCount * bitsPerSample / 8; blockAlign = channelCount * bitsPerSample / 8; chunkSize = 36 + Subchunk2Size; byte[] headerBytes = new byte[44]; headerBytes[0] = (byte)chunkId; headerBytes[1] = (byte)(chunkId >> 8); headerBytes[2] = (byte)(chunkId >> 16); headerBytes[3] = (byte)(chunkId >> 24); headerBytes[4] = (byte)chunkSize; headerBytes[5] = (byte)(chunkSize >> 8); headerBytes[6] = (byte)(chunkSize >> 16); headerBytes[7] = (byte)(chunkSize >> 24); headerBytes[8] = (byte)format; headerBytes[9] = (byte)(format >> 8); headerBytes[10] = (byte)(format >> 16); headerBytes[11] = (byte)(format >> 24); headerBytes[12] = (byte)subchunk1Id; headerBytes[13] = (byte)(subchunk1Id >> 8); headerBytes[14] = (byte)(subchunk1Id >> 16); headerBytes[15] = (byte)(subchunk1Id >> 24); headerBytes[16] = (byte)subchunk1Size; headerBytes[17] = (byte)(subchunk1Size >> 8); headerBytes[18] = (byte)(subchunk1Size >> 16); headerBytes[19] = (byte)(subchunk1Size >> 24); headerBytes[20] = (byte)AudioFormat; headerBytes[21] = (byte)(AudioFormat >> 8); headerBytes[22] = (byte)channelCount; headerBytes[23] = (byte)(channelCount >> 8); headerBytes[24] = (byte)sampleRate; headerBytes[25] = (byte)(sampleRate >> 8); headerBytes[26] = (byte)(sampleRate >> 16); headerBytes[27] = (byte)(sampleRate >> 24); headerBytes[28] = (byte)byteRate; headerBytes[29] = (byte)(byteRate >> 8); headerBytes[30] = (byte)(byteRate >> 16); headerBytes[31] = (byte)(byteRate >> 24); headerBytes[32] = (byte)blockAlign; headerBytes[33] = (byte)(blockAlign >> 8); headerBytes[34] = (byte)(bitsPerSample); headerBytes[35] = (byte)(bitsPerSample >> 8); headerBytes[36] = (byte)Subchunk2Id; headerBytes[37] = (byte)(Subchunk2Id >> 8); headerBytes[38] = (byte)(Subchunk2Id >> 16); headerBytes[39] = (byte)(Subchunk2Id >> 24); headerBytes[40] = (byte)Subchunk2Size; headerBytes[41] = (byte)(Subchunk2Size >> 8); headerBytes[42] = (byte)(Subchunk2Size >> 16); headerBytes[43] = (byte)(Subchunk2Size >> 24); using (var streamOut = new FileStream(args[1], FileMode.Create)) { streamOut.Write(headerBytes, 0, headerBytes.Length); for (int i = 0; i < info.SampleCount; i++) { SampleUtils.WriteSample(SampleUtils.ReadSample(streamIn, info), streamOut, info); } } } }