pcm_utils: check pcm_convert()==0
It is illegal to pass an empty audio buffer around. pcm_resample() sometimes seems to result in 0 samples, maybe related to libsamplerate. To work around that problem, add special checks after both pcm_convert() invocations. Removed the pcm_resample()==0 checks from pcm_convert().
This commit is contained in:
parent
d2d11d70a8
commit
0d9d82a932
@ -249,6 +249,13 @@ decoder_data(struct decoder *decoder,
|
|||||||
length = pcm_convert(&dc.in_audio_format, _data,
|
length = pcm_convert(&dc.in_audio_format, _data,
|
||||||
length, &dc.out_audio_format,
|
length, &dc.out_audio_format,
|
||||||
data, &decoder->conv_state);
|
data, &decoder->conv_state);
|
||||||
|
|
||||||
|
/* under certain circumstances, pcm_convert() may
|
||||||
|
return an empty buffer - this condition should be
|
||||||
|
investigated further, but for now, do this check as
|
||||||
|
a workaround: */
|
||||||
|
if (length == 0)
|
||||||
|
return DECODE_COMMAND_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (replay_gain_info != NULL && (replay_gain_mode != REPLAY_GAIN_OFF))
|
if (replay_gain_info != NULL && (replay_gain_mode != REPLAY_GAIN_OFF))
|
||||||
|
@ -69,9 +69,17 @@ static void ao_play(struct audio_output *ao)
|
|||||||
|
|
||||||
assert(size > 0);
|
assert(size > 0);
|
||||||
|
|
||||||
if (!audio_format_equals(&ao->inAudioFormat, &ao->outAudioFormat))
|
if (!audio_format_equals(&ao->inAudioFormat, &ao->outAudioFormat)) {
|
||||||
convertAudioFormat(ao, &data, &size);
|
convertAudioFormat(ao, &data, &size);
|
||||||
|
|
||||||
|
/* under certain circumstances, pcm_convert() may
|
||||||
|
return an empty buffer - this condition should be
|
||||||
|
investigated further, but for now, do this check as
|
||||||
|
a workaround: */
|
||||||
|
if (size == 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ret = ao->plugin->play(ao->data, data, size);
|
ret = ao->plugin->play(ao->data, data, size);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ao->plugin->cancel(ao->data);
|
ao->plugin->cancel(ao->data);
|
||||||
|
@ -379,8 +379,6 @@ pcm_convert_16(const struct audio_format *src_format,
|
|||||||
dest_format->sample_rate,
|
dest_format->sample_rate,
|
||||||
dest_buffer, dest_size,
|
dest_buffer, dest_size,
|
||||||
&state->resample);
|
&state->resample);
|
||||||
if (len == 0)
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
@ -421,8 +419,6 @@ pcm_convert_24(const struct audio_format *src_format,
|
|||||||
dest_format->sample_rate,
|
dest_format->sample_rate,
|
||||||
(int32_t*)dest_buffer, dest_size,
|
(int32_t*)dest_buffer, dest_size,
|
||||||
&state->resample);
|
&state->resample);
|
||||||
if (len == 0)
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
Loading…
Reference in New Issue
Block a user