public int synthesis(Packet op)
{
Info vi = vd.vi;
opb.readinit(op.packet_base, op.packet, op.bytes);
opb.read(1);
// read our mode and pre/post windowsize
mode = opb.read(vd.modebits);
W = vi.mode_param[mode].blockflag;
if (W != 0)
{
lW = opb.read(1); nW = opb.read(1);
}
else
{
lW = 0; nW = 0;
}
// more setup
granulepos = op.granulepos;
sequence = op.packetno - 3; // first block is third packet
eofflag = op.e_o_s;
// alloc pcm passback storage
pcmend = vi.blocksizes[W];
if (pcm.Length < vi.channels)
{
pcm = new float[vi.channels][];
}
for (int i = 0; i < vi.channels; i++)
{
if (pcm[i] == null || pcm[i].Length < pcmend)
{
pcm[i] = new float[pcmend];
}
else
{
for (int j = 0; j < pcmend; j++)
{
pcm[i][j] = 0;
}
}
}
// unpack_header enforces range checking
FuncMapping mapping = vi.map_funcs[vi.mode_param[mode].mapping];
return(mapping.inverse(this, vd.mode[mode]));
}