1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_stereo_proc.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Functions:
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_st_mid_side
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_st_intensity
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_stereo_proc
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberpvmp3_st_mid_side
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xr[],      input channel
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xl[],
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 Start,     Location of first element where stereo intensity is applied
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 Number     number of elements affected
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xl[],      generated stereo channel
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberpvmp3_st_intensity
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xr[],      input channel
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xl[],
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 is_pos,    index to table is_ratio_factor[]
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 Start,     Location of first element where stereo intensity is applied
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 Number     number of elements affected
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xl[],      generated stereo channel
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberpvmp3_stereo_proc
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xr[],                    input channel
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xl[],
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   mp3ScaleFactors  *scalefac,    scale factors structure
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   struct gr_info_s *gr_info,     granule structure
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   mp3Header *info                mp3 header info
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   int32 xl[],      generated stereo channel
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    stereo processing for mpeg1 layer III
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    After requantization, the reconstructed values are processed for ms_stereo
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    or intensity_stereo modes or both, before passing them to the synthesis
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    filterbank
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    In ms_stereo mode the values of the normalized middle/side channels
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    M[l] and S[l] are transmitted instead of the left/right channel values
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    L[l] and R[l]. From here, L[l] and R[l] are reconstructed
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Intensity_stereo is done by specifying the magnitude (via the
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    scalefactors of the left channel) and a stereo position is_pos[sfb],
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    which is transmitted instead of scalefactors of the right channel.
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    The stereo position is used to derive the left and right channel signals
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_stereo_proc.h"
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_tables.h"
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define N31 31
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define Q31_fmt(a)    (int32(double(0x7FFFFFFF)*(a)))
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *  TmpFac= tan(is_pos * (PI /12));
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *  TmpFac /= (1 + TmpFac);
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32  is_ratio_factor[8] = {0,
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                   Q31_fmt(0.21132486540519),   Q31_fmt(0.36602540378444),   Q31_fmt(0.50000000000000),
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                   Q31_fmt(0.63397459621556),   Q31_fmt(0.78867513459481),   Q31_fmt(1.00000000000000),
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                   0
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                  };
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_st_mid_side(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32 Start,
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32 Number)
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_xr  = &xr[Start];
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_xl  = &xl[Start];
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (int32 i = Number >> 1; i != 0; i--)
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 xxr = *(pt_xr) << 1;
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 xxl = *(pt_xl) << 1;
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xr++)  = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655));   /* Sum */
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xl++)  = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655));   /* Diff */
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        xxr = *(pt_xr) << 1;
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        xxl = *(pt_xl) << 1;
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xr++)  = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655));   /* Sum */
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xl++)  = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655));   /* Diff */
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (Number&1)
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 xxr = *(pt_xr) << 1;
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 xxl = *(pt_xl) << 1;
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xr)  = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655));   /* Sum */
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xl)  = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655));   /* Diff */
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_st_intensity(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        int32 is_pos,
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        int32 Start,
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        int32 Number)
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 TmpFac = is_ratio_factor[ is_pos & 7];
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_xr  = &xr[Start];
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_xl  = &xl[Start];
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (int32 i = Number >> 1; i != 0; i--)
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac);
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xl++) = (*pt_xr) - tmp;
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xr++) = tmp;
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac);
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xl++) = (*pt_xr) - tmp;
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xr++) = tmp;
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (Number&1)
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac);
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xl) = (*pt_xr) - tmp;
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_xr) = tmp;
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       mp3ScaleFactors *scalefac,
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       granuleInfo *gr_info,
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32 used_freq_lines,
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       mp3Header *info)
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sb;
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 ss;
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfbNo;
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfbStart;
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfb;
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfbTemp;
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i;
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 j;
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i_stereo  = (info->mode == MPG_MD_JOINT_STEREO) &&
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                      (info->mode_ext & 0x1);
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 ms_stereo = (info->mode == MPG_MD_JOINT_STEREO) &&
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                      (info->mode_ext & 0x2);
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfreq  = info->version_x + (info->version_x << 1);
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    sfreq += info->sampling_frequency;
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (i_stereo)
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (gr_info->window_switching_flag && (gr_info->block_type == 2))
287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (gr_info->mixed_block_flag)
289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                /*
291d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                 * mixed blocks processing
292d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                 */
293d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                i = 31;
294d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                ss = 17;
295d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                sb = 0;
296d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                while (i >= 0)
297d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
298d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    if (xl[(i*FILTERBANK_BANDS) + ss])
299d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
300d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sb = (i << 4) + (i << 1) + ss;
301d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        i = -1;
302d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
303d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    else
304d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
305d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        ss--;
306d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        if (ss < 0)
307d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
308d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            i--;
309d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            ss = 17;
310d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
311d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
312d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
313d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
314d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (sb < 36)
315d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
316d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /*
317d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     * mixed blocks processing: intensity bound inside long blocks
318d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     */
319d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* 1. long blocks up to intensity border: not intensity */
320d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
321d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    if (mp3_sfBandIndex[sfreq].l[4] <= sb)
322d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
323d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfb = 4;
324d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
325d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    else
326d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
327d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfb = 0;
328d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
329d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
330d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    while (mp3_sfBandIndex[sfreq].l[sfb] < sb)
331d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
332d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfb++;
333d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
334d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
335d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* from that sfb on intensity stereo */
336d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbTemp = sfb;  /* save for later use */
337d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
338d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbStart = mp3_sfBandIndex[sfreq].l[sfb];
339d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
340d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* from 0 up to sfbStart do ms_stereo or normal stereo */
341d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
342d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    if (ms_stereo)
343d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
344d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        pvmp3_st_mid_side(xr, xl, 0, sfbStart);
345d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
346d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
347d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* 2. long blocks from intensity border up to sfb band 8: intensity */
348d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* calc. is_ratio */
349d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
350d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
351d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* Start of intensity stereo of remaining sfc bands: */
352d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    for (; sfbTemp < 8; sfbTemp++)
353d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
354d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbStart = mp3_sfBandIndex[sfreq].l[sfbTemp];  /* = Start in 0 ... 575 */
355d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp+1] - mp3_sfBandIndex[sfreq].l[sfbTemp]; /* No of lines to process */
356d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
357d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        if (scalefac->l[sfbTemp] != 7)
358d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
359d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            pvmp3_st_intensity(xr, xl, scalefac->l[sfbTemp], sfbStart, sfbNo);
360d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
361d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        else if (ms_stereo)
362d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
363d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
364d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
365d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
366d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }  /* for (; sfbTemp < 8; sfbTemp++) */
367d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
368d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    for (j = 0; j < 3; j++)
369d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
370d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        /* 3. short blocks from sfbcnt to last sfb do intensity stereo */
371d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        for (sfbTemp = 3; sfbTemp < 13; sfbTemp++)
372d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
373d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */
374d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo;
375d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
376d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            if (scalefac->s[j][sfbTemp] != 7)
377d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
378d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo);
379d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
380d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            else if (ms_stereo)
381d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
382d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
383d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
384d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
385d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }  /* for (; sfbTemp < 22; sfbTemp++) */
386d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    } /* for (j = 0; j < 3; j++) */
387d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
388d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else   /* else for (sb >= 36) */
389d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
390d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /*
391d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     * mixed blocks processing: intensity bound outside long blocks
392d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     */
393d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
394d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
395d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /*
396d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     * 2. short blocks from sfb band 3 up to intensity border: normal stereo, ms stereo and intensity
397d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     */
398d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    for (j = 0; j < 3; j++)
399d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
400d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        int32 sfbcnt;
401d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbcnt = -1;
402d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
403d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        for (sfb = 12; sfb >= 3; sfb--)
404d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
405d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            int32 lines;
406d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
407d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
408d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
409d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            while (lines > 0)
410d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
411d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                if (xl[i])
412d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                {
413d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                    sfbcnt = sfb;
414d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                    sfb = -10;
415d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                    lines = -10;
416d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                }
417d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                lines--;
418d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                i--;
419d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
420d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
421d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
422d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbcnt += 1;
423d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        if (sfbcnt < 3)
424d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
425d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbcnt = 3;
426d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
427d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
428d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbTemp = sfbcnt;        /* for later use */
429d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
430d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
431d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        /*
432d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                         *   do normal stereo or MS stereo from sfb 3 to < sfbcnt:
433d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                         */
434d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        for (sb = 3; sb < sfbcnt; sb++)
435d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
436d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbNo = mp3_sfBandIndex[sfreq].s[sb+1] - mp3_sfBandIndex[sfreq].s[sb];
437d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sb] + j * sfbNo;
438d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
439d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            if (ms_stereo)
440d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
441d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
442d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
443d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
444d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
445d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
446d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        /* from sfbcnt to last sfb do intensity stereo */
447d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        for (; sfbTemp < 13; sfbTemp++)
448d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
449d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */
450d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo;
451d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
452d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            if (scalefac->s[j][sfbTemp] != 7)
453d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
454d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo);
455d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
456d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            else if (ms_stereo)
457d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
458d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
459d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
460d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
461d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }  /* for (; sfbTemp < 22; sfbTemp++) */
462d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
463d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    } /* for (j = 0; j < 3; j++) */
464d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
465d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* 1. long blocks up to sfb band 8: not intensity */
466d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* from 0 to sfb 8 ms_stereo or normal stereo */
467d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
468d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbStart = mp3_sfBandIndex[sfreq].l[8];
469d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
470d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    if (ms_stereo)
471d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
472d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        pvmp3_st_mid_side(xr, xl, 0, sfbStart);
473d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
474d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
475d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
476d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }  /* if (gr_info->mixed_block_flag) */
477d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else
478d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
479d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                /*
480d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                 * short block processing
481d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                 */
482d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (j = 0; j < 3; j++)
483d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
484d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 sfbcnt = -1;
485d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
486d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    for (sfb = 12; sfb >= 0; sfb--)
487d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
488d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
489d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
490d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
491d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        while (lines > 0)
492d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
493d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            if (xl[i])
494d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            {
495d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                sfbcnt = sfb;
496d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                sfb = -10;
497d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                lines = -10;
498d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            }
499d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            lines--;
500d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            i--;
501d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
502d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
503d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
504d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbcnt += 1;
505d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbTemp = sfbcnt;        /* for later use */
506d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
507d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* do normal stereo or MS stereo from 0 to sfbcnt */
508d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    for (sb = 0; sb < sfbcnt; sb++)
509d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
510d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbNo = mp3_sfBandIndex[sfreq].s[sb+1] - mp3_sfBandIndex[sfreq].s[sb];
511d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sb] + j * sfbNo;
512d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
513d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        if (ms_stereo)
514d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
515d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
516d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
517d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
518d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
519d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
520d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* from sfbcnt to last sfb do intensity stereo */
521d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    for (; sfbTemp < 13; sfbTemp++)
522d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
523d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */
524d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo;
525d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
526d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        if (scalefac->s[j][sfbTemp] != 7)
527d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
528d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo);
529d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
530d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        else if (ms_stereo)
531d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        {
532d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
533d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        }
534d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
535d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }  /* for (; sfbTemp < 22; sfbTemp++) */
536d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
537d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                } /* for (j = 0; j < 3; j++) */
538d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
539d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            } /* if( gr_info->mixed_block_flag) */
540d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
541d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
542d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
543d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
544d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
545d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
546d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /*
547d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             *   long block processing
548d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             */
549d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            i = 31;
550d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            ss = 17;
551d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sb = 0;
552d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
553d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            while (i >= 0)
554d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
555d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (xl[(i*FILTERBANK_BANDS) + ss] != 0)
556d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
557d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sb = (i << 4) + (i << 1) + ss;
558d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    i = -2;
559d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
560d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else
561d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
562d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    ss--;
563d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    if (ss < 0)
564d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
565d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        i--;
566d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        ss = 17;
567d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
568d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
569d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
570d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
571d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (sb)
572d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
573d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (mp3_sfBandIndex[sfreq].l[14] <= sb)
574d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
575d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfb = 14;
576d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
577d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else if (mp3_sfBandIndex[sfreq].l[7] <= sb)
578d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
579d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfb = 7;
580d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
581d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else
582d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
583d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfb = 0;
584d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
585d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
586d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
587d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                while (mp3_sfBandIndex[sfreq].l[sfb] <= sb)
588d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
589d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfb++;
590d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
591d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
592d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else
593d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
594d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (i == -1)
595d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
596d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /*  all xr[1][][] are 0: set IS bound sfb to 0  */
597d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfb = 0;
598d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
599d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else
600d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
601d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /*  xr[1][0][0] is unequal 0 and all others are 0: set IS bound sfb to 1 */
602d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfb = 1;
603d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
604d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
605d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
606d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sfbTemp = sfb;  /* save for later use */
607d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
608d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
609d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sfbStart = mp3_sfBandIndex[sfreq].l[sfb];
610d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
611d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /* from 0 to sfbStart ms_stereo or normal stereo */
612d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (ms_stereo)
613d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
614d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_st_mid_side(xr, xl, 0, sfbStart);
615d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
616d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
617d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /* now intensity stereo of the remaining sfb's: */
618d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            for (; sfb < 21; sfb++)
619d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
620d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                sfbStart = mp3_sfBandIndex[sfreq].l[sfb];
621d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* No of lines to process */
622d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
623d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (scalefac->l[sfb] != 7)
624d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
625d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    pvmp3_st_intensity(xr, xl, scalefac->l[sfb], sfbStart, sfbNo);
626d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
627d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else if (ms_stereo)
628d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
629d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
630d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
631d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
632d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }  /* for (; sfbTemp < 22; sfbTemp++) */
633d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
634d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
635d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
636d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sfbStart = mp3_sfBandIndex[sfreq].l[21];
637d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sfbNo = mp3_sfBandIndex[sfreq].l[22] - mp3_sfBandIndex[sfreq].l[21]; /* No of lines to process */
638d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
639d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (scalefac->l[21] != 7)
640d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
641d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (sfbTemp < 21)
642d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
643d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbTemp = scalefac->l[20];
644d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
645d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else
646d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
647d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    sfbTemp = 0;  /* if scalefac[20] is not an intensity position, is_pos = 0 */
648d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
649d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
650d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_st_intensity(xr, xl, sfbTemp, sfbStart, sfbNo);
651d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
652d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else if (ms_stereo)
653d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
654d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
655d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
656d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
657d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
658d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
659d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
660d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }  /* if (i_stereo)  */
661d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else
662d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
663d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /*
664d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         * normal or ms stereo processing
665d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         */
666d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (ms_stereo)
667d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
668d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
669d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pvmp3_st_mid_side(xr, xl, 0, used_freq_lines);
670d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
671d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
672d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
673d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    } /* if (i_stereo) */
674d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
675d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
676d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
677