private void Initialize(Header header) { // REVIEW: allow customizable scale factor float scalefactor = 32700.0f; int mode = header.mode(); int layer = header.layer(); int channels = mode == Header.SINGLE_CHANNEL ? 1 : 2; // set up output buffer if not set up by client. if (m_Output == null) { m_Output = new SampleBuffer(header.frequency(), channels); } float[] factors = m_Equalizer.BandFactors; //Console.WriteLine("NOT CREATING SYNTHESIS FILTERS"); m_LeftChannelFilter = new SynthesisFilter(0, scalefactor, factors); // REVIEW: allow mono output for stereo if (channels == 2) { m_RightChannelFilter = new SynthesisFilter(1, scalefactor, factors); } m_OutputChannels = channels; m_OutputFrequency = header.frequency(); m_IsInitialized = true; }
private void Initialize(Header header) { // REVIEW: allow customizable scale factor float scalefactor = 32700.0f; int mode = header.mode(); int layer = header.layer(); int channels = mode == Header.SINGLE_CHANNEL ? 1 : 2; // set up output buffer if not set up by client. if (m_Output == null) m_Output = new SampleBuffer(header.frequency(), channels); float[] factors = m_Equalizer.BandFactors; //Console.WriteLine("NOT CREATING SYNTHESIS FILTERS"); m_LeftChannelFilter = new SynthesisFilter(0, scalefactor, factors); // REVIEW: allow mono output for stereo if (channels == 2) m_RightChannelFilter = new SynthesisFilter(1, scalefactor, factors); m_OutputChannels = channels; m_OutputFrequency = header.frequency(); m_IsInitialized = true; }
private void compute_pcm_samples3(ABuffer buffer) { float[] vp = actual_v; float[] tmpOut = _tmpOut; int dvp = 0; for (int i = 0; i < 32; i++) { float[] dp = d16[i]; float pcm_sample = ((vp[3 + dvp]*dp[0]) + (vp[2 + dvp]*dp[1]) + (vp[1 + dvp]*dp[2]) + (vp[0 + dvp]*dp[3]) + (vp[15 + dvp]*dp[4]) + (vp[14 + dvp]*dp[5]) + (vp[13 + dvp]*dp[6]) + (vp[12 + dvp]*dp[7]) + (vp[11 + dvp]*dp[8]) + (vp[10 + dvp]*dp[9]) + (vp[9 + dvp]*dp[10]) + (vp[8 + dvp]*dp[11]) + (vp[7 + dvp]*dp[12]) + (vp[6 + dvp]*dp[13]) + (vp[5 + dvp]*dp[14]) + (vp[4 + dvp]*dp[15]))* scalefactor; tmpOut[i] = pcm_sample; dvp += 16; } }
private void compute_pcm_samples2(ABuffer buffer) { float[] vp = actual_v; //int inc = v_inc; float[] tmpOut = _tmpOut; int dvp = 0; // fat chance of having this loop unroll for (int i = 0; i < 32; i++) { float[] dp = d16[i]; float pcm_sample; pcm_sample = ((vp[2 + dvp]*dp[0]) + (vp[1 + dvp]*dp[1]) + (vp[0 + dvp]*dp[2]) + (vp[15 + dvp]*dp[3]) + (vp[14 + dvp]*dp[4]) + (vp[13 + dvp]*dp[5]) + (vp[12 + dvp]*dp[6]) + (vp[11 + dvp]*dp[7]) + (vp[10 + dvp]*dp[8]) + (vp[9 + dvp]*dp[9]) + (vp[8 + dvp]*dp[10]) + (vp[7 + dvp]*dp[11]) + (vp[6 + dvp]*dp[12]) + (vp[5 + dvp]*dp[13]) + (vp[4 + dvp]*dp[14]) + (vp[3 + dvp]*dp[15]))* scalefactor; tmpOut[i] = pcm_sample; dvp += 16; } // for }
/// <summary> /// Calculate 32 PCM samples and put the into the Obuffer-object. /// </summary> public void calculate_pcm_samples(ABuffer buffer) { compute_new_v(); compute_pcm_samples(buffer); actual_write_pos = (actual_write_pos + 1) & 0xf; actual_v = (actual_v == v1) ? v2 : v1; // initialize samples[]: //for (register float *floatp = samples + 32; floatp > samples; ) // *--floatp = 0.0f; // MDM: this may not be necessary. The Layer III decoder always // outputs 32 subband samples, but I haven't checked layer I & II. for (int p = 0; p < 32; p++) samples[p] = 0.0f; }
private void compute_pcm_samples(ABuffer buffer) { switch (actual_write_pos) { case 0: compute_pcm_samples0(buffer); break; case 1: compute_pcm_samples1(buffer); break; case 2: compute_pcm_samples2(buffer); break; case 3: compute_pcm_samples3(buffer); break; case 4: compute_pcm_samples4(buffer); break; case 5: compute_pcm_samples5(buffer); break; case 6: compute_pcm_samples6(buffer); break; case 7: compute_pcm_samples7(buffer); break; case 8: compute_pcm_samples8(buffer); break; case 9: compute_pcm_samples9(buffer); break; case 10: compute_pcm_samples10(buffer); break; case 11: compute_pcm_samples11(buffer); break; case 12: compute_pcm_samples12(buffer); break; case 13: compute_pcm_samples13(buffer); break; case 14: compute_pcm_samples14(buffer); break; case 15: compute_pcm_samples15(buffer); break; } if (buffer != null) { buffer.AppendSamples(channel, _tmpOut); } }