ecore audio: Fix loss of last stream

Summary:
pa_stream's write callback requires to size of stream data
using 'len' parameter.
This size depend on pulse audio's internal status and not
consistent.

When a efl read audio's last stream, length of read('bread')
is less than write callback's 'len' parameter.
If the gap between 'len' and 'bread' is small,
last stream is played fortunately.
Otherwise, the last stream is discarded.
(It is doubtful about pa_stream's pre-buffering.)

To prevent it, push silent stream which is amount
of deficient length.

@fix T5281

Reviewers: raster

Reviewed By: raster

Subscribers: cedric, jpeg, woohyun

Maniphest Tasks: T5281

Differential Revision: https://phab.enlightenment.org/D4726
This commit is contained in:
Jiwon Kim 2017-03-24 10:34:53 +09:00 committed by Carsten Haitzler (Rasterman)
parent 35a7e7ff18
commit 25fcdde356
1 changed files with 5 additions and 2 deletions

View File

@ -82,11 +82,14 @@ static void _write_cb(pa_stream *stream, size_t len, void *data)
bread = ecore_audio_obj_in_read(in, buf, wlen);
EPA_CALL(pa_stream_write)(stream, buf, bread, NULL, 0, PA_SEEK_RELATIVE);
if (bread < (int)len)
if ((bread < (int)len) && bread)
{
memset((char *)buf + bread, 0, wlen - bread);
EPA_CALL(pa_stream_write)(stream, buf, wlen, NULL, 0, PA_SEEK_RELATIVE);
EPA_CALL(pa_operation_unref)(EPA_CALL(pa_stream_trigger)(stream, NULL, NULL));
}
else
EPA_CALL(pa_stream_write)(stream, buf, bread, NULL, 0, PA_SEEK_RELATIVE);
}
static void _update_samplerate_cb(void *data EINA_UNUSED, const Efl_Event *event)