mirror of
https://github.com/team-infusion-developers/android_hardware_samsung.git
synced 2024-11-01 07:47:55 +00:00
audio: Do not segfault in out_get_presentation_position()
When a voice call is stopped we switch back to the default primary output (speaker). Then this function gets executed and as ther was no active PCM because voice_session is handling that it segfaults because the PCM is NULL. Change-Id: I927504b7962b096c0d4c3642b48aee55c85ec013
This commit is contained in:
parent
696959dda1
commit
d6359186ea
1 changed files with 24 additions and 13 deletions
|
@ -3086,27 +3086,38 @@ static int out_get_presentation_position(const struct audio_stream_out *stream,
|
|||
} else {
|
||||
/* FIXME: which device to read from? */
|
||||
if (!list_empty(&out->pcm_dev_list)) {
|
||||
struct pcm_device *pcm_device;
|
||||
struct listnode *node;
|
||||
unsigned int avail;
|
||||
struct pcm_device *pcm_device = node_to_item(list_head(&out->pcm_dev_list),
|
||||
struct pcm_device, stream_list_node);
|
||||
|
||||
if (pcm_get_htimestamp(pcm_device->pcm, &avail, timestamp) == 0) {
|
||||
size_t kernel_buffer_size = out->config.period_size * out->config.period_count;
|
||||
int64_t signed_frames = out->written - kernel_buffer_size + avail;
|
||||
/* This adjustment accounts for buffering after app processor.
|
||||
It is based on estimated DSP latency per use case, rather than exact. */
|
||||
signed_frames -=
|
||||
(render_latency(out->usecase) * out->sample_rate / 1000000LL);
|
||||
list_for_each(node, &out->pcm_dev_list) {
|
||||
pcm_device = node_to_item(node,
|
||||
struct pcm_device,
|
||||
stream_list_node);
|
||||
|
||||
/* It would be unusual for this value to be negative, but check just in case ... */
|
||||
if (signed_frames >= 0) {
|
||||
*frames = signed_frames;
|
||||
ret = 0;
|
||||
if (pcm_device->pcm != NULL) {
|
||||
if (pcm_get_htimestamp(pcm_device->pcm, &avail, timestamp) == 0) {
|
||||
size_t kernel_buffer_size = out->config.period_size * out->config.period_count;
|
||||
int64_t signed_frames = out->written - kernel_buffer_size + avail;
|
||||
/* This adjustment accounts for buffering after app processor.
|
||||
It is based on estimated DSP latency per use case, rather than exact. */
|
||||
signed_frames -=
|
||||
(render_latency(out->usecase) * out->sample_rate / 1000000LL);
|
||||
|
||||
/* It would be unusual for this value to be negative, but check just in case ... */
|
||||
if (signed_frames >= 0) {
|
||||
*frames = signed_frames;
|
||||
ret = 0;
|
||||
goto done;
|
||||
}
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
pthread_mutex_unlock(&out->lock);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in a new issue