Пример #1
0
        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());
            }
        }
Пример #2
0
        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();
            }
        }
Пример #4
0
        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
                });
            }));
        }
Пример #6
0
        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
                });
            }));
        }
Пример #7
0
        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");
            }
        }
Пример #8
0
        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
                });
            }));
        }
Пример #9
0
 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
             });
         }));
     }
 }
Пример #10
0
        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
                    });
                }));
            }
        }
Пример #12
0
        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);
                    }
                }
        }
Пример #13
0
        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
                });
            }));
        }
Пример #14
0
        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
                });
            }));
        }
Пример #15
0
        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);
        }
Пример #16
0
        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);
                }
            }
        }
Пример #17
0
        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
                                });
                            }));
Пример #18
0
        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);
        }
Пример #19
0
        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);
                    }
                }
            }
        }