1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: single-block PCM synthesis
15 last mod: $Id: synthesis.c,v 1.12 2000/01/12 11:34:41 xiphmont Exp $
17 ********************************************************************/
20 #include "vorbis/codec.h"
29 int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){
31 vorbis_dsp_state *vd=vb->vd;
32 vorbis_info *vi=vd->vi;
33 oggpack_buffer *opb=&vb->opb;
38 /* first things first. Make sure decode is ready */
39 _oggpack_readinit(opb,op->packet,op->bytes);
41 /* Check the packet type */
42 if(_oggpack_read(opb,1)!=0){
43 /* Oops. This is not an audio data packet */
47 /* Decode the block size */
48 vb->W=_oggpack_read(opb,1);
50 vb->lW=_oggpack_read(opb,1);
51 vb->nW=_oggpack_read(opb,1);
57 window=vb->vd->window[vb->W][vb->lW][vb->nW];
59 /* other random setup */
60 vb->frameno=op->frameno;
61 vb->sequence=op->packetno-3; /* first block is third packet */
63 vb->eofflag=op->e_o_s;
64 vl=&vb->vd->vl[vb->W];
65 spectral_order=vi->floororder[vb->W];
67 /* The storage vectors are large enough; set the use markers */
68 n=vb->pcmend=vi->blocksize[vb->W];
70 /* No envelope encoding yet */
71 _oggpack_read(opb,0,1);
73 for(i=0;i<vi->channels;i++){
74 double *lpc=vb->lpc[i];
75 double *lsp=vb->lsp[i];
77 /* recover the spectral envelope */
78 if(_vs_spectrum_decode(vb,&vb->amp[i],lsp)<0)return(-1);
80 /* recover the spectral residue */
81 if(_vs_residue_decode(vb,vb->pcm[i])<0)return(-1);
89 sprintf(buffer,"Sres%d.m",vb->sequence);
90 out=fopen(buffer,"w+");
92 fprintf(out,"%g\n",vb->pcm[i][j]);
98 vorbis_lsp_to_lpc(lsp,lpc,vl->m);
100 /* apply envelope to residue */
108 vorbis_lpc_to_curve(curve,lpc,vb->amp[i],vl);
111 sprintf(buffer,"Smask%d.m",vb->sequence);
112 out=fopen(buffer,"w+");
114 fprintf(out,"%g\n",curve[j]);
117 sprintf(buffer,"Slsp%d.m",vb->sequence);
118 out=fopen(buffer,"w+");
120 fprintf(out,"%g\n",lsp[j]);
123 sprintf(buffer,"Slpc%d.m",vb->sequence);
124 out=fopen(buffer,"w+");
126 fprintf(out,"%g\n",lpc[j]);
131 vorbis_lpc_apply(vb->pcm[i],lpc,vb->amp[i],vl);
139 sprintf(buffer,"Sspectrum%d.m",vb->sequence);
140 out=fopen(buffer,"w+");
142 fprintf(out,"%g\n",vb->pcm[i][j]);
149 mdct_backward(&vb->vd->vm[vb->W],vb->pcm[i],vb->pcm[i],window);