public long RequestUpdateAudioRenderer(ServiceCtx context) { long outputPosition = context.Request.ReceiveBuff[0].Position; long outputSize = context.Request.ReceiveBuff[0].Size; MemoryHelper.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; 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); }