Skip to content

Commit b63c2db

Browse files
committed
aplay: fix resampler segfault
1 parent 39b4c1a commit b63c2db

File tree

2 files changed

+15
-17
lines changed

2 files changed

+15
-17
lines changed

.github/spellcheck-wordlist.txt

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ HUP
215215
ioplug
216216
IPHONEACCEV
217217
jas
218+
jitter
218219
keyp
219220
larc
220221
LEAdvertisement

utils/aplay/resampler.c

+14-17
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,12 @@ bool resampler_supports_input_format(snd_pcm_format_t format) {
8282
}
8383

8484
void resampler_delete(struct aplay_resampler *resampler) {
85-
if (resampler == NULL || resampler->src_state == NULL)
85+
if (resampler == NULL)
8686
return;
87-
src_delete(resampler->src_state);
88-
if (resampler->in_format != SND_PCM_FORMAT_FLOAT)
89-
free(resampler->in_buffer);
90-
if (resampler->out_format != SND_PCM_FORMAT_FLOAT)
91-
free(resampler->out_buffer);
87+
if (resampler->src_state != NULL)
88+
src_delete(resampler->src_state);
89+
free(resampler->in_buffer);
90+
free(resampler->out_buffer);
9291
free(resampler);
9392
}
9493

@@ -150,7 +149,7 @@ struct aplay_resampler *resampler_create(
150149
}
151150

152151
int resampler_process(struct aplay_resampler *resampler, ffb_t *in, ffb_t *out) {
153-
int error = 0;
152+
int err = 0;
154153
SRC_DATA *src_data = &resampler->src_data;
155154
snd_pcm_uframes_t frames_used = 0;
156155

@@ -160,6 +159,7 @@ int resampler_process(struct aplay_resampler *resampler, ffb_t *in, ffb_t *out)
160159
size_t max_in_samples = out_samples / resampler->src_data.src_ratio;
161160

162161
size_t in_samples = MIN(ffb_len_out(in), max_in_samples);
162+
163163
if (resampler->in_format == SND_PCM_FORMAT_S16) {
164164
in_samples = MIN(in_samples, resampler->max_frames * resampler->channels);
165165
src_short_to_float_array(in->data, resampler->in_buffer, in_samples);
@@ -175,19 +175,16 @@ int resampler_process(struct aplay_resampler *resampler, ffb_t *in, ffb_t *out)
175175
}
176176
src_data->input_frames = in_samples / resampler->channels;
177177

178-
if (resampler->out_format == SND_PCM_FORMAT_FLOAT) {
178+
if (resampler->out_format == SND_PCM_FORMAT_FLOAT)
179179
src_data->data_out = out->tail;
180-
src_data->output_frames = out_samples / resampler->channels;
181-
}
182-
else {
180+
else
183181
src_data->data_out = resampler->out_buffer;
184-
src_data->output_frames = resampler->max_frames / resampler->channels;
185-
}
182+
src_data->output_frames = out_samples / resampler->channels;
186183

187184
while (true) {
188-
if ((error = src_process(resampler->src_state, src_data)) != 0) {
189-
error("Resampler failed: %s", src_strerror(error));
190-
return error;
185+
if ((err = src_process(resampler->src_state, src_data)) != 0) {
186+
error("Resampler failed: %s", src_strerror(err));
187+
return err;
191188
}
192189
if (src_data->output_frames_gen == 0)
193190
break;
@@ -206,7 +203,7 @@ int resampler_process(struct aplay_resampler *resampler, ffb_t *in, ffb_t *out)
206203
}
207204
ffb_shift(in, frames_used * resampler->channels);
208205

209-
return error;
206+
return err;
210207
}
211208

212209
/**

0 commit comments

Comments
 (0)