⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sublay2.cpp

📁 MP3解压程序源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
bool SubbandLayer2::read_sampledata(Ibitstream *stream){  if (allocation)	 if (groupingtable)	 {		uint32 samplecode = stream->get_bits(codelength);		// create requantized samples:		samplecode += samplecode << 1;		register real *target = samples;		register const real *source = groupingtable + samplecode;		*target++ = *source++;		*target++ = *source++;		*target = *source;		// memcpy (samples, groupingtable + samplecode, 3 * sizeof (real));	 }	 else	 {		samples[0] = real (stream->get_bits(codelength)) * factor - 1.0;		samples[1] = real (stream->get_bits(codelength)) * factor - 1.0;		samples[2] = real (stream->get_bits(codelength)) * factor - 1.0;	 }  samplenumber = 0;  if (++groupnumber == 12)	 return true;  else	 return false;}bool SubbandLayer2::put_next_sample (e_channels channels,												 SynthesisFilter *filter1,                                     SynthesisFilter *){  if (allocation && channels != right)  {	 register real sample = samples[samplenumber];	 if (!groupingtable)		sample = (sample + d) * c;	 if (groupnumber <= 4)		sample *= scalefactor1;	 else if (groupnumber <= 8)		sample *= scalefactor2;	 else		sample *= scalefactor3;	 filter1->input_sample(sample, subbandnumber);  }  if (++samplenumber == 3)	 return true;  else	 return false;}/******************************//*** Intensity Stereo Class ***//******************************/SubbandLayer2IntensityStereo::SubbandLayer2IntensityStereo(uint32 subbandnumber): SubbandLayer2(subbandnumber){}void SubbandLayer2IntensityStereo::read_scalefactor_selection(Ibitstream *stream,																				  Crc16 *crc){  if (allocation)  {	 scfsi = stream->get_bits(2);	 channel2_scfsi = stream->get_bits(2);	 if (crc)	 {		crc->add_bits(scfsi, 2);		crc->add_bits(channel2_scfsi, 2);	 }  }}void SubbandLayer2IntensityStereo::read_scalefactor(Ibitstream *stream, Header *header){  if (allocation)  {	 SubbandLayer2::read_scalefactor(stream, header);	 switch (channel2_scfsi)	 {		case 0:		channel2_scalefactor1 = scalefactors[stream->get_bits(6)];		channel2_scalefactor2 = scalefactors[stream->get_bits(6)];		channel2_scalefactor3 = scalefactors[stream->get_bits(6)];		break;		case 1:		channel2_scalefactor1 = channel2_scalefactor2 = scalefactors[stream->get_bits (6)];		channel2_scalefactor3 = scalefactors[stream->get_bits(6)];		break;		case 2:		channel2_scalefactor1 = channel2_scalefactor2 =		channel2_scalefactor3 = scalefactors[stream->get_bits(6)];		break;		case 3:		channel2_scalefactor1 = scalefactors[stream->get_bits(6)];		channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream->get_bits (6)];		break;	 }  }}bool SubbandLayer2IntensityStereo::put_next_sample (e_channels channels,	SynthesisFilter *filter1, SynthesisFilter *filter2){  if (allocation)  {	 register real sample = samples[samplenumber];	 if (!groupingtable)		sample = (sample + d) * c;    if (channels == both)    {		register float sample2 = sample;      if (groupnumber <= 4)      {	sample *= scalefactor1;	sample2 *= channel2_scalefactor1;		}		else if (groupnumber <= 8)		{	sample *= scalefactor2;	sample2 *= channel2_scalefactor2;		}		else		{	sample *= scalefactor3;	sample2 *= channel2_scalefactor3;		}		filter1->input_sample(sample, subbandnumber);      filter2->input_sample(sample2, subbandnumber);    }    else if (channels == left)	 {		if (groupnumber <= 4)			sample *= scalefactor1;      else if (groupnumber <= 8)			sample *= scalefactor2;		else			sample *= scalefactor3;		filter1->input_sample(sample, subbandnumber);	 }	 else	 {		if (groupnumber <= 4)			sample *= channel2_scalefactor1;		else if (groupnumber <= 8)			sample *= channel2_scalefactor2;		else			sample *= channel2_scalefactor3;		filter1->input_sample(sample, subbandnumber);	 }  }  if (++samplenumber == 3)	 return true;  else	 return false;}/********************//*** Stereo Class ***//********************/SubbandLayer2Stereo::SubbandLayer2Stereo(uint32 subbandnumber): SubbandLayer2(subbandnumber){}void SubbandLayer2Stereo::read_allocation(Ibitstream *stream, Header *header, Crc16 *crc){  uint32 length = get_allocationlength(header);  allocation = stream->get_bits(length);  channel2_allocation = stream->get_bits(length);  if (crc)  {	 crc->add_bits(allocation, length);	 crc->add_bits(channel2_allocation, length);  }}void SubbandLayer2Stereo::read_scalefactor_selection(Ibitstream *stream, Crc16 *crc){  if (allocation)  {	 scfsi = stream->get_bits(2);	 if (crc)		crc->add_bits(scfsi, 2);  }  if (channel2_allocation)  {	 channel2_scfsi = stream->get_bits(2);	 if (crc)		crc->add_bits(channel2_scfsi, 2);  }}void SubbandLayer2Stereo::read_scalefactor(Ibitstream *stream, Header *header){  SubbandLayer2::read_scalefactor(stream, header);  if (channel2_allocation)  {	 switch (channel2_scfsi)	 {		case 0:  	   channel2_scalefactor1 = scalefactors[stream->get_bits(6)];	   channel2_scalefactor2 = scalefactors[stream->get_bits(6)];	   channel2_scalefactor3 = scalefactors[stream->get_bits(6)];	   break;		case 1:	   channel2_scalefactor1 = channel2_scalefactor2 =      						      scalefactors[stream->get_bits(6)];	   channel2_scalefactor3 = scalefactors[stream->get_bits(6)];	   break;		case 2:	   channel2_scalefactor1 = channel2_scalefactor2 =	   channel2_scalefactor3 = scalefactors[stream->get_bits(6)];	   break;		case 3:	   channel2_scalefactor1 = scalefactors[stream->get_bits(6)];	   channel2_scalefactor2 = channel2_scalefactor3 =      							   scalefactors[stream->get_bits(6)];  	   break;	 }	 prepare_sample_reading(header, channel2_allocation, &channel2_groupingtable,                           &channel2_factor, &channel2_codelength, &channel2_c,                           &channel2_d);  }}bool SubbandLayer2Stereo::read_sampledata(Ibitstream *stream){  bool returnvalue = SubbandLayer2::read_sampledata(stream);  if (channel2_allocation)	 if (channel2_groupingtable) {		uint32 samplecode = stream->get_bits(channel2_codelength);		// create requantized samples:		samplecode += samplecode << 1;		register real *target = channel2_samples;		register const real *source = channel2_groupingtable + samplecode;		*target++ = *source++;		*target++ = *source++;		*target = *source;		// memcpy (channel2_samples, channel2_groupingtable + samplecode, 3 * sizeof (real));    } else {		channel2_samples[0] = real (stream->get_bits(channel2_codelength)) *      							 channel2_factor - 1.0;		channel2_samples[1] = real (stream->get_bits(channel2_codelength)) *      							 channel2_factor - 1.0;		channel2_samples[2] = real (stream->get_bits(channel2_codelength)) *                            channel2_factor - 1.0;	 }  return returnvalue;}bool SubbandLayer2Stereo::put_next_sample(e_channels channels,														SynthesisFilter *filter1,                                          SynthesisFilter *filter2){  bool returnvalue = SubbandLayer2::put_next_sample(channels, filter1, filter2);  if (channel2_allocation && channels != left)  {	 register real sample = channel2_samples[samplenumber - 1];	 if (!channel2_groupingtable)		sample = (sample + channel2_d) * channel2_c;	 if (groupnumber <= 4)		sample *= channel2_scalefactor1;	 else if (groupnumber <= 8)		sample *= channel2_scalefactor2;	 else		sample *= channel2_scalefactor3;	 if (channels == both)		filter2->input_sample(sample, subbandnumber);	 else		filter1->input_sample(sample, subbandnumber);  }  return returnvalue;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -