public long OpenAudioRenderer(ServiceCtx Context)
        {
            IAalOutput AudioOut = Context.Ns.AudioOut;

            AudioRendererParameter Params = GetAudioRendererParameter(Context);

            MakeObject(Context, new IAudioRenderer(Context.Memory, AudioOut, Params));

            return(0);
        }
예제 #2
0
        public IAudioRenderer(AudioRendererParameter Params)
        {
            m_Commands = new Dictionary <int, ServiceProcessRequest>()
            {
                { 4, RequestUpdateAudioRenderer },
                { 5, StartAudioRenderer },
                { 6, StopAudioRenderer },
                { 7, QuerySystemEvent }
            };

            UpdateEvent = new KEvent();

            this.Params = Params;
        }
        private AudioRendererParameter GetAudioRendererParameter(ServiceCtx Context)
        {
            AudioRendererParameter Params = new AudioRendererParameter();

            Params.SampleRate                   = Context.RequestData.ReadInt32();
            Params.SampleCount                  = Context.RequestData.ReadInt32();
            Params.Unknown8                     = Context.RequestData.ReadInt32();
            Params.MixCount                     = Context.RequestData.ReadInt32();
            Params.VoiceCount                   = Context.RequestData.ReadInt32();
            Params.SinkCount                    = Context.RequestData.ReadInt32();
            Params.EffectCount                  = Context.RequestData.ReadInt32();
            Params.PerformanceManagerCount      = Context.RequestData.ReadInt32();
            Params.VoiceDropEnable              = Context.RequestData.ReadInt32();
            Params.SplitterCount                = Context.RequestData.ReadInt32();
            Params.SplitterDestinationDataCount = Context.RequestData.ReadInt32();
            Params.Unknown2C                    = Context.RequestData.ReadInt32();
            Params.Revision                     = Context.RequestData.ReadInt32();

            return(Params);
        }
예제 #4
0
        public long OpenAudioRenderer(ServiceCtx Context)
        {
            //Same buffer as GetAudioRendererWorkBufferSize is receive here.

            AudioRendererParameter Params = new AudioRendererParameter();

            Params.SampleRate    = Context.RequestData.ReadInt32();
            Params.SampleCount   = Context.RequestData.ReadInt32();
            Params.Unknown8      = Context.RequestData.ReadInt32();
            Params.UnknownC      = Context.RequestData.ReadInt32();
            Params.VoiceCount    = Context.RequestData.ReadInt32();
            Params.SinkCount     = Context.RequestData.ReadInt32();
            Params.EffectCount   = Context.RequestData.ReadInt32();
            Params.Unknown1C     = Context.RequestData.ReadInt32();
            Params.Unknown20     = Context.RequestData.ReadInt32();
            Params.SplitterCount = Context.RequestData.ReadInt32();
            Params.Unknown28     = Context.RequestData.ReadInt32();
            Params.Unknown2C     = Context.RequestData.ReadInt32();
            Params.Revision      = Context.RequestData.ReadInt32();

            MakeObject(Context, new IAudioRenderer(Params));

            return(0);
        }
        public long GetAudioRendererWorkBufferSize(ServiceCtx Context)
        {
            AudioRendererParameter Params = GetAudioRendererParameter(Context);

            int Revision = (Params.Revision - Rev0Magic) >> 24;

            if (Revision <= Rev)
            {
                bool IsSplitterSupported = Revision >= 3;

                long Size;

                Size  = IntUtils.AlignUp(Params.Unknown8 * 4, 64);
                Size += Params.MixCount * 0x400;
                Size += (Params.MixCount + 1) * 0x940;
                Size += Params.VoiceCount * 0x3F0;
                Size += IntUtils.AlignUp((Params.MixCount + 1) * 8, 16);
                Size += IntUtils.AlignUp(Params.VoiceCount * 8, 16);
                Size += IntUtils.AlignUp(
                    ((Params.SinkCount + Params.MixCount) * 0x3C0 + Params.SampleCount * 4) *
                    (Params.Unknown8 + 6), 64);
                Size += (Params.SinkCount + Params.MixCount) * 0x2C0;
                Size += (Params.EffectCount + Params.VoiceCount * 4) * 0x30 + 0x50;

                if (IsSplitterSupported)
                {
                    Size += IntUtils.AlignUp((
                                                 NodeStatesGetWorkBufferSize(Params.MixCount + 1) +
                                                 EdgeMatrixGetWorkBufferSize(Params.MixCount + 1)), 16);

                    Size += Params.SplitterDestinationDataCount * 0xE0;
                    Size += Params.SplitterCount * 0x20;
                    Size += IntUtils.AlignUp(Params.SplitterDestinationDataCount * 4, 16);
                }

                Size = Params.EffectCount * 0x4C0 +
                       Params.SinkCount * 0x170 +
                       Params.VoiceCount * 0x100 +
                       IntUtils.AlignUp(Size, 64) + 0x40;

                if (Params.PerformanceManagerCount >= 1)
                {
                    Size += (((Params.EffectCount +
                               Params.SinkCount +
                               Params.VoiceCount +
                               Params.MixCount + 1) * 16 + 0x658) *
                             (Params.PerformanceManagerCount + 1) + 0x13F) & ~0x3FL;
                }

                Size = (Size + 0x1907D) & ~0xFFFL;

                Context.ResponseData.Write(Size);

                Context.Ns.Log.PrintDebug(LogClass.ServiceAudio, $"WorkBufferSize is 0x{Size:x16}.");

                return(0);
            }
            else
            {
                Context.ResponseData.Write(0L);

                Context.Ns.Log.PrintWarning(LogClass.ServiceAudio, $"Library Revision 0x{Params.Revision:x8} is not supported!");

                return(MakeError(ErrorModule.Audio, AudErr.UnsupportedRevision));
            }
        }