/* csvorbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * Ported to C# from JOrbis by: Mark Crichton * * Thanks go to the JOrbis team, for licencing the code under the * LGPL, making my job a lot easier. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ using System; using csogg; namespace csvorbis { class Mapping0 : FuncMapping { //static int seq=0; override public void free_info(Object imap){} override public void free_look(Object imap){} override public Object look(DspState vd, InfoMode vm, Object m) { Info vi=vd.vi; LookMapping0 looks=new LookMapping0(); InfoMapping0 info=looks.map=(InfoMapping0)m; looks.mode=vm; looks.time_look=new Object[info.submaps]; looks.floor_look=new Object[info.submaps]; looks.residue_look=new Object[info.submaps]; looks.time_func=new FuncTime[info.submaps]; looks.floor_func=new FuncFloor[info.submaps]; looks.residue_func=new FuncResidue[info.submaps]; for(int i=0;i1) { opb.write(1,1); opb.write(info.submaps-1,4); } else { opb.write(0,1); } if(info.coupling_steps>0) { opb.write(1,1); opb.write(info.coupling_steps-1,8); for(int i=0;i1) { for(int i=0;i=vi.channels || testA>=vi.channels) { //goto err_out; info.free(); return(null); } } } if(opb.read(2)>0) { /* 2,3:reserved */ //goto err_out; info.free(); return(null); } if(info.submaps>1) { for(int i=0;i=info.submaps) { //goto err_out; info.free(); return(null); } } } for(int i=0;i=vi.times) { //goto err_out; info.free(); return(null); } info.floorsubmap[i]=opb.read(8); if(info.floorsubmap[i]>=vi.floors) { //goto err_out; info.free(); return(null); } info.residuesubmap[i]=opb.read(8); if(info.residuesubmap[i]>=vi.residues) { //goto err_out; info.free(); return(null); } } return info; //err_out: //free_info(info); //return(NULL); } float[][] pcmbundle=null; int[] zerobundle=null; int[] nonzero=null; Object[] floormemo=null; override public int inverse(Block vb, Object l) { lock(this) { //System.err.println("Mapping0.inverse"); DspState vd=vb.vd; Info vi=vd.vi; LookMapping0 look=(LookMapping0)l; InfoMapping0 info=look.map; InfoMode mode=look.mode; int n=vb.pcmend=vi.blocksizes[vb.W]; float[] window=vd.wnd[vb.W][vb.lW][vb.nW][mode.windowtype]; // float[][] pcmbundle=new float[vi.channels][]; // int[] nonzero=new int[vi.channels]; if(pcmbundle==null || pcmbundle.Length=0;i--) { float[] pcmM=vb.pcm[info.coupling_mag[i]]; float[] pcmA=vb.pcm[info.coupling_ang[i]]; for(int j=0;j0) { if(ang>0) { pcmM[j]=mag; pcmA[j]=mag-ang; } else { pcmA[j]=mag; pcmM[j]=mag+ang; } } else { if(ang>0) { pcmM[j]=mag; pcmA[j]=mag+ang; } else { pcmA[j]=mag; pcmM[j]=mag-ang; } } } } // /* compute and apply spectral envelope */ for(int i=0;i1) { ret++; v = (int)((uint)v >> 1); } return(ret); } } class InfoMapping0 { internal int submaps; // <= 16 internal int[] chmuxlist=new int[256]; // up to 256 channels in a Vorbis stream internal int[] timesubmap=new int[16]; // [mux] internal int[] floorsubmap=new int[16]; // [mux] submap to floors internal int[] residuesubmap=new int[16];// [mux] submap to residue internal int[] psysubmap=new int[16]; // [mux]; encode only internal int coupling_steps; internal int[] coupling_mag=new int[256]; internal int[] coupling_ang=new int[256]; internal void free() { chmuxlist=null; timesubmap=null; floorsubmap=null; residuesubmap=null; psysubmap=null; coupling_mag=null; coupling_ang=null; } } class LookMapping0 { internal InfoMode mode; internal InfoMapping0 map; internal Object[] time_look; internal Object[] floor_look; //Object[] floor_state; internal Object[] residue_look; //PsyLook[] psy_look; internal FuncTime[] time_func; internal FuncFloor[] floor_func; internal FuncResidue[] residue_func; internal int ch; //float[][] decay; //int lastframe; // if a different mode is called, we need to // invalidate decay and floor state } }