@@ -32,9 +32,7 @@ static void linear_close (SRC_STATE *state) ;
32
32
33
33
typedef struct
34
34
{ int linear_magic_marker ;
35
- bool dirty ;
36
- long in_count , in_used ;
37
- long out_count , out_gen ;
35
+ bool initialized ;
38
36
float * last_value ;
39
37
} LINEAR_DATA ;
40
38
@@ -54,7 +52,6 @@ static SRC_ERROR
54
52
linear_vari_process (SRC_STATE * state , SRC_DATA * data )
55
53
{ LINEAR_DATA * priv ;
56
54
double src_ratio , input_index , rem ;
57
- int ch ;
58
55
59
56
if (data -> input_frames <= 0 )
60
57
return SRC_ERR_NO_ERROR ;
@@ -64,16 +61,14 @@ linear_vari_process (SRC_STATE *state, SRC_DATA *data)
64
61
65
62
priv = (LINEAR_DATA * ) state -> private_data ;
66
63
67
- if (!priv -> dirty )
64
+ if (!priv -> initialized )
68
65
{ /* If we have just been reset, set the last_value data. */
69
- for (ch = 0 ; ch < state -> channels ; ch ++ )
66
+ for (int ch = 0 ; ch < state -> channels ; ch ++ )
70
67
priv -> last_value [ch ] = data -> data_in [ch ] ;
71
- priv -> dirty = true ;
68
+ priv -> initialized = true ;
72
69
} ;
73
70
74
- priv -> in_count = data -> input_frames * state -> channels ;
75
- priv -> out_count = data -> output_frames * state -> channels ;
76
- priv -> in_used = priv -> out_gen = 0 ;
71
+ data -> input_frames_used = data -> output_frames_gen = 0 ;
77
72
78
73
src_ratio = state -> last_ratio ;
79
74
@@ -83,72 +78,70 @@ linear_vari_process (SRC_STATE *state, SRC_DATA *data)
83
78
input_index = state -> last_position ;
84
79
85
80
/* Calculate samples before first sample in input array. */
86
- while (input_index < 1.0 && priv -> out_gen < priv -> out_count )
81
+ float * current_out = data -> data_out ;
82
+ while (input_index < 1.0 && data -> output_frames_gen < data -> output_frames )
87
83
{
88
- if (priv -> in_used + state -> channels * ( 1.0 + input_index ) >= priv -> in_count )
89
- break ;
84
+ if (data -> output_frames > 0 && fabs ( state -> last_ratio - data -> src_ratio ) > SRC_MIN_RATIO_DIFF )
85
+ src_ratio = state -> last_ratio + data -> output_frames_gen * ( data -> src_ratio - state -> last_ratio ) / data -> output_frames ;
90
86
91
- if (priv -> out_count > 0 && fabs (state -> last_ratio - data -> src_ratio ) > SRC_MIN_RATIO_DIFF )
92
- src_ratio = state -> last_ratio + priv -> out_gen * (data -> src_ratio - state -> last_ratio ) / priv -> out_count ;
93
-
94
- for (ch = 0 ; ch < state -> channels ; ch ++ )
95
- { data -> data_out [priv -> out_gen ] = (float ) (priv -> last_value [ch ] + input_index *
87
+ for (int ch = 0 ; ch < state -> channels ; ch ++ )
88
+ { * current_out ++ = (float ) (priv -> last_value [ch ] + input_index *
96
89
((double ) data -> data_in [ch ] - priv -> last_value [ch ])) ;
97
- priv -> out_gen ++ ;
98
90
} ;
91
+ data -> output_frames_gen ++ ;
99
92
100
93
/* Figure out the next index. */
101
94
input_index += 1.0 / src_ratio ;
102
95
} ;
103
96
104
97
rem = fmod_one (input_index ) ;
105
- priv -> in_used += state -> channels * psf_lrint (input_index - rem ) ;
98
+ data -> input_frames_used += psf_lrint (input_index - rem ) ;
106
99
input_index = rem ;
107
100
108
101
/* Main processing loop. */
109
- while (priv -> out_gen < priv -> out_count && priv -> in_used + state -> channels * input_index < priv -> in_count )
110
- {
111
- if (priv -> out_count > 0 && fabs (state -> last_ratio - data -> src_ratio ) > SRC_MIN_RATIO_DIFF )
112
- src_ratio = state -> last_ratio + priv -> out_gen * (data -> src_ratio - state -> last_ratio ) / priv -> out_count ;
113
-
114
102
#if SRC_DEBUG
115
- if (priv -> in_used < state -> channels && input_index < 1.0 )
116
- { printf ("Whoops!!!! in_used : %ld channels : %d input_index : %f\n" , priv -> in_used , state -> channels , input_index ) ;
117
- exit (1 ) ;
118
- } ;
103
+ assert (data -> output_frames_gen >= data -> output_frames || data -> input_frames_used > 0 );
119
104
#endif
105
+ while (data -> output_frames_gen < data -> output_frames && data -> input_frames_used + input_index < data -> input_frames )
106
+ {
107
+ if (data -> output_frames > 0 && fabs (state -> last_ratio - data -> src_ratio ) > SRC_MIN_RATIO_DIFF )
108
+ src_ratio = state -> last_ratio + data -> output_frames_gen * (data -> src_ratio - state -> last_ratio ) / data -> output_frames ;
120
109
121
- for (ch = 0 ; ch < state -> channels ; ch ++ )
122
- { data -> data_out [priv -> out_gen ] = (float ) (data -> data_in [priv -> in_used - state -> channels + ch ] + input_index *
123
- ((double ) data -> data_in [priv -> in_used + ch ] - data -> data_in [priv -> in_used - state -> channels + ch ])) ;
124
- priv -> out_gen ++ ;
125
- } ;
110
+ const float * current_in = data -> data_in + data -> input_frames_used * state -> channels ;
111
+ const float * prev_in = current_in - state -> channels ;
112
+ for (int ch = 0 ; ch < state -> channels ; ch ++ )
113
+ {
114
+ * current_out ++ = (float ) (prev_in [ch ] + input_index *
115
+ ((double ) current_in [ch ] - prev_in [ch ])) ;
116
+ }
117
+ data -> output_frames_gen ++ ;
126
118
127
119
/* Figure out the next index. */
128
120
input_index += 1.0 / src_ratio ;
129
121
rem = fmod_one (input_index ) ;
130
122
131
- priv -> in_used += state -> channels * psf_lrint (input_index - rem ) ;
123
+ const int num_frame_used = psf_lrint (input_index - rem );
124
+ data -> input_frames_used += num_frame_used ;
132
125
input_index = rem ;
133
- } ;
126
+ }
134
127
135
- if (priv -> in_used > priv -> in_count )
136
- { input_index += (priv -> in_used - priv -> in_count ) / state -> channels ;
137
- priv -> in_used = priv -> in_count ;
138
- } ;
128
+ if (data -> input_frames_used > data -> input_frames )
129
+ {
130
+ input_index += (data -> input_frames_used - data -> input_frames ) ;
131
+ data -> input_frames_used = data -> input_frames ;
132
+ }
139
133
140
134
state -> last_position = input_index ;
141
135
142
- if (priv -> in_used > 0 )
143
- for (ch = 0 ; ch < state -> channels ; ch ++ )
144
- priv -> last_value [ch ] = data -> data_in [priv -> in_used - state -> channels + ch ] ;
136
+ if (data -> input_frames_used > 0 ) {
137
+ const float * last_value = data -> data_in + (data -> input_frames_used - 1 ) * state -> channels ;
138
+ for (int ch = 0 ; ch < state -> channels ; ch ++ )
139
+ priv -> last_value [ch ] = last_value [ch ];
140
+ }
145
141
146
142
/* Save current ratio rather then target ratio. */
147
143
state -> last_ratio = src_ratio ;
148
144
149
- data -> input_frames_used = priv -> in_used / state -> channels ;
150
- data -> output_frames_gen = priv -> out_gen / state -> channels ;
151
-
152
145
return SRC_ERR_NO_ERROR ;
153
146
} /* linear_vari_process */
154
147
@@ -237,7 +230,7 @@ linear_reset (SRC_STATE *state)
237
230
if (priv == NULL )
238
231
return ;
239
232
240
- priv -> dirty = false ;
233
+ priv -> initialized = false ;
241
234
memset (priv -> last_value , 0 , sizeof (priv -> last_value [0 ]) * state -> channels ) ;
242
235
243
236
return ;
0 commit comments