private ElfSymbol GetSymbol(IMemoryManager memory, long address, long strTblAddr) { int nameIndex = memory.ReadInt32(address + 0); int info = memory.ReadByte(address + 4); int other = memory.ReadByte(address + 5); int shIdx = memory.ReadInt16(address + 6); long value = memory.ReadInt64(address + 8); long size = memory.ReadInt64(address + 16); string name = string.Empty; for (int chr; (chr = memory.ReadByte(strTblAddr + nameIndex++)) != 0;) { name += (char)chr; } return(new ElfSymbol(name, info, other, shIdx, value, size)); }
private AdpcmDecoderContext GetAdpcmDecoderContext(long position, long size) { if (size == 0) { return(null); } AdpcmDecoderContext context = new AdpcmDecoderContext(); context.Coefficients = new short[size >> 1]; for (int offset = 0; offset < size; offset += 2) { context.Coefficients[offset >> 1] = _memory.ReadInt16(position + offset); } return(context); }
private void UpdateBuffer(IMemoryManager memory) { // TODO: Implement conversion for formats other // than interleaved stereo (2 channels). // As of now, it assumes that HostChannelsCount == 2. WaveBuffer wb = WaveBuffers[_bufferIndex]; if (wb.Position == 0) { _samples = new int[0]; return; } if (SampleFormat == SampleFormat.PcmInt16) { int samplesCount = (int)(wb.Size / (sizeof(short) * ChannelsCount)); _samples = new int[samplesCount * AudioRendererConsts.HostChannelsCount]; if (ChannelsCount == 1) { for (int index = 0; index < samplesCount; index++) { short sample = memory.ReadInt16(wb.Position + index * 2); _samples[index * 2 + 0] = sample; _samples[index * 2 + 1] = sample; } } else { for (int index = 0; index < samplesCount * 2; index++) { _samples[index] = memory.ReadInt16(wb.Position + index * 2); } } } else if (SampleFormat == SampleFormat.Adpcm) { byte[] buffer = memory.ReadBytes(wb.Position, wb.Size); _samples = AdpcmDecoder.Decode(buffer, AdpcmCtx); } else { throw new InvalidOperationException(); } if (SampleRate != AudioRendererConsts.HostSampleRate) { // TODO: We should keep the frames being discarded (see the 4 below) // on a buffer and include it on the next samples buffer, to allow // the resampler to do seamless interpolation between wave buffers. int samplesCount = _samples.Length / AudioRendererConsts.HostChannelsCount; samplesCount = Math.Max(samplesCount - 4, 0); _samples = Resampler.Resample2Ch( _samples, SampleRate, AudioRendererConsts.HostSampleRate, samplesCount, ref _resamplerFracPart); } }