// S_LoadSound private SoundEffectCache_t LoadSound(SoundEffect_t s) { // see if still in memory var sc = ( SoundEffectCache_t )Host.Cache.Check(s.cache); if (sc != null) { return(sc); } // load it in var namebuffer = "sound/" + s.name; var data = FileSystem.LoadFile(namebuffer); if (data == null) { Host.Console.Print("Couldn't load {0}\n", namebuffer); return(null); } var info = GetWavInfo(s.name, data); if (info.channels != 1) { Host.Console.Print("{0} is a stereo sample\n", s.name); return(null); } var stepscale = info.rate / ( Single )_shm.speed; var len = ( Int32 )(info.samples / stepscale); len *= info.width * info.channels; s.cache = Host.Cache.Alloc(len, s.name); if (s.cache == null) { return(null); } sc = new SoundEffectCache_t( ); sc.length = info.samples; sc.loopstart = info.loopstart; sc.speed = info.rate; sc.width = info.width; sc.stereo = info.channels; s.cache.data = sc; ResampleSfx(s, sc.speed, sc.width, new ByteArraySegment(data, info.dataofs)); return(sc); }
// SND_PaintChannelFrom16 private void PaintChannelFrom16(Channel_t ch, SoundEffectCache_t sc, int count) { var leftvol = ch.leftvol; var rightvol = ch.rightvol; var sfx = sc.data; var offset = ch.pos * 2; // sfx = (signed short *)sc->data + ch->pos; for (var i = 0; i < count; i++) { int data = ( short )(( ushort )sfx[offset] + (( ushort )sfx[offset + 1] << 8)); // Uze: check is this is right!!! var left = (data * leftvol) >> 8; var right = (data * rightvol) >> 8; this._PaintBuffer[i].left += left; this._PaintBuffer[i].right += right; offset += 2; } ch.pos += count; }
// SND_PaintChannelFrom8 private void PaintChannelFrom8(Channel_t ch, SoundEffectCache_t sc, int count) { if (ch.leftvol > 255) { ch.leftvol = 255; } if (ch.rightvol > 255) { ch.rightvol = 255; } var lscale = ch.leftvol >> 3; var rscale = ch.rightvol >> 3; var sfx = sc.data; var offset = ch.pos; for (var i = 0; i < count; i++) { int data = sfx[offset + i]; this._PaintBuffer[i].left += this._ScaleTable[lscale, data]; this._PaintBuffer[i].right += this._ScaleTable[rscale, data]; } ch.pos += count; }