summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJie Yang <yang.jie@intel.com>2013-09-24 10:23:01 +0800
committerZhang,Vivian <vivian.zhang@intel.com>2013-09-24 10:46:03 +0800
commit910afb49c71357e257683572867c13023e8e3f13 (patch)
tree3be71479b3419c8fb306d314a305d6a69a0f774e
parent808e332d85d6acc53ea80eeb655a1a1b95e0c6d4 (diff)
downloadgst-plugins-audio-hwdec-devel/audiohwdec.tar.gz
gst-plugins-audio-hwdec-devel/audiohwdec.tar.bz2
gst-plugins-audio-hwdec-devel/audiohwdec.zip
check the real written bytes, continue the rest bytes, to fix PLAYING-->PAUSED buffer data dropping issuedevel/audiohwdec
-rwxr-xr-xaudiohwdec/src/gsttinycompresssink.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/audiohwdec/src/gsttinycompresssink.c b/audiohwdec/src/gsttinycompresssink.c
index cb89845..8cd8ccf 100755
--- a/audiohwdec/src/gsttinycompresssink.c
+++ b/audiohwdec/src/gsttinycompresssink.c
@@ -587,7 +587,7 @@ gst_tinycompress_ringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
GstTinyCompressRingBuffer *tbuf;
gint bps;
gint64 payload_offset = 0;
- guint payload_len;
+ guint payload_len, written_bytes = 0;
gboolean open_ret;
const char encaped_fix_header[TINYCOMPRESSENCAP_FIXED_HEADER_SIZE] = TINYCOMPRESSENCAP_FIXED_HEADER;
@@ -638,10 +638,10 @@ gst_tinycompress_ringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
while (!tsink->priv->t_started) {
open_ret = tinycompress_start (tsink, tsink->priv->buff, tsink->priv->valid_buff_size);
- tinycompresssink_clear_buffer (tsink);
if (open_ret) {
GST_LOG_OBJECT (tsink, "now tinycompress device is started!");
+ tinycompresssink_clear_buffer (tsink);
break;
}
if (!tinycompresssink_fill_buffer (tsink, (data+payload_offset + payload_len - tsink->priv->pending_buff_size), tsink->priv->pending_buff_size))
@@ -651,11 +651,19 @@ gst_tinycompress_ringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
tsink->priv->valid_buff_size = tsink->priv->t_config.fragment_size;
while (tinycompresssink_fill_buffer (tsink, (data+payload_offset + payload_len - tsink->priv->pending_buff_size), tsink->priv->pending_buff_size)) {
- tinycompress_write (tsink, tsink->priv->buff, tsink->priv->valid_buff_size);
- tinycompresssink_clear_buffer (tsink);
- if (tsink->priv->need_to_drain) {
- tinycompress_drain (tsink);
- tsink->priv->need_to_drain = FALSE;
+ written_bytes = tinycompress_write (tsink, tsink->priv->buff, tsink->priv->valid_buff_size);
+ if (written_bytes != tsink->priv->valid_buff_size) {
+ /* writting abnormal, reset pending_buff_size, return the number of samples, maybe the writting is paused by status changing. return here then we can continue the rendering later. */
+ tsink->priv->pending_buff_size = 0;
+ GST_LOG_OBJECT (tsink, "only %d bytes are written to the devices!", written_bytes);
+ GST_TINYCOMPRESSSINK_UNLOCK (tsink);
+ return written_bytes / bps;
+ } else {
+ tinycompresssink_clear_buffer (tsink);
+ if (tsink->priv->need_to_drain) {
+ tinycompress_drain (tsink);
+ tsink->priv->need_to_drain = FALSE;
+ }
}
}
@@ -1041,7 +1049,7 @@ gst_tinycompresssink_flush_ringbuffer (GstTinyCompressSink * tsink)
tinycompress_write (tsink, tsink->priv->buff, tsink->priv->filled_buff_size);
tinycompresssink_clear_buffer (tsink);
- tsink->priv->need_to_drain = TRUE;
+ tsink->priv->need_to_drain = FALSE;
if (tsink->priv->need_to_drain) {
tinycompress_drain (tsink);
tsink->priv->need_to_drain = FALSE;
@@ -1573,6 +1581,7 @@ tinycompress_write(GstTinyCompressSink *tsink, gpointer data, guint length)
if (written < 0)
goto write_error;
+ GST_LOG_OBJECT (tsink, "Tinycompress finished write %d bytes to device!", written);
return written;
not_opened: