public long Get(ServiceCtx Context) { Context.Device.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); long Position = Context.Request.ReceiveBuff[0].Position; AMemoryHelper.FillWithZeros(Context.Memory, Position, 0x80); Context.Memory.WriteInt32(Position, 0); Context.Memory.WriteInt32(Position + 4, 1); Context.Memory.WriteInt64(Position + 8, 1); return(GetBase(Context)); }
public long ListDisplays(ServiceCtx Context) { long RecBuffPtr = Context.Request.ReceiveBuff[0].Position; AMemoryHelper.FillWithZeros(Context.Memory, RecBuffPtr, 0x60); //Add only the default display to buffer Context.Memory.WriteBytes(RecBuffPtr, Encoding.ASCII.GetBytes("Default")); Context.Memory.WriteInt64(RecBuffPtr + 0x40, 0x1L); Context.Memory.WriteInt64(RecBuffPtr + 0x48, 0x1L); Context.Memory.WriteInt64(RecBuffPtr + 0x50, 1920L); Context.Memory.WriteInt64(RecBuffPtr + 0x58, 1080L); Context.ResponseData.Write(1L); return(0); }
private void SvcMapSharedMemory(AThreadState ThreadState) { int Handle = (int)ThreadState.X0; long Src = (long)ThreadState.X1; long Size = (long)ThreadState.X2; int Perm = (int)ThreadState.X3; if (!IsValidPosition(Src)) { Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Src:x16}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); return; } HSharedMem SharedMem = Process.HandleTable.GetData <HSharedMem>(Handle); if (SharedMem != null) { Memory.Manager.Map(Src, Size, (int)MemoryType.SharedMemory, AMemoryPerm.Write); AMemoryHelper.FillWithZeros(Memory, Src, (int)Size); SharedMem.AddVirtualPosition(Memory, Src, Size); Memory.Manager.Reprotect(Src, Size, (AMemoryPerm)Perm); lock (MappedSharedMems) { MappedSharedMems.Add((SharedMem, Src, Size)); } ThreadState.X0 = 0; } //TODO: Error codes. }
public long RequestUpdateAudioRenderer(ServiceCtx Context) { long OutputPosition = Context.Request.ReceiveBuff[0].Position; long OutputSize = Context.Request.ReceiveBuff[0].Size; AMemoryHelper.FillWithZeros(Context.Memory, OutputPosition, (int)OutputSize); long InputPosition = Context.Request.SendBuff[0].Position; StructReader Reader = new StructReader(Context.Memory, InputPosition); StructWriter Writer = new StructWriter(Context.Memory, OutputPosition); UpdateDataHeader InputHeader = Reader.Read <UpdateDataHeader>(); Reader.Read <BehaviorIn>(InputHeader.BehaviorSize); MemoryPoolIn[] MemoryPoolsIn = Reader.Read <MemoryPoolIn>(InputHeader.MemoryPoolSize); for (int Index = 0; Index < MemoryPoolsIn.Length; Index++) { MemoryPoolIn MemoryPool = MemoryPoolsIn[Index]; if (MemoryPool.State == MemoryPoolState.RequestAttach) { MemoryPools[Index].OutStatus.State = MemoryPoolState.Attached; } else if (MemoryPool.State == MemoryPoolState.RequestDetach) { MemoryPools[Index].OutStatus.State = MemoryPoolState.Detached; } } Reader.Read <VoiceChannelResourceIn>(InputHeader.VoiceResourceSize); VoiceIn[] VoicesIn = Reader.Read <VoiceIn>(InputHeader.VoiceSize); for (int Index = 0; Index < VoicesIn.Length; Index++) { VoiceIn Voice = VoicesIn[Index]; VoiceContext VoiceCtx = Voices[Index]; VoiceCtx.SetAcquireState(Voice.Acquired != 0); if (Voice.Acquired == 0) { continue; } if (Voice.FirstUpdate != 0) { VoiceCtx.AdpcmCtx = GetAdpcmDecoderContext( Voice.AdpcmCoeffsPosition, Voice.AdpcmCoeffsSize); VoiceCtx.SampleFormat = Voice.SampleFormat; VoiceCtx.SampleRate = Voice.SampleRate; VoiceCtx.ChannelsCount = Voice.ChannelsCount; VoiceCtx.SetBufferIndex(Voice.BaseWaveBufferIndex); } VoiceCtx.WaveBuffers[0] = Voice.WaveBuffer0; VoiceCtx.WaveBuffers[1] = Voice.WaveBuffer1; VoiceCtx.WaveBuffers[2] = Voice.WaveBuffer2; VoiceCtx.WaveBuffers[3] = Voice.WaveBuffer3; VoiceCtx.Volume = Voice.Volume; VoiceCtx.PlayState = Voice.PlayState; } UpdateAudio(); UpdateDataHeader OutputHeader = new UpdateDataHeader(); int UpdateHeaderSize = Marshal.SizeOf <UpdateDataHeader>(); OutputHeader.Revision = IAudioRendererManager.RevMagic; OutputHeader.BehaviorSize = 0xb0; OutputHeader.MemoryPoolSize = (Params.EffectCount + Params.VoiceCount * 4) * 0x10; OutputHeader.VoiceSize = Params.VoiceCount * 0x10; OutputHeader.EffectSize = Params.EffectCount * 0x10; OutputHeader.SinkSize = Params.SinkCount * 0x20; OutputHeader.PerformanceManagerSize = 0x10; OutputHeader.TotalSize = UpdateHeaderSize + OutputHeader.BehaviorSize + OutputHeader.MemoryPoolSize + OutputHeader.VoiceSize + OutputHeader.EffectSize + OutputHeader.SinkSize + OutputHeader.PerformanceManagerSize; Writer.Write(OutputHeader); foreach (MemoryPoolContext MemoryPool in MemoryPools) { Writer.Write(MemoryPool.OutStatus); } foreach (VoiceContext Voice in Voices) { Writer.Write(Voice.OutStatus); } return(0); }
public long RequestUpdateAudioRenderer(ServiceCtx Context) { long OutputPosition = Context.Request.ReceiveBuff[0].Position; long OutputSize = Context.Request.ReceiveBuff[0].Size; AMemoryHelper.FillWithZeros(Context.Memory, OutputPosition, (int)OutputSize); long InputPosition = Context.Request.SendBuff[0].Position; UpdateDataHeader InputDataHeader = AMemoryHelper.Read <UpdateDataHeader>(Context.Memory, InputPosition); UpdateDataHeader OutputDataHeader = new UpdateDataHeader(); int UpdateHeaderSize = Marshal.SizeOf <UpdateDataHeader>(); OutputDataHeader.Revision = Params.Revision; OutputDataHeader.BehaviorSize = 0xb0; OutputDataHeader.MemoryPoolsSize = (Params.EffectCount + Params.VoiceCount * 4) * 0x10; OutputDataHeader.VoicesSize = Params.VoiceCount * 0x10; OutputDataHeader.EffectsSize = Params.EffectCount * 0x10; OutputDataHeader.SinksSize = Params.SinkCount * 0x20; OutputDataHeader.PerformanceManagerSize = 0x10; OutputDataHeader.TotalSize = UpdateHeaderSize + OutputDataHeader.BehaviorSize + OutputDataHeader.MemoryPoolsSize + OutputDataHeader.VoicesSize + OutputDataHeader.EffectsSize + OutputDataHeader.SinksSize + OutputDataHeader.PerformanceManagerSize; AMemoryHelper.Write(Context.Memory, OutputPosition, OutputDataHeader); int InMemoryPoolOffset = UpdateHeaderSize + InputDataHeader.BehaviorSize; int OutMemoryPoolOffset = UpdateHeaderSize; for (int Offset = 0; Offset < OutputDataHeader.MemoryPoolsSize; Offset += 0x10, InMemoryPoolOffset += 0x20) { MemoryPoolState PoolState = (MemoryPoolState)Context.Memory.ReadInt32(InputPosition + InMemoryPoolOffset + 0x10); //TODO: Figure out what the other values does. if (PoolState == MemoryPoolState.RequestAttach) { Context.Memory.WriteInt32(OutputPosition + OutMemoryPoolOffset + Offset, (int)MemoryPoolState.Attached); } else if (PoolState == MemoryPoolState.RequestDetach) { Context.Memory.WriteInt32(OutputPosition + OutMemoryPoolOffset + Offset, (int)MemoryPoolState.Detached); } } int OutVoicesOffset = OutMemoryPoolOffset + OutputDataHeader.MemoryPoolsSize; for (int Offset = 0; Offset < OutputDataHeader.VoicesSize; Offset += 0x10) { Context.Memory.WriteInt32(OutputPosition + OutVoicesOffset + Offset + 8, (int)VoicePlaybackState.Finished); } //TODO: We shouldn't be signaling this here. UpdateEvent.WaitEvent.Set(); return(0); }